我正在尝试使用应用程序管理的 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 时会发生错误。
调用此代码时管理父级和每个子级。我假设删除过程不正确,这就是为什么在执行未来提交时会找到删除的对象。
我做错了什么?