Ich habe den Lebenszyklus von JPA-Entitäten heutzutage gesucht. Aber jetzt, es gibt einige fehlende Punkte über Entity Life Cyle. Ich habe die folgende Grafik in einem der Stackoverflow-Posts gefunden und beachte, dass dieses Diagramm uplooted wurde.
Gemäß diesem Diagramm wird, wenn wir eine Entität beibehalten, diese verwaltet. OK . Kein Problem . Wenn wir uns verpflichten, gehen die Daten zur Datenbank. OK . Kein Problem. Aber Diagramm zeigt uns diese Commit-Operation gemacht Einheit losgelöst! Sehen wir uns den folgenden Pseudo-Code an.
%Vor%im vorherigen Schritt (Festschreibungsschritt). Wie ist es möglich, ein losgelöstes Objekt zu entfernen? Wenn diese Entität getrennt wird, wissen wir alle, dass es nicht möglich ist, eine getrennte Entität zu verwalten, da sie nicht mehr mit dem Persistenzkontext verknüpft ist.
Wie ist es also möglich, ein losgelöstes Objekt zu entfernen? Könnten Sie mir bitte an dieser Stelle erklären? Vielen Dank im Voraus!
Die Entity kann auf eine der folgenden Arten losgelöst werden (es könnte mehrere Wege geben):
Wenn die Transaktion (im kontextbezogenen Persistenzkontext) festgeschrieben wird, werden Entitäten, die vom Persistenzkontext verwaltet werden, losgelöst.
Wenn ein anwendungsgesteuerter Persistenzkontext geschlossen wird, werden alle verwalteten Entitäten getrennt.
Verwenden einer klaren Methode
mit detach-Methode
Rollback
Wenn im erweiterten Persistenzkontext eine Stateful-Bean entfernt wird, werden alle verwalteten Entitäten getrennt.
Ich denke, das Problem könnte der Unterschied zwischen anwendungsverwalteten, benutzerverwalteten und erweiterten Persistenzkontexten sein.
Dieses Bild ist von openjpa aber IMO (andere Meinungen sind willkommen) ist es ein bisschen falsch ?! (In EE mit TRANSACTION Scope ist es in Ordnung) Aber in einer JAVA SE Beispiel wie folgt: ....
%Vor%Die Entity wird nach der Methode detached losgelöst. Nach dem Festschreiben bleibt es im Kontext der Entitätspersistenz.
Für Ihre Frage: Wenn Sie ein losgelöstes Objekt haben, können Sie es zusammenfügen, um es wieder an den Persistenzkontext anzuhängen.
2 Dinge:
Der Status remove und detached ist unterschiedlich: Removed
bedeutet, dass die Entity noch verwaltet wird und eine Löschung in der Persistence-Ebene der Flush-Instanz auslöst. Detached
bedeutet, dass die Entity nicht mehr verwaltet wird und dass die vorgenommenen Änderungen " t an die Datenbank gemeldet werden.
Ihr Entitätsstatus bezieht sich auf entityManager
. Managed
bedeutet, dass EM
alle daran vorgenommenen Änderungen protokolliert und sie zur Spülzeit in der Datenbank meldet.
Sie müssen verstehen, dass das Melden von Änderungen an der Datenbank außerhalb einer Transaktion keinen Sinn ergibt ( JPA
support hat nur den Zugriff auf die Datenbank und nur auf die Isolationsstufe READ_COMMITED
übernommen).
Verfolgen der Änderung der Entität, sobald die Transaktion, in der sie abgerufen wurde, abgelaufen ist, hat keinen Sinn, da EntityManager
den Datenbankstatus außerhalb einer Transaktion nicht ändern kann.
Das ist der Grund, warum EntityManager
in JPA
für jede Arbeitseinheit erstellt werden soll (im Gegensatz zur persistenceUnit, dh der entityManagerFactory, die einmal für die gesamte Anwendung erstellt wird).
Folglich sollte EntityManager
denselben Umfang wie die Transaktion haben und sollte unmittelbar nach dem Festschreiben freigegeben werden (was der Fall ist, wenn Sie den Container den EntityManager-Lebenszyklus für Sie verwalten lassen).
Das ist auch der Grund, warum JPA
verschachtelte Transaktionen nicht unterstützt.