@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 つの親が許可されていないため、古いリレーションを削除する前に新しいリレーションを追加しようとすると、制約違反が発生します。
更新の正しい順序を強制するにはどうすればよいですか? または、この状況で追加のテーブルを使用しないようにするにはどうすればよいですか?