次の問題を達成するために Hibernate (...) を設定する方法を知る必要があります。
双方向 (構成) の 1 対多の関連付けがあります (a.bs は Set オブジェクトで、ba は A オブジェクトです)。DB から「a」をロードし、その「bs」の 1 つを更新すると、saveOrUpdate A のときに Hiernate インターセプト A エンティティが必要になります。
コード:
public class A {
Set<B> bs = new HashSet<B>();
// ... other fields and setters/getters
}
public class B {
A a = null;
// ... other fields and setters/getters
}
使用事例:
A a = load("idA"); // load A from DB
B b = s.getBById("idB"); // get a B element of A
b.setName("blablabla"); // update a field of B
saveOrUpdate(a); // persist A entity with its Bs (including modified B)
(ミニ) モデルに適切に注釈が付けられているため、変更が実行されます。
問題は、インターセプターがエンティティ B の変更のみを検出し、エンティティ A の変更を検出しないことです。監査情報を更新する必要があるため、A の変更を検出する必要があります。
他の観点は次のとおりです。B を介して A エンティティを取得し、更新する必要があります。実際、BからAを取得できますが、変更は永続化されません...
質問 を単純化すると、インターセプターが B エンティティをインターセプトするときに A エンティティを変更する (日付を設定する) 必要があります。onSave では問題なく動作しますが、onFlushDirty では動作しません。なんで?
これは: B が更新されると、インターセプトされます (onFlushDirty)。onFlushDirty メソッドの本体は、とりわけ、次のことを行います。
b.getA().setLastModifyDate(new Date());
したがって、その瞬間に、セッションに接続されている A エンティティがダーティになる必要があるため、傍受アクションを発生させる必要があります...つまり、 onFlushDirty メソッドを再度呼び出す必要があります。私が間違っている?しかし、いずれにせよ、 A.lastModifyDate を更新する必要があります...そしてこれは起こっていません!!!
次に、アプリケーションの実際の動作を示します。
- A オブジェクトを作成します
- B オブジェクトを作成し、それを A に関連付けます
A => A.lastModifyDate は正しい日付です ( OK )
A オブジェクトを作成します
- B オブジェクトを作成し、それを A に関連付けます
- A => A.lastModifyDate は正しい日付です ( OK )
B オブジェクトをロードし、更新して B を永続化します -> A.lastModifyDate は正しい日付です ( OK )
A オブジェクトを作成します
- B オブジェクトを作成し、それを A に関連付けます
- A => A.lastModifyDate は正しい日付です ( OK )
A オブジェクトを読み込み、その B オブジェクトを更新し、A を永続化します -> A.lastModifyDateが正しい日付ではありません( KO )
A オブジェクトを作成します
- B オブジェクトを作成し、それを A に関連付けます
- A => A.lastModifyDate は正しい日付です ( OK )
A オブジェクトをロードし、A のフィールドとその B オブジェクトを更新し、A を永続化します -> A.lastModifyDateが正しい日付ではありません( KO )
A オブジェクトを作成し、それを永続化します。
A オブジェクトをロードし、それに新しい B オブジェクトを関連付け、A を永続化します => A.lastModifyDate は正しい日付です ( OK )
A オブジェクトを作成し、それを永続化します。
- A オブジェクトをロードし、A のフィールドを更新し、それに新しい B オブジェクトを関連付け、A を永続化します => A.lastModifyDate は正しい日付です ( OK )
何か案が?
ありがとう!