persistence.xml 不同的事务类型属性

Posted

技术标签:

【中文标题】persistence.xml 不同的事务类型属性【英文标题】:persistence.xml different transaction-type attributes 【发布时间】:2013-06-24 05:43:50 【问题描述】:

在 persistence.xml JPA 配置文件中,你可以有这样一行:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="JTA">

或者有时:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type=”RESOURCE_LOCAL”>

我的问题是:

transaction-type="JTA"transaction-type=”RESOURCE_LOCAL” 有什么区别?

我还注意到一些persistence.xml 文件缺少事务类型。对吗?

【问题讨论】:

【参考方案1】:

默认值

在 JavaEE 环境中默认为 JTA,在 JavaSE 环境中默认为 RESOURCE_LOCAL

RESOURCE_LOCAL

使用&lt;persistence-unit transaction-type="RESOURCE_LOCAL"&gt;,您负责创建和跟踪EntityManager (PersistenceContext/Cache)

您必须使用EntityManagerFactory 才能获得EntityManager 生成的EntityManager 实例是PersistenceContext/Cache EntityManagerFactory 只能通过@PersistenceUnit 注解注入(不是@PersistenceContext) 不允许使用@PersistenceContext 来引用RESOURCE_LOCAL 类型的单元 您必须使用EntityTransaction API 来开始/提交每次调用您的EntityManger 调用entityManagerFactory.createEntityManager() 两次会产生两个独立的EntityManager 实例,因此会产生两个独立的PersistenceContexts/Caches。 使用多个EntityManager 实例几乎从来都不是一个好主意(除非您已销毁第一个实例,否则不要创建第二个实例)

JTA

使用&lt;persistence-unit transaction-type="JTA"&gt;,容器将执行EntityManager (PersistenceContext/Cache) 创建和跟踪。

您不能使用EntityManagerFactory 来获取EntityManager 您只能获取容器提供的EntityManager EntityManager 只能通过@PersistenceContext 注解注入(不能通过@PersistenceUnit) 不允许使用@PersistenceUnit 来引用JTA 类型的单元 容器给出的EntityManager 是对与JTA 事务关联的PersistenceContext/Cache 的引用。 如果没有正在进行的 JTA 事务,则无法使用 EntityManager,因为没有 PersistenceContext/Cache。 在同一事务中具有EntityManager 引用的每个人都将自动引用相同的PersistenceContext/Cache PersistenceContext/Cache 在 JTA 提交时被刷新和清除

【讨论】:

很明显,您也可以在 JavaSE 环境中使用 JTA,并自己从 EMF 中获取 EM ...例如在使用独立 JTA 提供程序时。也许您的列表指的是 JavaSE 和 JavaEE,而不是 JTA 和 RESOURCE_LOCAL “使用多个 EntityManager 实例几乎从来都不是一个好主意”——这是您的意见吗?通常需要在并发应用程序中打开多个打开的 EntityManager。总的来说,这是一个很好的答案。 我使用了 RESOURCE_LOCAL 而无需自己开始和结束事务。我认为 RESOURCE_LOCAL 更像是“我想使用本地测试内存来测试这个数据库”,这对 JUnit 测试非常有帮助。 我不同意“不允许使用@PersistenceUnit 引用JTA 类型的单元”的说法。我认为你可以很容易地做到这一点,你可以使用方法 emf.createEntityManager() 来获取实体管理器。并且可以使用 SynchronizationType 类型的参数来定义当前事务是应该立即加入还是在调用 em.joinTransaction() 方法时自己加入 您可以通过附加信息和简短示例查看答案的来源:tomee.apache.org/jpa-concepts.html

以上是关于persistence.xml 不同的事务类型属性的主要内容,如果未能解决你的问题,请参考以下文章

eclipselink 连接池

如何在没有 persistence.xml 的情况下配置 Spring?

创建没有 persistence.xml 配置文件的 JPA EntityManager

Bitronix + Spring + Hibernate + Persistence

没有定义[javax.persistence.EntityManagerFactory]类型的唯一bean:期望的单个bean但找到0

数据源、XADataSource 和 JTA