在调用@PreUpdate方法之前清除JPA @Transient字段

rob*_*les 13 java jpa eclipselink

我有一个User Entity类,我正在尝试进行密码散列.我认为最简单的方法是创建一个用@Transient注释的密码字段和一个哈希密码字段,该密码字段是在使用@PrePersist和@PreUpdate注释的方法持久保存对象之前设置的.

所以我有这样的事情:

@Transient
private String password;

private String hashedPassword;

@PrePersist
@PreUpdate
private void hashPassword() {
    if(password != null) {
        hashedPassword = PasswordHasher.hashPassword(password);
    }
}
Run Code Online (Sandbox Code Playgroud)

当实体持久化时,这非常有效.密码字段仍然由调用hashPassword的时间设置,并且计算并存储hashedPassword的值.

但是,对于更新也是如此 - 即使在合并实体之前设置了密码的新值,该字段在调用hashPassword时也为空.为什么是这样?至少在实体持续存在之前,瞬态字段的值是否应该保持不变?

(我正在使用EclipseLink 2.0.0 btw,如果它有任何区别)

小智 5

我通过在"transient"字段上将updatableinsertable设置为false 来解决这个问题,因此在您的情况下,这将是:

@Column(name = "password", insertable = false, updatable = false)
private String password;
Run Code Online (Sandbox Code Playgroud)

因此需要一个表@column(这有点难看)但它永远不会被填充(出于安全考虑,这在我的情况下很重要).

我测试了Hibernate 4.3.4.Final,它对我有用.字段值可用于我的EntityLister @PrePersist和@PreUpdate方法,但未存储在数据库中.

希望能帮助任何有类似问题的人.