有个部门表dept,这类有多对1父部门引用parent(此为Dept Domain类中的外键引用),也有1对多子部门集合children。
要做的事情是:删除子部门,并更新父部门状态。
当时我的做法是:1。删除Dept dele 子对象;2。再更新Dept parent父对象。思路很符合逻辑,但结果Hibernate报错了——
原因是:执行步骤1删除后,parent的children集合对应的Dept没有同步更新;再更新parent时,子集合children会一同更新,包括本应被删除的Dept对象。这时Hibernate会报错。
这么说得不明白,还是直接上代码清晰。
错误的代码:
DeptInfo deptInfo = deptInfoDao.get(deptId);//装载该节点信息——为了获取父节点的信息
DeptInfo parent = deptInfo.getParentDeptInfo();
deptInfoDao.deleteDeptById(deptInfo);
if(parent!=null){
parent.setLeaf(true);
this.save(parent);//这里报错
}
正确的代码:
DeptInfo deptInfo = deptInfoDao.get(deptId);//装载该节点信息——为了获取父节点的信息
DeptInfo parent = deptInfo.getParentDeptInfo();
if(parent==null){
deptInfoDao.deleteDeptById(deptInfo);
}else {
parent.getChildren().remove(deptInfo);//直接从子集中删除,问题解决
parent.setLeaf(true);
this.save(parent);
}
}