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

时间:2012-11-21 01:05:59

标签: 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 relationship that was not marked cascade PERSIST: RemovedParentObject[id=1].

我的实体具有以下关系注释。

在Parent类

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

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

确保没有其他现有对象引用您删除的对象。确保您没有合并引用已删除对象的对象。你确定错误是抱怨被删除的对象吗?

您是创建新的EntityManager还是使用现有的EntityManager?如果你创建一个新的吗?如果你只是在没有做任何事情的情况下开始并提交下一个交易,它会起作用吗?

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

同时检查提交是否成功,并且不会抛出错误。

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