Hibernate Cascade =“ All-delete-orphan”,不删除孤立项
问题内容:
我无法通过以下映射使用Hibernate删除孤立节点
@OneToMany(fetch = FetchType.LAZY, mappedBy = "seizure",orphanRemoval=true)
@JsonManagedReference
@Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})
public Set<SubstanceIdentified> getSubstanceIdentifieds() {
return this.substanceIdentifieds;
}
.hbm.xml映射是这样的
<set name="substanceIdentifieds" table="substance_identified" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
<key>
<column name="seizure_id" not-null="true" />
</key>
<one-to-many class="org.unodc.incbszdb.db.base.SubstanceIdentified" />
</set>
我使用Spring MVC和Jackson进行JSON到Hibernate类的映射
@RequestMapping(value = { "/save.json" }, method = RequestMethod.POST)
public ModelMap save(@RequestBody Seizure seizureObj, Model model) {
seizureService.saveOrUpdate(seizureObj);
注意:
seizureObj
集合中只有两个 NEW 条目substanceIdentifieds
。
的id属性seizureObj
设置为数据库中的现有记录。但是当我调用saveOrUpdate时,现有记录(孤立)不会被删除。
扣押服务使用Spring的
getHibernateTemplate.saveOrUpdate
看来我的设置正确。
我一定要吗
- 首先从数据库中的虚拟对象对象中加载相应的对象(使用我的反序列化对象具有的ID)
- 删除对其他对象的引用
- 保存更改
- 用我的反序列化对象更新
?
问题答案:
从根本上讲,无需清除即可执行此操作。
我要做的就是调用正确的函数。
采用 HibernateDaoSupport.getHibernateTemplate().merge(object)
在我的代码中,我首先测试jackson的反序列化对象是否附加了ID
如果是这样,我就叫保存,否则就叫合并。
if(obj.getId()){
myDAO.save(obj);
}else{
myDAO.merge(obj);
}
我的DAO的合并功能就是这样定义的。
public void merge(E transientObject) {
getHibernateTemplate().merge(transientObject);
}
这将删除原本应该的。
如果有人遇到相同的问题,请不要犹豫,我愿意为您提供帮助。