2010-12-15 51 views
6

假設我有兩個應用程序,每個應用程序都有一個EAR文件,它們在相同的JTA事務中互相調用。如果兩個人共享相同的實體管理者,他們是否獲得相同的會話或每次創建新會話?兩個EAR文件,相同的JPA實體管理器,相同的事務=>相同的會話?

+0

做應用程序共享類文件? – 2010-12-15 14:04:00

+0

是的,實體和一些常見的api – Mauli 2010-12-15 14:08:18

+0

你配置你的entitymanager使用擴展持久化上下文嗎? – HDave 2010-12-18 07:10:59

回答

1

EntityManager(在JPA中)或多或少等同於Session(在Hibernate中)。在純粹的JPA應用程序中,您只能使用EntityManager。它封裝了一個Session。只要EntityManager存在,會話就會繼續。因爲它們運行在不同的JVM中(至少在我使用的應用程序服務器上),所以在兩個應用程序之間共享一個EntityManager是沒有道理的(我認爲也沒辦法)。你可以做的是分享EntityManager 設置(稱爲持久性單元)。您可以通過將實體類和XML放入JAR中並從兩個應用程序中使用它來完成此操作,但完成這個操作可能取決於您的應用程序服務器。它肯定會有與第二個應用程序的類和XML重複相同的效果。

會發生什麼事情是這樣的:兩個應用程序中的每一個都會有自己的持久化上下文。這意味着,當你在一個應用程序中加載一個實體時,它不會被加載到另一個應用程序中。如果您在應用程序一中加載和修改實體,然後將其加載到應用程序二中,則應用程序二將看到未修改的實體(除非您有非常奇怪的事務隔離設置應用程序一決定先沖刷實體)。

任何衝突只會在JTA事務結束時出現。我不知道會發生什麼,我認爲這取決於您的數據庫和交易設置。如果兩個應用程序試圖對同一數據執行不同的操作,事務處理可能會回滾。每個應用程序都有自己的數據庫連接。它們通過JTA事務綁定在一起,這樣可以確保它們都落實或兩者都回滾。