Я использую Hibernate 3.6.9 с Atomikos и Spring 3.1. После прочтения Куда относится аннотация @Transactional? я удалил аннотации @Transactional из все DAO, и я оставил их только на сервисе. После удаления этих аннотаций в любой операции dao db я получаю
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 вне Сервиса? Единственный способ решить эту проблему — запускать транзакции вручную (транзакционные с распространением require_new) на любом уровне, использующем daos? Однако при использовании Transactional с DAO я столкнулся с проблемами отложенных исключений инициализации (транзакция закрывается до уровня представления - пытается инициализировать поля сущности).
Редактировать:
Как мне управлять транзакциями, когда контроллер Spring MVC может напрямую обращаться к DAO? Должен ли контроллер быть транзакционным?
Моя проблема также возникает во время процесса входа в систему, потому что Spring Security использует dao (без @Transactional), поэтому ни один уровень не запускает транзакцию?
Добавление @Transactional, например. daos, используемый Spring Security, решает проблему -> когда есть @Transactional, все работает, но невозможно использовать db без этих аннотаций. Но добавление @Transactional к некоторым DAO вызывает проблемы, потому что, когда spring mvc хочет отобразить некоторые данные, появляется исключение ленивой инициализации, а затем работает только ручной Hibernate.initialize в dao (поскольку последний @Transactional закрывает транзакцию перед уровнем представления!).