EntityManager внедряется Spring, но ноль при первом использовании - PullRequest
0 голосов
/ 06 октября 2011

Я просто работаю над базовым веб-приложением, которое реализует Spring + Hibernate EntityManager

Я настроил свой дао и контекст точно так, как описано в этом посте: http://blog.springsource.com/2006/08/07/using-jpa-in-spring-without-referencing-spring/

И создал для него тест, как показано здесь: http://lstierneyltd.com/blog/development/examples/unit-testing-spring-apps-with-runwithspringjunit4classrunner-class/

По какой-то причине, когда я пытаюсь получить доступ к диспетчеру сущностей для создания запроса, он пуст.

Однако, из установки точки останова внутри метода установки для управления данными, я вижу, что Spring правильно вводит ее, и поле инициализируется.

Есть ли какие-либо подсказки относительно того, почему объектный менеджер может быть аннулирован после возвращения установщика?

Edit: Код дао, где я устанавливаю точку останова:

public class ProductDaoImpl implements ProductDao {

private EntityManager entityManager;

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
    this. entityManager = entityManager;
}

public Collection loadProductsByCategory(String category) {
    return entityManager.createQuery("from Product p where p.category = :category")
        .setParameter("category", category).getResultList();
}
}

1 Ответ

0 голосов
/ 07 октября 2011

<tx:annotation-driven/>, который, как я полагаю, у вас есть, говорит Spring, чтобы он помещал рекомендации по транзакциям в любой класс или метод, в котором есть примечание @Transactional.

Транзакции должны быть определены в Service / Businessслой, следовательно, ваш ProductDaoImpl обычно вызывается из службы, которая будет иметь @Transactional.например,

pubic class ProductService {

    @Resource(...)   // inject it the way you like e.g. @Autowired / Setter / Constructor injection, etc..
    ProductDao yourProductDao;

    @Transactional
    public List<Product> findCarProducts {
        yourProductDao.loadProductsByCategory( "car" );
    }
}

(в качестве альтернативы вы можете использовать конфигурацию транзакции на основе XML)

Теперь фактический вызов вашей DAO будет within транзакция =>что очень важно для entityManager / Hibernate Session.В противном случае вы увидите все обычные ошибки: например, entityManager имеет значение null, entityManager закрыт и т. Д.

Если вы хотите протестировать DAO в одиночку, вы должны убедиться, что ваш тестовый примерзаключен в транзакцию через @TransactionConfiguration.Например, если ваш компонент управления транзакциями определен как:

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

Ваш тест DAO будет включать это имя компонента:

@ContextConfiguration
@TransactionConfiguration(transactionManager="txManager", defaultRollback=false)
public class ProductDaoTransactionalTests {
    // your use cases here..
}

Подробнее о тестах транзакций можно прочитать в Весенняя документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...