JPA - Speichern von Änderungen ohne persist () aufgerufen

8

Wir verwenden Toplink-Implementierung von JPA + Spring + EJB. In einem unserer EJBs haben wir so etwas:

%Vor%

Im Grunde sollte diese updateUser-Methode den Namen des Benutzers mit der angegebenen ID aktualisieren. Aber der Autor dieser Methode hat vergessen, em.persist (u);

aufzurufen

Und das Seltsamste ist, dass es gut funktioniert. Wie kann es sein? Ich war mir 100% sicher Ohne em.persist () oder em.merge () aufzurufen, gibt es keine Möglichkeit, Änderungen in der Datenbank zu speichern. Könnten sie? Gibt es ein Szenario, in dem dies passieren könnte?

Danke

    
anthony 23.11.2009, 18:15
quelle

1 Antwort

11

Sie arbeiten mit einer verwalteten Entität. Wenn die Entität nicht getrennt wird, weil ihr Entitätsmanager geschlossen ist, werden alle an der Entität vorgenommenen Änderungen in der Datenbank widergespiegelt, wenn die Sitzung geleert / geschlossen und die Transaktion festgeschrieben wird.

Aus dem Java EE-Lernprogramm :

  

Der Status persistenter Entitäten ist   synchronisiert mit der Datenbank, wenn die   Transaktion, mit der die Entität ist   zugehörige Commits.

Edit zur besseren Übersichtlichkeit und Erklärung : Es gibt also drei verschiedene Modi, in denen sich eine Entity während ihres Lebenszyklus befinden kann:

  • Nicht gespeichert : Die Entität wurde instanziiert, aber persist() wurde noch nicht aufgerufen.
  • Verwaltet : Die Entität wurde mit persist() beibehalten oder aus der Datenbank geladen und ist einer Entitätsmanagersitzung zugeordnet. Alle Änderungen an der Entität werden in der Datenbank widergespiegelt, wenn die Entity Manager-Sitzung gelöscht wird.
  • Detached : Die Entity Manager-Sitzung der Entität wurde geschlossen. Änderungen an der Entität werden nicht automatisch in der Datenbank reflektiert, sondern können explizit mit dem Befehl merge() zusammengeführt werden.
Henning 23.11.2009 18:44
quelle

Tags und Links