2

我正在尝试使用应用程序管理的 EntityManager 删除与另一个实体具有一对多关系的实体。该对象似乎被删除得很好,但是当另一个事务被打开然后提交时,我得到以下错误。

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 回答