2016-05-25 9 views
0

私は、Spring Data Restで管理されているエンティティチェーンを通じて更新操作中に行われた変更を調べるのに、最も慣れ親しんだ方法を探しています。更新操作で前のエンティティにアクセス

現在の私の使用例は、パスワードを最後に変更したときのものです。私のドメインオブジェクトには、パスワードと変更時刻の2つのフィールドがあります。私は私のREST APIをパスワードを設定するだけでいいですし、私はそれが新しいものかどうかを検出して変更時刻を更新します。私はフロントエンドに変更時間を設定しなければならないかどうかを知ることを好まないでしょう。私はまた、データベーストリガーを作成しないことをお勧めします。

私はHandleBeforeSaveイベントを作成しようとしました。このイベントは、既存のドメインオブジェクトを照会し、イベントハンドラに渡されたものと比較しようとします。残念ながら、それらは全く同じオブジェクトなので、それらの違いを検出することはできません。私は、SpringデータリポジトリとEntityManagerを介してクエリを実行しようとしました。私はバックエンドとしてHibernate 5を使用しています。

RepositoryEntityControllerpatchItemResourceメソッドを実行すると、payload.getContent()の結果は、更新が適用された1つのフィールドのみを修正した場合でも、エンティティ全体が反映されます。これがジャクソンによって行われたのか、PersistentEntityResourceがそれをどこかで処理しているのかどうかはわかりません。オブジェクトをマージするコードフローが分かっている人は参考になりますか?

答えて

0

簡単な方法の1つは、エンティティ・ロード時に以前の状態への参照を格納し、更新時に他のフィールドを変更するために2番目のリスナーを実装するためにEntity Lifecycleリスナーを使用することです。

https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Events

@Entity 
public class SomeEntity{ 

     @Transient 
     private SomeEntity previousState; 

     @PostLoad 
     private void storeState(){ 
      previousState = new SomeEntity(); 
      previousState.setPassword(this.getPassword()); 
     } 

     @PreUpdate 
     private void doBeforeUpdate(){ 
      if(!previousState.getPassword().equals(this.getPassword()){ 
       //update time. 
      } 
     } 
    } 
関連する問題