【问题标题】:Issue with Multiple Hibernate Transaction Manager多个休眠事务管理器的问题
【发布时间】:2014-08-25 10:53:07
【问题描述】:

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

有什么办法可以同时启用这两个事务管理器吗?

【问题讨论】:

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


    【解决方案1】:

    服务正在使用 txManager

    @Transactional(value="txManager") 
    

    该服务正在调用存储库或 dao,也必须属于或在服务事务中运行。您必须执行以下操作:

    @Transactional(value="txManager" propagation = Propagation.MANDATORY) 
    

    为什么是Propagation.MANDATORY?为什么不Propagation.REQUIRED?或者只是

    @Transactional(value="txManager") 
    

    由于默认使用 Propagation.REQUIRED。

    顺便说一句,如果您的 @Transactional 服务将与 txManagertransactionManager 一起使用,请考虑仅使用 @Transactional

    【讨论】:

    • 这行得通!我将事务管理器限定符添加到 DAO 层,它就像一个魅力。 Propagation.Required 停止绕过服务层调用 DAO 层。这实际上是一个很好的做法。
    • 有趣,我的 DAO 方法总是带有“必需”,只有复杂用例的服务是“REQUIRES_NEW”,通常它们也是“必需”。当然,每个要求都是不同的。
    猜你喜欢
    • 2017-05-09
    • 2011-11-16
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多