2012-04-01 6 views
0

hibernateとdelete-orphanのカスケードに関する質問。その中にChildのコレクションを持つParentクラスがいくつかあるとします。親クラスのためのハイバーネイトマッピング は、1対多の関係のために、私はカスケードをすべて削除するオーファンを設定しました。すべての残りが正しく構成されているとします。Hibernate mapping:delete-orphan cascade

私は、親コレクション(.getChildren()。remove(A))から子Aを削除し、親オブジェクトを保存するためにsession.saveOrUpdate(P)を呼び出します。すべて削除孤立カスケードが設定されると、親オブジェクトは1つの子で保存され、別の削除された子(A)はDBから削除されます。これは正しい動作です。

私はhibernateがそのオブジェクト(P)を読み込んで、その子リストをいくつかのPersistentコレクション(例えばPersistentSet)にラップし、このコレクションを持つすべての操作が休止状態でインターセプトしているので、どの子を孤立して削除すべきかを決定できます。 dbから。

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

エンティティはデシベルからローダー後(オブジェクトをDO)それはドーザフレームワークを使用してオブジェクトに変換されたサービス(ファサードオブジェクト)に渡されます。変換後、DOオブジェクトからの永続的なコレクションはTOの単純なArrayListに変換されます。次に、UI に渡され、そこで変更できます(子コレクションから子Aを削除します)。私たちがそれを保存するために手を差し伸べると、それをファサードに渡します。そこでは、Doserを使用してDOオブジェクトに変換された後、session.saveOrUpdateを使用してDBに保存します。

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

カスケーディングは、saveOrUpdateの.merge instedを呼び出す場合にのみ機能します。これは、hibernateがオブジェクトをセッションに自動的にバインドしてから、それを更新するためだと思います。

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

これは一般的なシナリオと一般的な質問です。必要であれば、私は

答えて

0

session.saveOrUpdateが追跡エンティティのためであるなどのコード/マッピングを付けることができるようになり、session.mergeは

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