Hibernate JPA配置CascadeType.ALL后外键字段未自动更新问题
问题原因
双向关联场景下,你配置的mappedBy声明了关系的维护方是多对一的一侧:
department_id外键的维护方是Employee实体的department属性employee_id外键的维护方是Phone实体的employee属性
你当前提交的JSON反序列化为Department对象后,关联的Employee对象的department属性、Phone对象的employee属性均为null,JPA只会根据关系维护方的属性值生成外键,所以入库时外键字段为null。CascadeType.ALL的作用仅为级联触发实体的CRUD操作,不会自动维护双向关联的属性引用关系。
解决方案
最简便的方案是在父实体的集合属性setter中自动绑定关联关系,无需修改业务层代码,反序列化阶段即可自动完成属性赋值:
1. 修改Department实体的setEmployees方法
public void setEmployees(List<Employee> employees) { this.employees = employees; // 非空判断避免空指针 if(employees != null) { employees.forEach(emp -> emp.setDepartment(this)); } }
2. 修改Employee实体的setPhones方法
public void setPhones(List<Phone> phones) { this.phones = phones; if(phones != null) { phones.forEach(phone -> phone.setEmployee(this)); } }
修改完成后直接保存Department对象即可,外键会自动填充入库。
内容的提问来源于stack exchange,提问作者welcome back
相关产品推荐
相关产品推荐

