多个Hibernate事务管理器的问题

时间:2014-07-04 07:09:43

标签: transactions annotations spring-3 sessionfactory hibernate-4.x

我正在使用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) 

是否可以采取任何措施来启用两个事务管理器?

1 个答案:

答案 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