我正在使用JPA2注释和EclipseLink,我想知道是否存在差异
EntityManager em = ...
// Some action
em.joinTransaction();
em.close();
和
EntityManager em = PU.entityManager();
em.getTransaction().begin();
// Some action
em.getTransaction().commit();
em.close();
我应该更喜欢哪一个?
答案 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事务跟踪,从而导致关于应用程序中事务活动的模糊,混乱和模糊行为。