エンティティを更新しようとすると、次の問題が発生します。
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
親エンティティがあり、そのSet<...>
エンティティにはいくつかの子エンティティがあります。これを更新しようとすると、すべての参照がこのコレクションに設定され、設定されます。
次のコードはマッピングを表しています。
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
これに従って、Set<..> のみをクリーンアップしようとしました:問題を「可能な限り」解決する方法しかし、それは機能しませんでした。
何かアイデアがありましたら、お知らせください。
ありがとう!
ベストアンサー1
sonEntities に何かを割り当てている場所をすべて確認してください。参照したリンクでは、新しい HashSet を作成することが明確に示されていますが、セットを再割り当てするといつでもこのエラーが発生する可能性があります。例:
public void setChildren(Set<SonEntity> aSet)
{
this.sonEntities = aSet; //This will override the set that Hibernate is tracking.
}
通常、コンストラクターでセットを「新規作成」するのは 1 回だけです。リストに何かを追加または削除するときは、新しいリストを割り当てるのではなく、リストの内容を変更する必要があります。
子供を追加するには:
public void addChild(SonEntity aSon)
{
this.sonEntities.add(aSon);
}
子を削除するには:
public void removeChild(SonEntity aSon)
{
this.sonEntities.remove(aSon);
}