JPA中RESOURCE_LOCAL与JTA事务控制策略的比较

本文详细介绍了JPA中两种事务控制策略:RESOURCE_LOCAL和JTA。RESOURCE_LOCAL模式下,应用程序负责创建和管理EntityManager;而JTA模式则由容器负责EntityManager的创建和管理。文章还探讨了在使用Spring的情况下如何通过@PersistenceContext注解注入EntityManager。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.RESOURCE_LOCAL事务控制策略模式

将persistence.xml按照如下方式配置,会使用RESOURCE_LOCAL的事务控制策略,在这种策略模式下,应用程序自身要负责创建和管理EntityManager。

<persistence-unit transaction-type="RESOURCE_LOCAL">
这种模式的特点:
  • 应用程序自身通过EntityManagerFactory来创建EntityManager
  • 创建的EntityManager实例就是一个持久化上下文
  • 只能通过@PersistenceUnit注解注入一个EntityManagerFactory,而不能通过@PersistenceContex注解
  • 不能通过@PersistenceContex注解关联到一个RESOURCE_LOCAL类型的持久化单元
  • 需要通过EntityTransaction API进行事务的操作,如通过EntityManager.getTransaction.begin()方法开启事务,通过EntityManager.getTransaction.begin().commit()提交事务
  • 每次调用EntityManagerFactory.createEntityManager() 的时候,都会创建一个独立的EntityManager,同样也会产生一个独立的持久化上下文(PersistenceContext)

2.JTA事务控制策略模式

将persistence.xml按照如下方式配置,即是使用JTA的事务控制策略,在这种策略模式下,由容器负责EntityManager的创建和管理。

<persistence-unit transaction-type="JTA">

这种模式的特点:

  • 应用不能通过EntityManagerFactory创建EntityManager,而应该通过容器获得EntityManager
  • EntityManager只能通过@PersistenceContex注解进行注入,不能通过@PersistenceUnit注解关联到一个JTA类型的持久化单元
  • 通过容器获得的EntityManger都是一个与JTA实务相关的持久化上下文的引用
  • 在同一事务下,每一个关联到相同持久化单元的EntityManger,都会自动获得同一个持久化上下文(PersistenceContext)的引用
  • 在JTA事务提交时,持久化上下文(PersistenceContext)会将实体与数据库同步

3.需要特别说明的一点

如果系统中使用了spring来进行持久化的管理,可以在RESOURCE_LOCAL模式下通过@PersistenceContext注解注入EntityManager,这种情况下,spring容器会通过@Transactional注解进行事务管理

转载于:https://my.oschina.net/JasonZhang/blog/539800

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值