私は、onSave
とonFlushDirty
を上書きして、ユーザが作成した作成日、最終更新日、最後に変更されたユーザに関する情報を設定するために使用するカスタムEmptyInterceptorを持っています。各フィールドをループする以外にJPAエンティティが変更されたことを伝える簡単な方法はありますか?
このシステムはかなりうまく機能しましたが、入力データを使用してエンティティ上のセッターを盲目的に呼び出すコードがあるという問題が見つかりました。この場合、データが変更されていなくても、Hibernateはカスタムインターセプタを起動し、最後に変更されたユーザと日付を設定します。これにより、Hibernateはデータベース内のエンティティを更新します。このテーブルに挿入トリガーと更新トリガーがあるので、これはわかります。インターセプタを無効にすると、Hibernateはデータベース内のエンティティを更新しません。
エンティティが実際に変更されていない場合、そのような状況で更新が行われない場合は、ユーザーと日付の設定を避けたいと考えています。私は、Hibernateがそのdirty entity checkingをやっている方法について読んでいて、とcurrentState
の配列をonFlushDirty
に渡しました。私はこのチェックを自分で行うことができます。それを行う簡単な方法はありますか?
私はHibernateSession.isDirty()を見ましたが、この特定のエンティティが変更されているかどうかは分かりません。セッションに変更されたエンティティがある場合のみです。
UPDATE
それは盲目的にセッターを呼び出し、問題のコードは問題ではなかったことが判明。既に存在していたコレクションを変更するのではなく、子オブジェクトのコレクションを設定するのは問題のコードでした。この場合、Hibernateはエンティティが変更されたか、少なくともインタセプタを呼び出すのに十分だと考えます。
エンティティがあなた自身によって作成され、インターセプタを制御できます: 各オブジェクトがフィールドごとに他のオブジェクトフィールドと比較できるように、エンティティの 'equals'メソッドをオーバーライドしないでください。 'last update date'またはあなたが 'object1.equals(object2); 'と呼ぶインターセプタでそれらを比較するような他の方法でも可能です。そこでは、いくつかのデータが変更されたかどうかをチェックし、特定のデータをチェックするように制御することができます。 –
@SEAang、私は 'onFlushDirty'メソッドに渡されるオブジェクトとして現在のエンティティを持っていますが、私はそれを比較するものは何もありません。 Hibernateは元の状態を表すエンティティの別のコピーを私に提供しません。元のフィールドのすべてを表す配列と、変更されたフィールドを表す配列があります。私はそれを繰り返し、値を比較しています。 –