2012-02-28 13 views
0

私は以下のリンクから来ました:https://stackoverflow.com/a/9372684/574460。 私は、リンク先のコードを使ってバイナリデータをデータベースに格納することができました。私は迅速に参照のために再びそれを置くでしょう:特別更新CRUDモジュール

@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アノテーションの追加は、それが行うべき方法では機能していないようです。

私は何ができますか?アドバイスをいただければ幸いです。

UPDATE:@grahamrbが推薦したよう

、私がデータのみを保存して更新するsetメソッドをオーバーライドする必要がありそうです。ありがとう@グラハムブ

+1

()_メソッドを使用し、そこにあなたのハッシュアルゴリズムを持っていますか? – grahamrb

+0

どうすればいいですか 'code' public void setHash(String hash){ this.hash = Crypto.passwordHash(hash).getBytes(); } 'code'で十分でしょうか?私もゲッターをする必要がありますか? – JuanToroMarty

答えて

0

問題は、一部のオブジェクトフィールド値が変更された場合にのみ呼び出される​​アノテーションに関連するメソッドです。しかし、@Transientフィールドを更新しようとすると、変更を検出することは不可能であり、メソッドは呼び出されません。

私は同様の問題と私が見つけることができる最高の解決策を見つけました - 変更についてHibernateに伝える代理値を持つデータベースフィールドに格納します。たとえば、次のように

モデルのコンテキスト:

public Long updatingHackHash; 

public void renewUpdatingHackHash() { 
    this.updatingHackHash = System.currentTimeMillis(); 
} 

コントローラコンテキスト:あなたは "ハッシュ" オブジェクトを取り除き、代わりに_public、ボイドのsetPasswordを上書きしませんなぜ

public static void save(MyModel myModel) { 

    // ... 

    myModel.renewUpdatingHackHash(); 
    myModel.save(); 

    // ... 
} 
関連する問題