Hibernate多对多关联Employees与SchoolDepartment无限递归问题求助
问题本质
你遇到的递归是JSON序列化阶段的双向关联循环调用:Employee持有EmployeeSchoolDepartment集合,集合内的每个中间表对象又反向关联Employee实体,SchoolDepartment和中间表的关联也遵循相同逻辑,序列化时会触发无限嵌套循环。
可选解决方案
方案1:用@JsonManagedReference + @JsonBackReference截断反向序列化链路
适合不需要从中间表反向嵌套展示主实体完整信息的场景,完全避免循环,同时保留主实体到关联集合的正常序列化。
- 先删除Employee类中
employeeSchoolDepartments字段上的@JsonIgnore注解,否则整个集合会被直接忽略无法展示 - 对应字段修改如下:
- Employee实体集合字段:
@OneToMany(mappedBy="employee") @JsonManagedReference("employee-eds-ref") Set<EmployeeSchoolDepartment> employeeSchoolDepartments;
- SchoolDepartment实体集合字段:
@OneToMany(mappedBy="schoolDepartment") @JsonManagedReference("dept-eds-ref") Set<EmployeeSchoolDepartment> employeeSchoolDepartments;
- EmployeeSchoolDepartment实体关联字段:
@ManyToOne() @MapsId("employee_id") @JoinColumn(name="employee_id") @JsonBackReference("employee-eds-ref") private Employee employee; @ManyToOne() @MapsId("school_deparment_id") @JoinColumn(name="school_department_id") @JsonBackReference("dept-eds-ref") private SchoolDepartment schoolDepartment;
方案2:用@JsonIdentityInfo按ID去重序列化
适合需要保留双向关联查询能力的场景,不会截断关联链路,遇到已经序列化过的实体时仅输出实体ID,不会重复序列化完整对象。
在三个实体类上分别添加对应注解即可:
- Employee类:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId") public class Employee { // 原有代码无需修改 }
- SchoolDepartment类:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class SchoolDepartment { // 原有代码无需修改 }
- EmployeeSchoolDepartment类:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class EmployeeSchoolDepartment { // 原有代码无需修改 }
内容的提问来源于stack exchange,提问作者Halit Kalayci
相关产品推荐
相关产品推荐

