1

FetchTypeEAGERorphanRemovalがtrueに設定されたBのOneToManyコレクションを持つエンティティAがあるとします。デタッチされ、コレクションからいくつかのB要素が削除された(デタッチ中に) AオブジェクトでEntityManager#mergeを呼び出すと、それぞれの行(エンティティがコレクションから欠落している)がデータベースから削除されます(JPA / Hibernate内) )。

LAZYコレクションの場合、それはどの程度正確に機能しますか?EntityManagerが変更されたAオブジェクトをマージするように求められた場合、コレクションから明示的に削除されたBエンティティとLAZYフェッチタイプのためにフェッチされなかったBエンティティの違いをどのように見分けることができますか?

4

1 に答える 1

3

JPA 実装は、初期化されたか、まだ遅延状態にあるコレクションのフラグを保持する必要があります。

したがって、以前にデタッチされたエンティティをマージする場合、マージ操作はコレクションを検査し、初期化されている場合のみコンテンツを列挙して、データベースからフェッチされたエンティティに対する変更を見つけます。

ただし、新しいインスタンスをインスタンス化してマージに渡すと、コレクションは初期化済みとして扱われ、コレクションが空の場合、JPA はすべてのコレクション項目を削除します。

立ち寄って、新しい JPA 実装である Batoo JPA http://batoo.jpを試してみてください。これは、市場に出回っている現在の JPA 実装よりも 15 倍以上高速です。

于 2012-11-01T22:32:07.167 に答える