0

hibernate と delete-orphan カスケードに関する質問。その中に子のコレクションを持つ親クラスがあるとします。一対多関係の親クラスの休止状態のマッピングで、カスケード all-delete-orphan を設定しました。残りはすべて正しく構成されているとします。

そこで、親 P に 2 つの子オブジェクト A と B を読み込みます。次に、子 A を親コレクションから削除し (.getChildren().remove(A))、session.saveOrUpdate(P) を呼び出して親オブジェクトを保存します。all-delete-orphan カスケードが設定されているため、親オブジェクトは 1 つの子と共に保存され、別の削除された子 (A) が DB から削除されます。それは正しい行動です。

私が理解しているように、休止状態がそのようなオブジェクト (P) をロードすると、その子リストがいくつかの永続コレクション (PersistentSet など) にラップされ、このコレクションのすべての操作は休止状態によってインターセプトされ、これにより、どの子を db から孤立して削除するかを決定できます。

しかし..私は次のプロジェクトアーキテクチャを持っています:

エンティティが db (DO オブジェクト) からローダーになった後、サービス (ファサード オブジェクト) に渡され、Dozer フレームワークを使用して TO オブジェクトに変換されます。変換後、DO オブジェクトからの永続的なコレクションは、TO の単純な ArrayList に変換されます。次に、変更可能な UI に渡されます (子コレクションから子 A を削除します)。それを保存したいときは、それをfacadeに渡し、Doserを使用してDOオブジェクトに変換し直してから、DBに保存します(session.saveOrUpdateを使用)。

この場合、カスケードは機能せず、削除された子は孤立しません。それはまだdbに表示されています。

カスケードは、saveOrUpdate の代わりに .merge を呼び出した場合にのみ機能します。休止状態が自動的にオブジェクトをセッションにバインドし、それを更新するためだと思います。

それで、誰かが私にこの行動を説明できますか?このような DO -> TO -> DO 変換を使用して、delete-orphan カスケードをサポートすることは可能ですか?

これは、よくあるシナリオとよくある質問です。必要に応じて、コード/マッピングなどを添付できます。

4

1 に答える 1

0

session.saveOrUpdateは追跡されたエンティティ用であり、session.mergeは追跡されていないエンティティ用です

session.mergeは、このシナリオを対象としています。変更があった追跡されていないエンティティがあり、書き戻す必要があります。マージは、指定したオブジェクトのID(注:カスケード)に基づいてエンティティをロードし、状態をこれらの追跡されたエンティティにコピーし、変更は次のフラッシュで保存されます。

于 2012-04-08T11:40:35.407 に答える