getTransaction()。begin()/。commit()和joinTransaction()与JPA2 / EclipseLink有区别吗?

时间:2011-09-06 21:05:45

标签: 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();

我应该更喜欢哪一个?

1 个答案:

答案 0 :(得分:2)

EntityManager.joinTransaction用于JTA事务(意味着持久性单元配置为使用JTA事务),而EntityTransaction.begin用于资源本地实体管理器(暗示非 - 用于管理交易的JTA用途)。因此,它们都可以用于不同的场景。

第一种情况,即EntityManager.joinTransaction很少使用,因为当您需要JTA事务支持时,通常会注入容器管理的EntityManager实例。容器管理的EntityManager被注入(使用@PersistenceContext注释)到现有JTA事务的上下文中(由容器管理),因此不需要显式地加入事务。只有在应用程序管理的EntityManager事件中,您才需要加入现有事务。应用程序管理的EntityManager不会被容器注入;相反,容器可能只注入应用程序用来获取EntityManagerFactory实例的EntityManager实例(使用@PersistenceUnit注释)。

在第二种情况下,即EntityTransaction.begin,不会使用任何JTA交易来限制任何交易工作。相反,事务是资源本地的,因为对持久化上下文所做的任何更改都将作为原子单元进行跟踪,直到调用EntityTransaction.commit为止。人们很少在Java EE应用程序中使用资源本地实体管理器,因为您通常希望EJB(和EJB容器)划分事务边界,而不是应用程序源代码。此外,使用资源本地事务执行的任何事务性工作都不会被可能已经启动的JTA事务跟踪,从而导致关于应用程序中事务活动​​的模糊,混乱和模糊行为。