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
使用<persistence-unit transaction-type="RESOURCE_LOCAL">
,您负责创建和跟踪EntityManager
(PersistenceContext/Cache
)
EntityManagerFactory
才能获得EntityManager
生成的EntityManager
实例是PersistenceContext/Cache
EntityManagerFactory
只能通过@PersistenceUnit
注解注入(不是@PersistenceContext
)
不允许使用@PersistenceContext
来引用RESOURCE_LOCAL
类型的单元
您必须使用EntityTransaction
API 来开始/提交每次调用您的EntityManger
调用entityManagerFactory.createEntityManager()
两次会产生两个独立的EntityManager
实例,因此会产生两个独立的PersistenceContexts/Caches
。
使用多个EntityManager
实例几乎从来都不是一个好主意(除非您已销毁第一个实例,否则不要创建第二个实例)
JTA
使用<persistence-unit transaction-type="JTA">
,容器将执行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 不同的事务类型属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 persistence.xml 的情况下配置 Spring?
创建没有 persistence.xml 配置文件的 JPA EntityManager
Bitronix + Spring + Hibernate + Persistence
没有定义[javax.persistence.EntityManagerFactory]类型的唯一bean:期望的单个bean但找到0