我使用Hibernate 3.6.9与Atomikos和Spring 3.1。在阅读Where does the @Transactional annotation belong?之后,我已经从所有DAO中删除了@Transactional注释,并且我只将它们留在了Service上。在任何DAO DB操作删除这些注释后,我收到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的交易,我怎么能使用Service之外的DAO?解决这个问题的唯一方法是在任何使用daos的层中启动transactionsy(Transactional with propagation requires_new)?但是,当使用DAO Transactional时,我遇到了懒惰初始化异常(事务在表示层之前关闭 - 尝试初始化实体字段)。
编辑:
我应该如何管理交易时,Spring MVC的控制器可以直接访问DAO?控制器应该交易吗?
我的问题也出现在登录过程中,因为spring安全使用dao(没有@Transactional),所以没有层开始事务?
将@Transactional添加到例如春季安全使用的daos解决了这个问题 - >当@Transactional一切正常时,但不能在没有这个注释的情况下使用db。但是,将@Transactional添加到某些DAO会带来一些问题,因为当spring mvc想要显示一些数据时,会出现延迟初始化异常,然后在dao中只有手动Hibernate.initialize工作(因为最后@Transactional在表示层之前关闭事务!)。
我猜想问题在于您的服务上的@Transaction注释未考虑在内。 - 请使用transation注释发布其中一种服务方法,以及使用调用该方法的statment的方法以及启用事务注释支持的配置部分。 – Ralph 2011-12-31 13:20:35
@Ralph我已经提出了我的问题。 – mmatloka 2011-12-31 13:42:04