2

アプリケーション管理の 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 を呼び出すとエラーが発生します。

このコードが呼び出されると、親と各子が管理されます。削除プロセスが正しくないと想定しているため、将来のコミットが実行されたときに削除されたオブジェクトが検出されます。

私は間違って何をしていますか?

4

1 に答える 1

0

削除したオブジェクトを参照している既存のオブジェクトが他にないことを確認します。削除されたオブジェクトを参照するオブジェクトをマージしていないことを確認してください。エラーは、削除されたオブジェクトについて不平を言っていますか?

新しい EntityManager を作成しますか、それとも既存のものを使用しますか? 新規作成しても大丈夫でしょうか?何もせずに次のトランザクションを開始してコミットした場合、それは機能しますか?

共有キャッシュを無効にして、影響があるかどうかを確認できます。

また、コミットが成功し、エラーがスローされないことも確認してください。

また、最新のリリースを使用してみてください。

于 2012-11-21T14:58:54.987 に答える