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

1.RESOURCE_LOCAL事务控制策略模式

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

<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">

这种模式的特色: spa

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

3.须要特别说明的一点

若是系统中使用了spring来进行持久化的管理,能够在RESOURCE_LOCAL模式下经过@PersistenceContext注解注入EntityManager,这种状况下,spring容器会经过@Transactional注解进行事务管理 code

相关文章
相关标签/搜索