我正在处理一个相当复杂的对象图表,存储在我的数据库中。我使用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]
看起来Hibernate的merge并不适用于将瞬态对象与持久对象关联。
有没有什么方法可以实现我想做的事情,而不必在会话中获取持久对象,修改它,而是修改暂态对象,并尝试保存它并覆盖现有的持久对象?