6つのプロパティと変更日を持つクラスがあります。
@Entity
@Table(name = "product")
public class Product {
private Long id;
private String title; // if changed, update lastChanged
private String subtitle;
private Text summary; // if changed, update lastChanged
private Text description; // if changed, update lastChanged
private Text otherText;
private List<Text> reviews; // if changed, update lastChanged
private Date lastChanged;
// Getters and setters
}
-
@Entity
@Table(name = "text")
public class Text {
private Long id;
private String content;
private int typeCode;
// Getters and setters
}
(これは明らかに実際のドメインモデルの大幅に簡略化されたバージョンですが、基本的な問題を示しています)
要件は次のとおりです。「title」、「summary」、「description」、または「reviews」が変更された場合は、「lastChanged」を現在の日付に設定します。
背景:これらのフィールドは外部APIに関連しています。私の顧客は、日付X以降にAPI関連のフィールドに変更が加えられた製品を知りたいと思っています。
HibernateインターセプターとHibernateイベントリスナーを実装することで、要件を満たそうとしました。どちらも私が期待したようには機能しませんでした。たとえば、「summary」を変更すると、Hibernateは次のように通知します。「content」フィールドがテーブル「text」で変更されました。
'summary'、'description'、または'otherText'が変更されたかどうかはまだわからないため、この情報はあまり役に立ちません。したがって、「lastChanged」を更新する必要があるかどうかはわかりません。
私の他のアイデア:
変更されたTextオブジェクトのIDを取得し、SQLを介してそれに接続されている製品を見つけてください。これは適切に機能しますが、これは非常に醜い解決策であり、ドメインモデルでは非常に複雑になります。
変数セッターに更新ロジックを実装します。これに関する2つの問題:Hibernateはデータベースからオブジェクトをロードしているときにセッターを呼び出し(もちろんタイムスタンプの更新につながるべきではありません)、上記の問題を解決しません。'content'のセッターが呼び出されたら、どうしますか?製品のどのプロパティが変更されたかはわかりません。
この問題に対するエレガントな解決策はありますか?