我正在使用带注释的 JPA2 和 EclipseLink,我想知道两者之间是否有区别
EntityManager em = ...
// Some action
em.joinTransaction();
em.close();
和
EntityManager em = PU.entityManager();
em.getTransaction().begin();
// Some action
em.getTransaction().commit();
em.close();
我一般应该更喜欢哪一个?
最佳答案
EntityManager.joinTransaction
用于 JTA 事务(意味着持久性单元配置为使用 JTA 事务),而 EntityTransaction.begin
旨在用于资源本地实体管理器(意味着不使用 JTA 来管理事务)。因此,它们都适用于不同的场景。
第一种情况,即 EntityManager.joinTransaction
很少使用,因为当您需要 JTA 事务支持时,您经常会注入(inject)容器管理的 EntityManager
实例。容器管理的 EntityManager 被注入(inject)(使用 @PersistenceContext
注释)到现有 JTA 事务(由容器管理)的上下文中,因此不需要显式加入事务。仅当出现应用程序管理的 EntityManager 时,您才需要加入现有事务。应用程序管理的 EntityManager 不是由容器注入(inject)的;相反,容器只能注入(inject)一个 EntityManagerFactory
实例(使用 @PersistenceUnit
注释),应用程序使用该实例来获取 EntityManager
实例。
在第二种情况下,即EntityTransaction.begin
,不会使用 JTA 事务来确定任何事务工作的范围。相反,事务是资源本地的,因为对持久性上下文所做的任何更改都将作为原子单元进行跟踪,直到调用 EntityTransaction.commit 为止。人们很少会在 Java EE 应用程序中使用资源本地实体管理器,因为您通常希望 EJB(和 EJB 容器)来划分事务边界,而不是应用程序源代码。此外,使用资源本地事务执行的任何事务工作都不会被可能已经启动的 JTA 事务跟踪,从而导致应用程序中的事务 Activity 出现模糊、困惑和不明确的行为。
关于java - getTransaction().begin()/.commit() 和 joinTransaction() 与 JPA2/EclipseLink 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7326173/