Hibernate开启orphanRemoval后移动实体被意外删除问题咨询
这不属于Hibernate异常,是orphanRemoval = true配置和你操作顺序冲突导致的正常执行结果。
问题根因
你的Element实体中,subActivities属性配置了orphanRemoval = true,这个配置的作用是:当实体从父节点的子列表中被移除、且没有其他父级关联时,Hibernate会将其判定为「孤儿实体」,在事务提交时自动执行删除操作。
你当前的moveInto方法执行顺序是先从旧父节点移除、再添加到新父节点:
- 执行
remove(tnode)时,你先把tnode从旧父节点的subActivities中移除,同时将tnode.parent设为null,此时Hibernate直接将tnode标记为待删除的孤儿实体 - 后续执行
add操作将tnode加入新父节点时,Hibernate不会自动撤销已经标记好的删除操作,事务提交后tnode就会被直接删除。
修复方案
调整操作顺序即可,先把节点加到新父节点,再从旧父节点移除,保证节点全程不会处于无父级的孤儿状态:
// 修改moveInto方法的执行顺序 void moveInto(Element parent, Element tnode) { // 先添加到新父节点 this.add(parent, tnode); // 再从旧父节点移除 this.remove(tnode); }
同时建议补全Element实体的equals和hashCode方法,基于主键id实现,避免集合操作时出现匹配异常。
内容的提问来源于stack exchange,提问作者Guyard
相关产品推荐
相关产品推荐

