我正在处理我的数据库中一个相当复杂的对象图。我正在使用 XStream 序列化和反序列化这个工作正常的对象图。当我导入数据库中存在的对象的对象图时,它最初是瞬态的,因为没有 ID 并且 hibernate 对此一无所知。然后,我有业务逻辑,通过确定新临时导入的对象映射到现有持久对象中的哪些对象,在我的对象图的某些部分上设置 ID。然后我使用 Hibernate 的 merge() 和 saveOrUpdate()。
一些伪代码可以让您更好地了解我在做什么:
ComplexObject transObj = xstream.import("object.xml");
ComplexObject persistObj = someService.getObjByName(transObj.getName());
for (OtherObject o : c.getObjects()) {
if (persistObj.getObjects().contains(o.getName())) {
o.setId(persistObj.getObjectByName(o.getName()).getId())
}
... set a bunch of other IDs deeper in the object graph ...
}
transObj = session.merge(transObj);
session.saveOrUpdate(transObj);
现在这不起作用,因为我收到以下错误:
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]
似乎休眠合并并不意味着将瞬态对象与持久对象相关联。
有什么方法可以实现我想要做的事情,而不必在会话中获取持久对象并对其进行修改,而不是修改瞬态对象,并尝试保存并覆盖现有的持久对象?