Nehmen wir an, ich habe zwei Anwendungen mit jeweils einer individuellen EAR-Datei, die sich gegenseitig innerhalb derselben JTA-Transaktion aufrufen. Wenn beide denselben Entity Manager verwenden, erhalten sie dieselbe Sitzung oder werden sie jedes Mal neu erstellt?Zwei EAR-Dateien, der selbe JPA-Entitymanager, dieselbe Transaktion => gleiche Sitzung?
Antwort
Ein EntityManager (in JPA) entspricht mehr oder weniger einer Sitzung (in Hibernate). In einer reinen JPA-Anwendung würden Sie nur den EntityManager verwenden. Es kapselt eine Sitzung. Die Sitzung wird so lange ausgeführt, wie der EntityManager aktiv ist.
Es gibt keinen Grund (und ich denke auch nicht), einen EntityManager zwischen zwei Anwendungen zu teilen, da sie in verschiedenen JVMs laufen (zumindest auf den Anwendungsservern, mit denen ich gearbeitet habe). Was Sie tun können, teilen Sie den EntityManager Setup (eine Persistenzeinheit genannt). Sie können dies tun, indem Sie die Entity-Klassen und das XML in ein JAR einfügen und es aus beiden Anwendungen verwenden. Wie dies genau geschieht, hängt jedoch wahrscheinlich von Ihrem Anwendungsserver ab. Es wird definitiv den gleichen Effekt haben, als würde man nur die Klassen und das XML für die zweite Anwendung duplizieren.
Was passiert, ist dies: Jede der beiden Anwendungen wird ihren eigenen Persistenzkontext haben. Das heißt, wenn Sie eine Entität in eine Anwendung laden, wird sie nicht in die andere geladen. Wenn Sie eine Entität in Anwendung eins laden und ändern, dann laden Sie sie in Anwendung zwei, Anwendung zwei wird die unmodifizierte Entität sehen (außer wenn Sie sehr seltsame Transaktionsisolationseinstellungen haben und Anwendung entscheidet, die Entität zuerst zu löschen).
Alle Konflikte treten erst am Ende der JTA-Transaktion auf. Ich weiß nicht, was dann passieren wird, und ich denke, es hängt von Ihren Datenbank- und Transaktionseinstellungen ab. Wahrscheinlich wird die Transaktion zurückgesetzt, wenn beide Anwendungen versuchen, verschiedene Dinge mit den gleichen Daten zu tun. Jede Anwendung hat ihre eigene Datenbankverbindung. Sie sind durch die JTA-Transaktion miteinander verbunden, so dass sichergestellt ist, dass entweder beide Commits oder beide Rollbacks durchgeführt werden.
teilen die Anwendungen Klassendateien? –
Ja, die Entitäten und einige allgemeine API – Mauli
Haben Sie Ihren Entitätsmanager so konfiguriert, dass erweiterte Persistenzkontexte verwendet werden? – HDave