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

看来我的设置正确。

我一定要吗

  1. 首先从数据库中的虚拟对象对象中加载相应的对象(使用我的反序列化对象具有的ID)
  2. 删除对其他对象的引用
  3. 保存更改
  4. 用我的反序列化对象更新


问题答案:

从根本上讲,无需清除即可执行此操作。

我要做的就是调用正确的函数。

采用 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);
}

这将删除原本应该的。

如果有人遇到相同的问题,请不要犹豫,我愿意为您提供帮助。