Macht die Commit () -Methode von JPA die Entity losgelöst?

8

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!

    
Mesut Dogan 12.08.2015, 12:14
quelle

3 Antworten

7

Die Entity kann auf eine der folgenden Arten losgelöst werden (es könnte mehrere Wege geben):

  1. Wenn die Transaktion (im kontextbezogenen Persistenzkontext) festgeschrieben wird, werden Entitäten, die vom Persistenzkontext verwaltet werden, losgelöst.

  2. Wenn ein anwendungsgesteuerter Persistenzkontext geschlossen wird, werden alle verwalteten Entitäten getrennt.

  3. Verwenden einer klaren Methode

  4. mit detach-Methode

  5. Rollback

  6. 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.

    
Atul 12.08.2015, 14:05
quelle
3

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.

    
pL4Gu33 12.08.2015 13:45
quelle
1

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.

    
Gab 12.08.2015 14:23
quelle

Tags und Links