java - getTransaction().begin()/.commit() 和 joinTransaction() 与 JPA2/EclipseLink 之间有区别吗?

标签 java database jpa orm eclipselink

我正在使用带注释的 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/

相关文章:

java - 在 Java 中处理大字符串常量

java - 上传的文件如果不经过处理并保存在服务器上会怎样?

java - 通过一些 JAR 手术修复 Java 类路径问题

java - 将数据库中的数据显示到 Android 的 listView

sql server 2008 两个并行事务中的死锁

database - 无法在 Java 版中更改 Berkeley DB 数据库类型?

java - 自定义@Column JPA 注释,如何?

JPA 标准搜索具有子类的抽象集合中的属性

java - 多个 jar ,单个持久性单元解决方案?

java - 使用 SpringData 和 QueryDSL-JPA 查询映射值