我正在使用Spring 3.2.5.Release和Hibernate 4.2.7.Final。我正在Websphere 7服务器上部署我的耳朵。我有两个应用程序上下文文件,每个文件都有自己的类型为
的sessionFactory <bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">....</bean>
<bean id="sessionFactory1"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="true">... </bean>
问题在于多个HibernateTransactionManager。我将两个事务管理器定义为
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<qualifier value="transactionManager"/>
</bean>
和
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory1" />
<qualifier value="txManager"/>
</bean>
在我提到的其中一个上下文文件中
<tx:annotation-driven/>
<bean
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
但是,在此代码的运行时,
loggingManager.persistLog(loadLog); // using txManager
.....
persistenceService.persist(dataEntity); // using transactionManager
我得到以下异常
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
请注意,第一笔交易是成功的。我看到为loadLog生成的id。我用
注释了我的服务图层 @Transactional(value="txManager") // with respective transaction manager
我的DAO图层
@Transactional(propagation = Propagation.MANDATORY)
是否可以采取任何措施来启用两个事务管理器?
答案 0 :(得分:1)
该服务正在使用 txManager
@Transactional(value="txManager")
该服务正在调用存储库或dao,它也必须属于或在服务事务中运行。您必须执行以下操作:
@Transactional(value="txManager" propagation = Propagation.MANDATORY)
为什么 Propagation.MANDATORY ?为什么不 Propagation.REQUIRED ?或者只是
@Transactional(value="txManager")
默认情况下使用Propagation.REQUIRED。
如果您的@Transactional服务与 txManager 或 transactionManager
一起使用,BTW会考虑仅使用@Transactional