Warum wird ein JPA - @PreUpdate-annotierte Methode aufgerufen werden, während eine Abfrage?
Habe ich eine benannte Abfrage, gibt eine Collection
von Entitäten.
Diese Personen haben eine @PreUpdate
-annotierte Methode auf. Diese Methode wird aufgerufen, während query.getResultList()
. Weil dieses, die Entität, die geändert wird, innerhalb der Persistenz-Kontext, was bedeutet, dass nach der Transaktion ein commit, dass die Entität in die Datenbank zurückgeschrieben.
Warum ist das so? Die JPA-2.0-Spezifikation erwähnt nicht ausdrücklich, dass @PreUpdate
sollte aufgerufen werden, indem Sie die Ausführung einer Abfrage.
- Ich sehe dieses Verhalten, übrigens, in EclipseLink 2.3.2.v20111125-r10461 im Falle es ist ein schwerwiegender Fehler in dieser Implementierung nur.
- Ich lief in das gleiche problem, aber mit Hibernate. So wie es scheint, es ist keine Implementierung Problem, sondern ein erwartetes Verhalten. Irgendwie scheint dies durch einige automatische Spülung, die durch JTA.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Spezifikation sagt:
In diesem Fall ruft
query.getResultList()
löst eineem.flush()
so, dass die Abfrage einschließen kann geändert von aktuellen EntityManager-session.em.flush()
drückt alle änderungen an der Datenbank (macht jede UPDATE -, INSERT-Aufrufe). VorUPDATE
ist per JDBC@PreUpdate
entsprechenden hooks aufgerufen werden.@PostLoad
aufgerufen wird, aktualisiert das Feld, Methode gibt und löst beide flush und@PreUpdate
? Sowieso, mein Anwendungsfall ist zum codieren ein Feld vor dem speichern in die DB und Decodierung beim Lesen. Wie es scheint, entity Listener sind nutzlos hier.Dies ist nur mein Kommentar von rzymek Antwort mit einigen follow-up-code:
Habe ich versucht, das problem zu reproduzieren OP hatte, denn es Klang wie der EntityManager bekommen würde, errötete jedesmal, wenn die Abfrage aufgerufen wird. Aber das ist nicht der Fall. @PostUpdate-Methoden werden nur aufgerufen, wenn auch tatsächlich geändert wird getan, um die Datenbank so weit wie ich das beurteilen kann. Wenn Sie eine änderung mit der EntityManager, der noch nicht geleert, um die DB-Abfrage.getResultList auslösen wird, die bündig mit der DB, die das Verhalten sollte man erwarten.