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);
aufzurufenUnd 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
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:
persist()
wurde noch nicht aufgerufen. 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. merge()
zusammengeführt werden. Tags und Links jpa persist toplink-essentials