JPA @OneToOne关联Engine表car_id外键为NULL不更新问题
问题原因
你当前配置的双向@OneToOne关联中,关联关系的维护方是EngineDomain:CarDomain的@OneToOne注解添加了mappedBy = "car"属性,说明CarDomain是关联的被维护方,仅修改被维护方的engine属性不会触发数据库外键字段更新;只有修改维护方EngineDomain的car属性时,JPA才会同步更新engine表的car_id外键值。
你当前的保存逻辑只设置了CarDomain的engine属性,没有同步设置EngineDomain的car属性,因此外键字段会写入NULL。
解决方案
1. 保存时主动设置双向关联
修改你的业务保存代码,设置关联时同时给维护方赋值,示例如下:
// 错误写法(仅设置被维护端属性) CarDomain car = new CarDomain(); EngineDomain engine = new EngineDomain(); car.setEngine(engine); carRepository.save(car); // 正确写法(同时设置维护端属性) CarDomain car = new CarDomain(); EngineDomain engine = new EngineDomain(); car.setEngine(engine); // 新增这行,给维护方EngineDomain的car属性赋值 engine.setCar(car); carRepository.save(car);
你当前配置的cascade = CascadeType.ALL已经可以支持保存Car时自动级联保存关联的Engine,只要完成双向关联赋值就能正常写入car_id。
2. 增加实体辅助方法避免漏写
可以在CarDomain中封装关联维护的逻辑,避免业务代码漏写维护端赋值:
// 在CarDomain类中添加该方法 public void bindEngine(EngineDomain engine) { this.engine = engine; if (engine != null) { engine.setCar(this); } }
后续业务代码只要调用car.bindEngine(engine)即可自动完成双向关联设置。
内容的提问来源于stack exchange,提问作者bduarteregis
相关产品推荐
相关产品推荐

