アプリケーション管理の EntityManager を使用して、別のエンティティと 1 対多の関係を持つエンティティを削除しようとしています。オブジェクトは問題なく削除されたようですが、別のトランザクションを開いてコミットすると、次のエラーが発生します。
Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: RemovedParentObject[id=1].
私のエンティティには、次の関係注釈があります。
親クラスでは
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parentId")
private List<Child> childCollection;
子クラスでは
@JoinColumn(name = "PARENT_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne(optional = false)
private Parents parentId;
私の削除コードは、
// start database transaction window
EntityManager.getTransaction().begin();
// remove all children
for (Child child: parent.getChildCollection())
{
EntityManager.remove(child);
}
parent.getChildCollection().clear();
// remove parent
EntityManager.remove(parent);
// commit chages to the database
EntityManager.getTransaction().commit();
あるトランザクションで子のみを削除してコミットし、別のトランザクションを開いて親を削除してからコミットしようとしました。変化なし、エラーが発生します。
また、cascade.ALL アノテーションがあるため、子を削除せずに親のみを削除しようとしました。変化なし、エラーが発生します。
削除後、すべての親子をリフレッシュしてみました。更新されたリストには削除された親は表示されませんが、次に commit を呼び出すとエラーが発生します。
このコードが呼び出されると、親と各子が管理されます。削除プロセスが正しくないと想定しているため、将来のコミットが実行されたときに削除されたオブジェクトが検出されます。
私は間違って何をしていますか?