我在项目中使用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);
}
您能告诉我如何删除实体,然后将其数据保存在另一个实体中吗?
此致
萨蒂亚
答案 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。