私は、親が子供の 1 人と個別の 1 対 1 の関係を持つ休止状態の親子関係を持っています。参照された子が一時的なものである場合、どうすれば親と子を永続化できますか?
次のようなスキーマがあります。
PARENT(PARENT_ID, SOME_DATA, SPECIAL_CHILD_ID)
CHILD(CHILD_ID, PARENT_ID, CHILD_DATA)
...そして次のようなエンティティ:
class Parent {
Child getSpecialChild();
SortedSet<Child> getChildren();
}
class Child {
Parent getParent();
}
同じトランザクションで一時的な親と一時的な子を作成しています。親を永続化しようとすると (specialChild と子の両方をカスケード)、DB から一意制約エラーが発生します。これは、hibernate が 2 つの挿入 (1 つは specialChild 用、もう 1 つは子の同じ子用) を生成しようとするためです。デバッガーを使用して、specialChild と children()が一時的な子オブジェクトの同じインスタンスを保持していることを確認しました。
私の実際のビジネス ケースでは、SPECIAL_CHILD_ID フィールドを削除することで問題を回避できました。ただし、本当にこの方法で行う必要がある場合、データを正しく永続化するにはどうすればよいでしょうか?