<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..
}
Подробнее о тестах транзакций можно прочитать в Весенняя документация