Java EntityManager删除同步期间找到的对象后

Java EntityManager删除同步期间找到的对象后,java,jpa,cascade,entitymanager,toplink,Java,Jpa,Cascade,Entitymanager,Toplink,我试图使用应用程序管理的EntityManager删除与另一个实体具有一对多关系的实体。该对象似乎被删除得很好,但当另一个事务被打开并提交时,我得到以下错误 Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relati

我试图使用应用程序管理的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;
我的删除代码是

 // 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时,会发生错误

调用此代码时,将管理父级和每个子级。我假设删除过程是不正确的,这就是为什么在将来执行提交时会发现删除的对象


我做错了什么?

确保没有其他现有对象引用您删除的对象。确保未合并引用已删除对象的对象。您确定该错误是由于删除的对象引起的吗

您是创建新的EntityManager还是使用现有的EntityManager?如果你创建一个新的,它能工作吗?如果您只是开始并提交下一个事务,而不做任何事情,那么它是否有效

您可以尝试禁用共享缓存,看看这是否会影响它

还要检查提交是否成功,并且没有抛出错误


还可以尝试使用最新版本。

这不应该在一个事务中完成吗?根据我的理解,每个实体管理器都链接到一个事务,每个实体都链接到其相应的实体管理器。如果您在另一个实体管理器上使用一个实体,则该代码被视为无效。@Adrian Shum,我相信上述代码在一个事务中删除了所有内容,如果没有,请告诉我另一个事务的开始位置。我使用同一个Entitymanager启动和结束事务,并使用同一个Entitymanager删除子项,然后删除父项。至少我相信我在上面的代码中就是这么做的。我确实说过我尝试了两个事务,但这并没有改变错误。哦,可能我误解了你的意思,因为我认为你正在做的是“在一个事务中删除子事务,在另一个事务中删除父事务”。那么我不太清楚你的问题是什么,就像你在问题的第一句话中说的那样,你说“当另一笔交易开始并完成时”啊,我明白你的意思了。执行上述代码后,即删除父对象和子对象后,我必须启动另一个事务来更改数据库中的另一个对象。当我尝试将该更改提交给另一个非父对象或子对象时,在删除过程结束后,我得到了这个错误。我提供了删除代码,因为错误引用了我认为已被上述代码删除的父级。您是否尝试从entity manager工厂为您的第二组操作获取新的EntityManager,而不是启动另一个事务,我确定第二笔交易发生时与我的实体经理不同。此问题仅在使用此不同引用时发生,而不是在删除后我使用同一实体管理器或不同实体管理器执行其他事务时发生。
 // 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();