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

时间:2013-06-26 21:45:18

标签: java jpa java-ee jta persistence.xml

在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 个答案:

答案 0 :(得分:106)

默认值

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

RESOURCE_LOCAL

使用<persistence-unit transaction-type="RESOURCE_LOCAL">,您有责任EntityManagerPersistenceContext/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">容器将EntityManagerPersistenceContext/Cache)创建和跟踪。

  • 您无法使用EntityManagerFactory获取EntityManager
  • 您只能获得容器提供的EntityManager
  • EntityManager只能通过@PersistenceContext注释注入(不是@PersistenceUnit
  • 您不得使用@PersistenceUnit来引用JTA类型的单位
  • 容器提供的EntityManager是对与JTA交易相关联的PersistenceContext/Cache的引用。
  • 如果没有正在进行的JTA交易,则无法使用EntityManager,因为没有PersistenceContext/Cache
  • 对同一交易中同一单位的EntityManager引用的每个人都会自动引用相同的PersistenceContext/Cache
  • 在JTA提交时刷新并清除PersistenceContext/Cache