【问题标题】:persistence.xml different transaction-type attributespersistence.xml 不同的事务类型属性
【发布时间】: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 文件缺少事务类型。对吗?

【问题讨论】:

    标签: java jpa jakarta-ee jta 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
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2023-03-25
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多