CRUD模块的特殊更新

时间:2012-02-28 03:02:14

标签: playframework

我来自以下链接: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

1 个答案:

答案 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();

    // ...
}