エンティティは関連付けの所有者であるため、リストはエンティティ状態の一部です。
そのため、Bean に何も含まれていない切り離されたエンティティをマージすると、Hibernate に通知されます。これはエンティティの新しい状態であり、オブジェクトはもう含まれていません。したがって、明らかに、Hibernate はエンティティと以前にリストに含まれていたオブジェクトとの間の関連付けを削除します。
私の推測ではmerge()
、セッションからエンティティを取得して変更し、このインスタンスを merge() に渡すのではなく、新しいエンティティ インスタンスを作成して に渡します。
代わりに:
SomeEntity e = new SomeEntity();
e.setId(34L);
e.setFoo("newFoo");
e = session.merge(e);
あなたがやるべきです:
SomeEntity e = session.get(SomeEntity.class, 34L);
e.setFoo("newFoo");
// if the entity is detached:
e = session.merge(e);
あなたの問題は、孤児の削除とは何の関係もないことに注意してください。孤立した手段を削除します。親と子の間の関連付けを削除すると、子エンティティ自体が自動的に削除されます。