Я использую Hibernate 3.6.9 с Atomikos и Spring 3.1. После прочтения Where does the @Transactional annotation belong? Я удалил аннотации @Transactional из всех DAO, и я оставил их только на службе. После удаления этих аннотаций на любой операции дао дб я получаюИспользование транзакций в DAO
org.hibernate.HibernateException: Unable to locate current JTA transaction
Моя конфигурация:
<tx:annotation-driven transaction-manager="jtaTransactionManager" />
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- when close is called, should we force transactions to terminate or
not? -->
<property name="forceShutdown" value="false" />
</bean>
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
сессии Свойства фабрики:
<prop key="hibernate.connection.isolation">3</prop>
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
Как следует управлять сделок DAO, и как я могу использовать DAO за пределами Сервиса? Единственный способ решить эту проблему для запуска транзакций вручную (Transactional с распространением require_new) на любом уровне, использующем daos? Однако при использовании Transactional с DAO я столкнулся с проблемами с ленивыми исключениями инициализации (транзакция закрыта до уровня представления - пытается инициализировать поля объекта).
Edit:
Как я должен управлять транзакциями, когда контроллер Spring MVC может получить доступ непосредственно DAO? Должен ли контроллер быть транзакционным?
Моя проблема также появляется во время процесса входа в систему, поскольку весенняя безопасность использует dao (без @Transactional), поэтому ни один уровень не начинает транзакцию?
Добавление @Transactional, например. daos, используемый весной безопасности, решает проблему -> когда есть @Transactional, все работает, но невозможно использовать db без этих аннотаций. Но добавление @Transactional к некоторым DAO приводит к проблемам, потому что когда весна mvc хочет отобразить некоторые данные, появляется ленивое исключение инициализации, а затем работает только ручной Hibernate.initialize в dao (потому что последний @Transactional закрывает транзакцию перед слоем представления!).
Я думаю, проблема в том, что @Transaction Annotation на ваши услуги не учитывается. - Пожалуйста, разместите один из методов обслуживания с аннотацией трансации, а также метод со статусом, который вызывает метод и часть конфигурации, которая позволяет поддерживать транзакционную аннотацию. – Ralph
@Ralph Я расширил свой вопрос. – mmatloka