Hibernate双向一对多映射关联已持久化子实体外键为空如何解决
问题根源
你配置的双向关联中,关系的维护方是Child实体的parent字段,@OneToMany(mappedBy = "parent") 表明Parent类的children集合只是反向查询的映射,不负责维护外键关系。只有修改Child实体的parent属性并持久化到数据库,才会更新child表的parent_id字段。
解决方案
不需要给Parent的@OneToMany添加多余的cascade配置,只要调整持久化逻辑,主动更新已经设置了parent属性的Child实体即可,调整后的Seeder代码如下:
@Autowired private ParentRepository parentRepository; @Autowired private ChildRepository childRepository; Child c1 = new Child(); // 修正原代码的变量笔误:cr1改为c1 childRepository.save(c1); Parent p1 = new Parent(); p1.addChild(c1); parentRepository.save(p1); // 新增这行,主动更新关联了Parent的Child对象 childRepository.save(c1);
补充说明
- 如果你开启了
CascadeType.MERGE,且整个Seeder逻辑在同一个事务内运行,那么save Parent的时候会级联更新Child,也能实现外键写入。但显式保存关系维护方(Child)的逻辑更清晰,不容易受事务边界、级联配置的影响出现异常。 - 如果需要同时关联多个已持久化的Child,可以调用
childRepository.saveAll(p1.getChildren())批量更新,性能更高。
内容的提问来源于stack exchange,提问作者Nirojan Selvanathan
相关产品推荐
相关产品推荐

