26

私が持っているもの:

コレクションを含む多くの非一時的なフィールドを含む Hibernate エンティティがあります。ユーザーは、各フィールドを個別に更新することも、フィールドのグループを一度に更新することもできます。

何という挑戦:

ハンドラーで、エンティティのどのフィールドが変更されたかを確認する必要があります。

public void handle(Entity newVersion) {
  Session session = sessionFactory.openSession();
  Entity oldVersion = (Entity) session.get(Entity.class, entity.getId());
  List changedFields = compareChanges(oldVersion, newVersion);  //HOW TO CHECK WHICH FIELDS ARE CHANGED?
}

セキュリティと通知の理由でそれを行いたいです。意味:

  1. すべてのユーザーがすべてのフィールドを変更できるわけではありません
  2. 一部のフィールドの変更について、特定の方法で特定のユーザーに通知する必要があります。

なんて問題:

私は非常に醜いコードを取得します。実際には、すべてのフィールド/コレクションを繰り返し処理し、equalsメソッドを呼び出します。

質問:

どのフィールドが変更されたかを確認するためのよりエレガントな方法を Hibernate が提供する可能性がありますか? どのように?

PS

@victorantunes は解決策を提供しますが、私には包括的すぎるようです。いくつかの代替案がありますか?

4

3 に答える 3

18

できることは、作成、変更、更新などのイベントでトリガーのように機能する Hibernate Interceptor を作成することです。 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html これにより、指定されたエンティティの前の任意のポイントが変更され、永続化されます。 1. ユーザーが持っているかどうかを確認できます特定のフィールドを変更するためのアクセス(セッションまたはデータベースからユーザー名を取得できます)。それに応じて、保存または更新へのアクセスを許可できます。2.エンティティが変更された場合にのみ、他のユーザーに通知できます。

このようにして、Spring の Hibernate 4 Session session = s.withOptions().interceptor(new YourInterceptor().openSession(); の実装で新しいセッション スコープのインターセプターを作成できます。

于 2013-12-20T11:14:09.713 に答える
8

どのフィールドが変更されたかを確認できるようにしたい場合は、ビジネス ロジック テーブルに加えられた変更を含む別のテーブルを作成する監査ツールとして機能する Hibernate Envers を検討する価値があります。

http://www.jboss.org/envers

内部監査に使い始めましたが、とてもシンプルで魅力的です。

簡単なチュートリアルは次のとおりです。

https://thenewcircle.com/s/post/115/easy_auditing_versioning_for_your_hibernate_entities_with_envers

于 2013-10-29T11:29:24.993 に答える
1

Hibernate インターセプターを使用できると思います http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.htmlエンティティ フィールドの古い値と新しい値を比較できます。

于 2013-12-19T15:44:25.573 に答える