我来自以下链接:https://stackoverflow.com/a/9372684/574460。 我设法用我早期提供的链接上的代码将二进制数据存储在数据库中。我会再说一遍,以便更快地参考:
@Column(columnDefinition="BYTEA NOT NULL", nullable=false) @Password
public byte[] password;
@Required @Password @Transient
public String hash;
@ManyToOne
@Required
public Departamento departamento;
@PrePersist
@PreUpdate
public void hashPassword() throws Exception {
this.password = Crypto.passwordHash(this.hash, Crypto.HashType.SHA512).getBytes();
System.out.println(this.password);
}
现在的问题是我无法更新密码。我更改了show模板以获取空白模板中的数据,但我根本无法更新数据。 @PreUpdate注释的添加似乎不会像它应该的那样工作。
我该怎么办?任何建议将不胜感激。
更新:
由于@grahamrb sugested,似乎我只需要覆盖set方法来保存和更新数据。谢谢@grahamrb
答案 0 :(得分:0)
问题是只有在某些对象字段值发生更改时才会调用与@PreUpdate
注释相关的方法。但是当您尝试更新@Transient
字段时,无法检测到更改,并且方法未调用。
我遇到了类似的问题和我能找到的最佳解决方案 - 存储在具有代理值的数据库字段中,以告知Hibernate有关更改。例如:
模型背景
public Long updatingHackHash;
public void renewUpdatingHackHash() {
this.updatingHackHash = System.currentTimeMillis();
}
控制器上下文:
public static void save(MyModel myModel) {
// ...
myModel.renewUpdatingHackHash();
myModel.save();
// ...
}