当前位置:  开发笔记 > 编程语言 > 正文

JPA多个交易经理

如何解决《JPA多个交易经理》经验,为你挑选了1个好方法。

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

我想使用基于注释的事务(@Transactional),不要乱用TransactionStatus提交,保存和回滚.

一位同事提到,当有多个事务管理器时,即使正确配置了上下文文件(引用转到正确的持久性单元),有些事情会让人感到困惑.任何人都会看到问题吗?


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

这就是我对JPA的看法,两个不同的Spring bean是事务管理器.



1> toolkit..:

我想你有两个选择

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



    
    
    
        
           PROPAGATION_REQUIRED
           PROPAGATION_REQUIRED
           PROPAGATION_REQUIRED,readOnly
        
    


如果您需要跨两个数据库的事务,则需要使用JTA事务管理器.该API的状态:

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

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




    

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

至于配置Jpa持久性提供程序,我不是那么熟悉.您使用的JPA持久性提供程序是什么?

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

希望这可以帮助

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有