我有一個用戶實體類,我試圖做密碼散列。我認爲最簡單的方法是創建一個用@Transient註釋的密碼字段和一個在用@PrePersist和@PreUpdate註解的方法持久保存對象之前設置的哈希密碼字段。在@PreUpdate方法被調用之前JPA @Transient字段被清除
所以我有這樣的事情:
@Transient
private String password;
private String hashedPassword;
@PrePersist
@PreUpdate
private void hashPassword() {
if(password != null) {
hashedPassword = PasswordHasher.hashPassword(password);
}
}
這工作完全正常當實體繼續存在。密碼字段仍然在調用hashPassword時設置,並計算並存儲hashedPassword的值。
但是,對於更新也是如此 - 即使在合併實體之前設置了密碼的新值,在調用hashPassword時該字段爲null。爲什麼是這樣?難道瞬態場的值不應該一直存在,直到實體持續存在?
(我使用的EclipseLink 2.0.0順便說一句,如果這有什麼差別)
可能的重複:http://stackoverflow.com/questions/2581665/jpa-transient-information-lost-on-create – 2010-08-05 01:40:27
是的,這是完全相同的行爲(請參閱** 3.2.4.1合併分離的實體狀態* *規範的合併語義)。 – 2010-08-05 07:21:16