web-dev-qa-db-ja.com

Hibernate:変更されたエンティティのフィールドを確認します

私が持っているもの:

コレクションを含む多くの非一時的なフィールドを含む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は、どのフィールドが変更されたかを確認するためのよりエレガントな方法を提供できますか?どうやって?

P.S。

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

20
VB_

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

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

16
Alok

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

http://www.jboss.org/envers

私はいくつかの内部監査のためにそれを使い始めました、そしてそれは本当にシンプルで魅力のように機能します。

これは簡単なチュートリアルです:

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

7
victorantunes

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

1
Bimalesh Jha