持久性单元作为RESOURCE_LOCAL或JTA?

我有如下查询:

  1. 这两者有什么不同?
  2. 这两个都支持所有的数据库?
  3. JPA TransactionManager和JTA TransactionManager是不同的?

JPA实现可以select自己pipe理事务( RESOURCE_LOCAL ),或者由应用程序服务器的JTA实现来pipe理事务。

在大多数情况下,RESOURCE_LOCAL没问题。 这将使用基本的JDBC级事务。 缺点是事务对JPA持久性单元是本地的,所以如果你想要一个跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好。

JTA还用于pipe理像JMS和JCA这样的系统上的事务,但对于我们大多数人来说,这是相当奇特的用法。

要使用JTA,需要在应用程序服务器中支持它,并且还需要JDBC驱动程序的支持。

作为其他答案的补充

下面是一篇非常有用的文章(发布在Apache TomEE网站上)的摘录 ,这也可以帮助解答OP的第一个问题(文章链接如下)。


比较RESOURCE_LOCAL和JTA持久性上下文


使用<persistence-unit transaction-type =“RESOURCE_LOCAL”> 负责EntityManager(PersistenceContext / Cache)的创build和跟踪…

  • 必须使用EntityManagerFactory来获取一个EntityManager
  • 得到的EntityManager实例一个PersistenceContext / Cache
  • EntityManagerFactory只能通过@PersistenceUnit注解注入(而不是@PersistenceContext)
  • 您不允许使用@PersistenceContext来引用RESOURCE_LOCALtypes的单位
  • 必须使用EntityTransaction API来开始/提交对EntityManger的每个调用
  • 调用entityManagerFactory.createEntityManager()两次会产生两个单独的EntityManager实例,因此有两个独立的PersistenceContexts / Caches。
  • 使用EntityManager的多个实例 几乎不是一个好主意(除非已经销毁了第一个实例 ,否则不要创build第二个实例

使用<persistence-unit transaction-type =“JTA”> CONTAINER将执行EntityManager(PersistenceContext / Cache)创build和跟踪…

  • 不能使用EntityManagerFactory来获取EntityManager
  • 你只能得到一个由容器提供的EntityManager
  • 一个EntityManager只能通过@PersistenceContext注解注入(而不是@PersistenceUnit)
  • 您不允许使用@PersistenceUnit来引用JTAtypes的单元
  • 容器给出的EntityManager与JTA事务关联的PersistenceContext / Cache的引用
  • 如果没有正在进行的JTA事务, 则不能使用 EntityManager,因为没有PersistenceContext / Cache。
  • 每个在同一个事务中使用EntityManager引用同一个单元的人都会自动引用同一个PersistenceContext / Cache
  • PersistenceContext / Cache在JTA 提交时被刷新并清除

任何有兴趣学习Java持久性API的人 – 请自己来帮忙,并阅读完整的文章: JPA概念:JPA 101 。

Resource_Local和JTA是事务pipe理器(进行事务的方法)。 这不是数据库的属性,而是负责协调事务的组件。 JPA和JTA交易pipe理者是不同的。 JPA事务pipe理器负责JPA事务,如果您只是在执行JPA事务,您希望使用JPA事务。 JTA事务pipe理器是通用事务pipe理器,可以在事务中引入其他资源,例如JMS队列。 通常,Java EE容器为EJB,JPA实体等使用JTA事务pipe理器。