【发布时间】:2011-12-31 13:00:08
【问题描述】:
我正在使用带有 Atomikos 和 Spring 3.1 的 Hibernate 3.6.9。在阅读Where does the @Transactional annotation belong? 之后,我已经从所有 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在表现层之前关闭事务!)。
【问题讨论】:
-
我猜问题是您的服务上的@Transaction 注解没有被考虑在内。 -- 请发布带有事务注释的服务方法之一,以及带有调用该方法的语句的方法和启用事务注释支持的配置部分。
-
@Ralph 我已经扩展了我的问题。
标签: hibernate spring transactions jta atomikos