不能坚持一个实体

时间:2011-03-07 18:13:36

标签: jpa jpa-2.0 hsqldb

我在项目中使用JPA 2.0。

我删除和实体,然后尝试保留相同的数据,但它抛出:

org.hibernate.ObjectDeletedException: deleted instance passed to merge

以下是我的表现:

for(Education edu : educations) {
    entManager.remove(edu);
    Education tempEdu = new Education();
    tempEdu.setCourse(edu.getCourse());
    tempEdu.setInstitution(edu.getInstitution());
    tempEdu.setPlace(edu.getPlace());
    tempEdu.setFromDate(edu.getFromDate());
    tempEdu.setToDate(edu.getToDate());
    tempEdu.setMember(updatedMem);
    entManager.merge(tempEdu);
}

您能告诉我如何删除实体,然后将其数据保存在另一个实体中吗?

此致

萨蒂亚

2 个答案:

答案 0 :(得分:0)

我认为remove操作级联到您稍后使用的某些关系:

tempEdu.setCourse(edu.getCourse());
tempEdu.setInstitution(edu.getInstitution());
tempEdu.setPlace(edu.getPlace());

尝试评论这些行,看看它是否有效。如果是这样,您必须删除此关系上的级联,或者创建此对象的副本,就像使用tempEdu一样。

这导致了 axtavt 已经提出的问题 - 你想要实现什么?你最终会删除一堆对象,然后重新创建它们并保存回来......

答案 1 :(得分:0)

由您在评论中发布 - 如果在UI中删除/编辑/添加任何实体,我会删除所有相关实体,然后重新创建来自UI的实体...

维护两个列表,一个用于数据库和实体中的实体。另一个用于UI。

//---

dbEntries.removeAll(uiEntries);  // dbEntries will have entities to be deleted 

for(Education edu : dbEntries){

  em.remove(edu);  // Deleting entries not found in UI
}

for(Education edu : uiEntries){

  em.merge(edu);  // Updating existing entity else persisting new one
}

//---

通过这种方式,你可以实现你到目前为止的尝试,指出我是否做错了。

在你的代码中,尝试在删除edu之前合并tempEdu。