3 回答

TA貢獻1821條經(jīng)驗 獲得超5個贊
JPA實現(xiàn)可以選擇自己管理事務(RESOURCE_LOCAL
),還是由應用程序服務器的JTA實現(xiàn)對其進行管理。
在大多數(shù)情況下,RESOURCE_LOCAL是可以的。這將使用基本的JDBC級事務。缺點是該事務對于JPA持久性單元而言是本地的,因此,如果您想要一個跨越多個持久性單元(或其他數(shù)據(jù)庫)的事務,那么RESOURCE_LOCAL可能不夠好。
JTA還用于跨JMS和JCA之類的系統(tǒng)管理事務,但這對我們大多數(shù)人來說是相當奇怪的用法。
要使用JTA,您需要在應用程序服務器中對其進行支持,并且還需要JDBC驅(qū)動程序的支持。

TA貢獻1829條經(jīng)驗 獲得超6個贊
作為其他答案的補充
這是一篇非常有用的文章(在Apache TomEE網(wǎng)站上發(fā)布)的摘錄,該文章也可以幫助回答OP的第一個問題(下面是文章的鏈接)。
比較RESOURCE_LOCAL和JTA持久性上下文
使用<persistence-unit transaction-type =“ RESOURCE_LOCAL”>, 您可以負責EntityManager(PersistenceContext / Cache)的創(chuàng)建和跟蹤...
您必須使用 EntityManagerFactory來獲取EntityManager
產(chǎn)生的EntityManager實例 是 PersistenceContext / Cache
一個 的EntityManagerFactory可以通過被注入 @PersistenceUnit注解只有(未@PersistenceContext)
你是不是允許使用@PersistenceContext引用類型的單位RESOURCE_LOCAL
您必須使用 EntityTransaction API來開始/提交 對EntityManger的每次調(diào)用
兩次調(diào)用entityManagerFactory.createEntityManager()會導致兩個單獨的EntityManager實例,并因此 導致 兩個單獨的PersistenceContexts / Caches。
這是幾乎從未有多于一個好主意, 比如在使用一個EntityManager的(不創(chuàng)建除非你破壞了第一第二個)
使用<persistence-unit transaction-type =“ JTA”>, 容器將執(zhí)行EntityManager(PersistenceContext / Cache)創(chuàng)建和跟蹤...
您不能使用 EntityManagerFactory獲取EntityManager
您只能獲得容器提供 的EntityManager
一個的EntityManager 可以通過注入@PersistenceContext 注解只有(未@PersistenceUnit)
你是 不是允許使用@PersistenceUnit引用類型JTA單位
容器給定的EntityManager是對與JTA事務關聯(lián)的PersistenceContext / Cache 的引用。
如果沒有正在進行的JTA事務,則由于沒有PersistenceContext / Cache ,因此無法使用 EntityManager 。
大家都用一個EntityManager參照同一單元在同一事務將自動具有到一個參考 相同PersistenceContext /高速緩存
在JTA 提交時刷新并清除PersistenceContext / Cache
有興趣學習Java Persistence API的任何人-請幫個忙,并在此處閱讀完整的文章:JPA概念:JPA 101。

TA貢獻1942條經(jīng)驗 獲得超3個贊
Resource_Local和JTA是事務管理器(執(zhí)行事務的方法)。這不是數(shù)據(jù)庫的屬性,而是負責協(xié)調(diào)事務的組件。JPA和JTA事務管理器是不同的。JPA事務管理器負責JPA事務,如果僅執(zhí)行JPA事務,則要使用一個。JTA事務管理器是通用事務管理器,可以在事務中注冊其他資源,例如JMS隊列。通常,Java EE容器為EJB,JPA實體等使用JTA事務管理器。
添加回答
舉報