我的查询如下:
答案 0 :(得分:93)
JPA实现可以选择自己管理事务(RESOURCE_LOCAL
),或者让它们由应用服务器的JTA实现管理。
在大多数情况下,RESOURCE_LOCAL很好。这将使用基本的JDBC级事务。缺点是该事务是JPA持久性单元的本地事务,因此如果您想要跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好。
JTA还用于管理JMS和JCA等系统之间的交易,但对于我们大多数人来说,这是非常奇特的用法。
要使用JTA,您需要在应用程序服务器中支持它,并且还需要JDBC驱动程序的支持。
答案 1 :(得分:75)
作为其他答案的补充
以下是非常有用的文章(在Apache TomEE网站上发布)中的摘录,这也有助于回答OP的第一个问题(该文章的链接如下)。
比较RESOURCE_LOCAL和JTA持久性 上下文
<小时/>
使用&lt; persistence-unit 交易类型= “RESOURCE_LOCAL” &GT; 您负责EntityManager (PersistenceContext / Cache)创建和跟踪......
- 你必须使用 获取EntityManager的 EntityManagerFactory
- 生成的 EntityManager 实例 一个PersistenceContext / Cache
- An EntityManagerFactory 可以通过注入 仅 @PersistenceUnit 注释(不是 @PersistenceContext)
- 您不允许 使用@PersistenceContext来引用RESOURCE_LOCAL
类型的单位- 你必须使用 EntityTransaction 用于开始/提交的API 每次致电您的EntityManger
- 致电 entityManagerFactory.createEntityManager()两次导致 两个单独的EntityManager实例及其后 两个单独的PersistenceContexts / Caches。
- 它 几乎从不一个好主意,不止一个 正在使用的EntityManager的实例(不要创建 第二个,除非你已经销毁了第一个)
使用&lt; persistence-unit transaction-type =“JTA”&gt; CONTAINER 将执行EntityManager (PersistenceContext / Cache)创建和跟踪......
- 你不能使用 获取EntityManager的 EntityManagerFactory
- 您只能获得由。提供的 EntityManager 容器
- EntityManager 可以通过 @PersistenceContext 注入 仅限注释(不是@PersistenceUnit)
- 你是 不允许使用@PersistenceUnit来引用a JTA类型的单位
- 由 EntityManager 给出 容器是引用的 与JTA事务关联的PersistenceContext / Cache。
- 如果没有正在进行的JTA事务,则为EntityManager 无法使用因为没有 PersistenceContext / Cache。
- 每个人都有一个EntityManager 引用中的相同单位 交易会自动引用 相同的PersistenceContext / Cache
- PersistenceContext / Cache 刷新并清除 JTA 提交时间
任何有兴趣学习Java Persistence API的人 - 请帮自己一个忙,并阅读完整文章:JPA Concepts: JPA 101。
答案 2 :(得分:17)
Resource_Local和JTA是事务管理器(执行事务的方法)。这不是数据库的属性,而是负责协调事务的组件。 JPA和JTA事务管理器是不同的。 JPA事务管理器负责JPA事务,如果您只进行JPA事务,则需要使用它。 JTA事务管理器是通用事务管理器,可以在事务中登记其他资源,例如JMS队列。通常,Java EE容器为EJB,JPA实体等使用JTA事务管理器。
答案 3 :(得分:0)
resource_local与JTA有关本地事务与全局事务的信息。我们可以在一次交易中管理多个资源。
CMT与BMT的关系是关于谁在打开和关闭交易-应用程序开发人员或应用程序服务器。