3 回答
TA贡献1821条经验 获得超4个赞
JPA实现可以选择自己管理事务(RESOURCE_LOCAL
),还是由应用程序服务器的JTA实现对其进行管理。
在大多数情况下,RESOURCE_LOCAL是可以的。这将使用基本的JDBC级事务。缺点是该事务对于JPA持久性单元而言是本地的,因此,如果您想要一个跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好。
JTA还用于跨JMS和JCA之类的系统管理事务,但这对我们大多数人来说是相当奇怪的用法。
要使用JTA,您需要在应用程序服务器中对其进行支持,并且还需要JDBC驱动程序的支持。
TA贡献1829条经验 获得超6个赞
作为其他答案的补充
这是一篇非常有用的文章(在Apache TomEE网站上发布)的摘录,该文章也可以帮助回答OP的第一个问题(下面是文章的链接)。
比较RESOURCE_LOCAL和JTA持久性上下文
使用<persistence-unit transaction-type =“ RESOURCE_LOCAL”>, 您可以负责EntityManager(PersistenceContext / Cache)的创建和跟踪...
您必须使用 EntityManagerFactory来获取EntityManager
产生的EntityManager实例 是 PersistenceContext / Cache
一个 的EntityManagerFactory可以通过被注入 @PersistenceUnit注解只有(未@PersistenceContext)
你是不是允许使用@PersistenceContext引用类型的单位RESOURCE_LOCAL
您必须使用 EntityTransaction API来开始/提交 对EntityManger的每次调用
两次调用entityManagerFactory.createEntityManager()会导致两个单独的EntityManager实例,并因此 导致 两个单独的PersistenceContexts / Caches。
这是几乎从未有多于一个好主意, 比如在使用一个EntityManager的(不创建除非你破坏了第一第二个)
使用<persistence-unit transaction-type =“ JTA”>, 容器将执行EntityManager(PersistenceContext / Cache)创建和跟踪...
您不能使用 EntityManagerFactory获取EntityManager
您只能获得容器提供 的EntityManager
一个的EntityManager 可以通过注入@PersistenceContext 注解只有(未@PersistenceUnit)
你是 不是允许使用@PersistenceUnit引用类型JTA单位
容器给定的EntityManager是对与JTA事务关联的PersistenceContext / Cache 的引用。
如果没有正在进行的JTA事务,则由于没有PersistenceContext / Cache ,因此无法使用 EntityManager 。
大家都用一个EntityManager参照同一单元在同一事务将自动具有到一个参考 相同PersistenceContext /高速缓存
在JTA 提交时刷新并清除PersistenceContext / Cache
有兴趣学习Java Persistence API的任何人-请帮个忙,并在此处阅读完整的文章:JPA概念:JPA 101。
TA贡献1942条经验 获得超3个赞
Resource_Local和JTA是事务管理器(执行事务的方法)。这不是数据库的属性,而是负责协调事务的组件。JPA和JTA事务管理器是不同的。JPA事务管理器负责JPA事务,如果仅执行JPA事务,则要使用一个。JTA事务管理器是通用事务管理器,可以在事务中注册其他资源,例如JMS队列。通常,Java EE容器为EJB,JPA实体等使用JTA事务管理器。
添加回答
举报