Playframework CRUD模块的特殊更新
我来自以下链接:。 我成功地将二进制数据存储在数据库中,并将代码放在了我之前放置的链接上。我会把它再放一遍,以便更快地参考:Playframework CRUD模块的特殊更新,playframework,Playframework,我来自以下链接:。 我成功地将二进制数据存储在数据库中,并将代码放在了我之前放置的链接上。我会把它再放一遍,以便更快地参考: @Column(columnDefinition="BYTEA NOT NULL", nullable=false) @Password public byte[] password; @Required @Password @Transient public String hash; @ManyToOne @Required public Departamento
@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);
}
现在的问题是我无法更新密码。我更改了显示模板以获得空白模板中的数据,但我根本无法更新数据。
@PreUpdate注释的添加似乎没有按应有的方式工作
我能做什么?如有任何建议,将不胜感激
更新:
正如@grahamrb所建议的,似乎我只需要重写set方法来保存和更新数据。感谢@grahamrb问题在于与@PreUpdate注释相关的方法仅在某些对象字段值发生更改时调用。但当您尝试更新@Transient字段时,不可能检测到更改,并且该方法未被调用 我遇到了类似的问题,也是我能找到的最好的解决方案——在数据库字段中存储一个代理项值,用于告诉休眠更改。例如: 模型上下文: 控制器上下文:
为什么不去掉hash对象,而重写public void setPassword方法,并将哈希算法放在其中呢?我应该怎么做呢code public void setHashString hash{this.hash=Crypto.passwordHashhash.getBytes;}代码就足够了?我也应该做一个getter吗?
public Long updatingHackHash;
public void renewUpdatingHackHash() {
this.updatingHackHash = System.currentTimeMillis();
}
public static void save(MyModel myModel) {
// ...
myModel.renewUpdatingHackHash();
myModel.save();
// ...
}