JPA多个事务管理器

JPA多个事务管理器,第1张

JPA多个事务管理器

我猜你有两个选择

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

<bean id="firstRealService" /><bean id="firstService"      >    <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的状态:

该事务管理器适用于使用单个JPA
EntityManagerFactory进行事务数据访问的应用程序。要访问同一事务中的多个事务资源,必须使用JTA(通常通过JtaTransactionManager)。请注意,您需要相应地配置JPA提供程序,以使其参与JTA事务。

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

<tx:annotation-driven transaction-manager="txManager"/><bean id="txManager"     >    <property name="transactionManagerName" value="appserver/jndi/path" /></bean>

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

至于配置Jpa持久性提供程序,我并不那么熟悉。您正在使用哪个JPA持久性提供程序?

上面的代码基于我们的方法,我们使用的是本地Hibernate,而不是Hibernate的JPA实现。在这种情况下,我们可以摆脱两个HibernateTransactionManager
bean,只需确保两个SessionFactories都注入了相同的JTA TM,然后使用tx:annotation-driven元素。

希望这可以帮助



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5615825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存