aufgerufen wird. Ich habe eine User Entity-Klasse, für die ich ein Passwort-Hashing durchführen möchte. Ich dachte, dass dies am einfachsten wäre, ein mit @Transient annotiertes Kennwortfeld und ein Hash-Kennwortfeld zu erstellen, das unmittelbar vor der Speicherung des Objekts mit einer mit @PrePersist und @PreUpdate annotierten Methode festgelegt wird.JPA @Transient-Felder werden gelöscht, bevor die @PreUpdate-Methode
So habe ich so etwas wie diese:
@Transient
private String password;
private String hashedPassword;
@PrePersist
@PreUpdate
private void hashPassword() {
if(password != null) {
hashedPassword = PasswordHasher.hashPassword(password);
}
}
Die perfekt funktioniert gut, wenn ein Unternehmen beibehalten wird. Das Kennwortfeld wird immer noch von der Zeit festgelegt, in der hashPassword aufgerufen wird, und ein Wert für hashedPassword wird berechnet und gespeichert.
Das gleiche gilt jedoch nicht für ein Update - selbst wenn ein neuer Wert für das Kennwort kurz vor dem Zusammenführen der Entität festgelegt wird, ist das Feld zu dem Zeitpunkt null, zu dem hashPassword aufgerufen wird. Warum ist das? Sollten die Werte transienter Felder nicht mindestens so lange bestehen bleiben, bis die Entität bestehen bleibt?
(Ich bin mit Eclipselink 2.0.0 btw, wenn es einen Unterschied macht)
möglich dupe: http://stackoverflow.com/questions/2581665/jpa-transient-information-lost-on-create –
Ja, das ist genau das gleiche Verhalten (siehe Abschnitt ** 3.2.4.1 Verschmelzung von getrennten Entity State * * der Spezifikation für die Semantik der Zusammenführung). –