0

@OneToMany および @ManyToOne アノテーションで実装された親子関係を持つツリーがあります。

すべての子には @ManyToOne 親フィールドがあり、すべての親には @OneToMany があります。

子と親の両方が異種であり、任意のタイプのエンティティが任意の親タイプの親に属している可能性があります。

この状況では、@ManyToMany リレーションの場合と同様に、Hibernate は追加の parent_child テーブルを使用してリレーションを作成および管理します。

オブジェクトの親の変更を実装しようとして制約違反が発生するまで、すべてがうまくいきました(オブジェクトを作成および削除できました)。

操作は次のように実装されました。

oldParent.children.remove(child);
child.parent = newParent;
newParent.children.add(child);

予想どおり、Hibernate は 3 つの変更要求を生成します。1 つは child.parent 値を更新するため、2 つは古い親と新しい親の子コレクションを更新するためです。

問題は、コレクションの更新の順序が間違っていることです。2 つの親が許可されていないため、古いリレーションを削除する前に新しいリレーションを追加しようとすると、制約違反が発生します。

更新の正しい順序を強制するにはどうすればよいですか? または、この状況で追加のテーブルを使用しないようにするにはどうすればよいですか?

4

2 に答える 2

2

最初の削除後、フラッシュを呼び出す必要があります。これにより、最初の親関係が削除されます。親と子をリロードすると、それらを互いに関連付けることができるはずです。

于 2012-10-05T15:26:32.707 に答える
0

実際には、必要がない限り、どのフェーズでも flush() を呼び出す必要はありません。私はHibernateについて話すことはできませんが、JPA標準では、実装は、ドメインで必要な制約を尊重して実行する順序でステートメントを順序付けする必要があります.

Batoo JPAで同じケースを試して、うまくいくかどうかお知らせください。そうでなければ、私たちはあなたを助けることができます.

于 2012-10-05T18:37:43.980 に答える