【发布时间】:2011-03-25 13:28:17
【问题描述】:
我有一个用户实体类,我正在尝试对其进行密码散列。我认为最简单的方法是创建一个带有 @Transient 注释的密码字段和一个散列密码字段,该字段在对象被持久化之前设置,使用带有 @PrePersist 和 @PreUpdate 注释的方法。
所以我有这样的事情:
@Transient
private String password;
private String hashedPassword;
@PrePersist
@PreUpdate
private void hashPassword() {
if(password != null) {
hashedPassword = PasswordHasher.hashPassword(password);
}
}
当实体被持久化时,这非常有效。在调用 hashPassword 时仍会设置密码字段,并计算并存储 hashedPassword 的值。
但是,对于更新而言,情况并非如此——即使在合并实体之前设置了新的密码值,在调用 hashPassword 时该字段仍为空。为什么是这样?至少在实体被持久化之前,瞬态字段的值不应该一直存在吗?
(顺便说一句,我使用的是 EclipseLink 2.0.0,如果有什么不同的话)
【问题讨论】:
-
是的,这是完全相同的行为(请参阅规范的 3.2.4.1 合并分离实体状态部分了解合并的语义)。
标签: java jpa eclipselink