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