我正在使用带有 Atomikos 和 Spring 3.1 的 Hibernate 3.6.9。看完@Transactional注解属于哪里?我已经从所有 DAO 中删除了 @Transactional 注释,并且只将它们留在了 Service 中。在我收到的任何 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 的事务,以及如何在 Service 之外使用 DAO?解决此问题的唯一方法是在使用 daos 的任何层中手动启动事务(具有传播需要新的事务)?但是,在将事务与 DAO 一起使用时,我遇到了延迟初始化异常的问题(事务在表示层之前关闭 - 尝试初始化实体字段)。
编辑:
当spring mvc的控制器可以直接访问DAO时我应该如何管理事务?控制器应该是事务性的吗?
我的问题在登录过程中也出现了,因为spring security使用dao(没有@Transactional)所以没有层启动事务?
将@Transactional 添加到spring security 使用的例如daos 可以解决问题-> 当有@Transactional 时一切正常,但是如果没有此注释,则无法使用db。但是给一些DAO加上@Transactional会带来问题,因为spring mvc要显示一些数据的时候会出现延迟初始化异常,然后dao中只有手动Hibernate.initialize起作用(因为最后@Transactional在表现层之前关闭事务!)。