java - JPA 多事务管理器

标签 java spring orm jpa transactions

我有一个 applicationContext.xml 文件,它在 Spring 中间件自定义应用程序中配置了两个 org.springframework.orm.jpa.JpaTransactionManager(每个都有自己的持久性单元,不同的数据库)。

我想使用基于注解的事务(@Transactional),而不是搞乱事务状态提交、保存和回滚。

一位同事提到,当有多个事务管理器时,即使上下文文件设置正确(引用转到正确的持久性单元),也会感到困惑。 有人见过问题吗?


在您的配置中,您会有两个事务管理器吗? 你有 txManager1 和 txManager2 吗?

这就是我在 JPA 中所拥有的,两个不同的 Spring bean 是事务管理器。

最佳答案

我猜你有两个选择

如果您的用例从不需要在同一事务中更新两个数据库,那么您可以使用两个 JpaTransactionManager,但我不确定您是否能够使用 @Transactional 方法?在这种情况下,您需要回退到使用简单 TransactionProxyFactoryBean 的旧机制。定义事务边界,例如:

<bean id="firstRealService" class="com.acme.FirstServiceImpl"/>
<bean id="firstService"  
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="firstJpaTm"/>
    <property name="target" ref="firstRealService"/>
    <property name="transactionAttributes">
        <props>
           <prop key="insert*">PROPAGATION_REQUIRED</prop>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>
<!-- similar for your second service -->

如果您需要跨两个数据库的事务,那么您将需要使用 JTA 事务管理器。 API状态:

This transaction manager is appropriate for applications that use a single JPA EntityManagerFactory for transactional data access. JTA (usually through JtaTransactionManager) is necessary for accessing multiple transactional resources within the same transaction. Note that you need to configure your JPA provider accordingly in order to make it participate in JTA transactions.

这意味着您需要提供一个 JTA 事务管理器。在我们的应用程序中,我们使用类似于以下的配置:

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManagerName" value="appserver/jndi/path" />
</bean>

如果您在应用服务器中进行部署,那么 spring JtaTransactionManager 需要对应用服务器提供的真正符合 XA 的 JTA 事务管理器进行查找。但是,您也可以使用独立的 JTA 事务管理器(但我自己还没有尝试过)

关于配置 Jpa 持久化提供程序,我不是很熟悉。您使用的是什么 JPA 持久性提供程序?

上面的代码基于我们的方法,我们使用的是 native Hibernate,而不是 Hibernate 的 JPA 实现。在这种情况下,我们能够摆脱两个 HibernateTransactionManager bean,并简单地确保两个 SessionFactories 都注入(inject)了​​相同的 JTA TM,然后使用 tx:annotation-driven 元素。

希望对你有帮助

关于java - JPA 多事务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75700/

相关文章:

java - Java运行时环境检测到 fatal error :SIGSEGV,libjvm

java - 如何使用 jpa 规范向子查询添加和构建动态谓词?

java - 属性未从 View 发送到 Controller

java - 与 JPA OneToMany 映射的只读关联

java - 在 Java 中使用泛型解码 XML

java - FreeMarker 可以将目录内容写入模板吗?

java - 在外部类的构造函数中实例化内部类是否危险? ( java )

Java Spring Controller 断点和 JUnit

json - Sequelize : How to return relationships as JSON attribute?

php - 领域驱动设计和 ORM 限制