Hibernate映射关联的Set调用clear方法后未真正清除数据问题
问题原因与解决方案
核心原因
- 你配置的是双向
@OneToMany关联,mappedBy = "customObject"标识当前实体是关系被维护方,关联关系的控制权完全在MyCustomObject实体的customObject外键字段上,直接清空被维护方的集合不会触发数据库层面的关联修改或数据删除。 - 你第一次看到集合为空只是内存中当前对象的临时状态,只要没有主动修改维护端的关联属性,下次JPA刷新持久化上下文、或者重新从数据库加载关联集合时,就会把数据库中仍然存在的关联数据重新查询并填充到集合中,看起来就像数据"恢复"了。
操作错误
- 没有遵循双向关联的操作规范,仅修改了被维护端的集合,没有同步修改维护端的关联属性。
- 如果你期望清空集合的同时删除
MyCustomObject对应的数据库数据,仅调用集合clear()方法是不够的,没有配置对应的删除策略也会导致操作不生效。
正确处理方式
场景1:仅解除关联,保留MyCustomObject数据
遍历集合内的所有元素,将每个元素的customObject属性置为null,再清空集合,最后提交事务即可:
for (MyCustomObject obj : this.objectss) { obj.setCustomObject(null); } this.objectss.clear(); // 后续执行merge操作或者直接提交事务
场景2:清空集合同时删除所有关联的MyCustomObject数据
首先在@OneToMany注解上添加orphanRemoval = true配置:
@OneToMany(mappedBy = "customObject", cascade = CascadeType.ALL, orphanRemoval = true) private Set<MyCustomObject> objectss = new HashSet<>();
配置完成后直接调用this.objectss.clear(),JPA会自动删除数据库中对应的MyCustomObject记录,不会再出现数据恢复的问题。
内容的提问来源于stack exchange,提问作者jzg
相关产品推荐
相关产品推荐

