弹簧中的关系-JPA 无限递归



>我有两个表部门和员工。部门是员工的父级,两者都由department_id加入。

部门

@Entity
public class Department {
@Override
public String toString() {
return "Department [departmentId=" + departmentId + ", departmentName=" + departmentName + "]";
}
@Id
public Integer departmentId;
public String departmentName;
@OneToMany(mappedBy = "department",fetch=FetchType.LAZY)
public Set<Employee> employees;
}

员工

@Entity
public class Employee {
@Override
public String toString() {
return "Employee [employee_id=" + employeeId + ", employee_name=" + employeeName + ", department="
+ department + "]";
}
@Id
public Integer employeeId;
public String employeeName;
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;
}

当我尝试检索所有部门详细信息时,它正在创建一个循环依赖项,杰克逊抛出以下错误。所以我想知道如何处理这种情况,您需要灵活地从父级访问子详细信息并从子级访问父级详细信息。

2017-08-01 12:03:13.245  WARN 18197 --- [o-auto-1-exec-3] 
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: 
org.springframework.http.converter.HttpMessageNotWritableException: Could not 
write JSON: Infinite recursion (StackOverflowError); nested exception is 
com.fasterxml.jackson.databind.JsonMappingException:

我能够使用以下方法@JsonIgnoreProperties实现此解决方案。通过使用这种方式,我能够在员工中获取部门和部门级别详细信息中的员工详细信息,并避免无限递归

@JsonIgnoreProperties("department")
@OneToMany(mappedBy = "department",fetch=FetchType.EAGER)
public Set<Employee> employees;
@JsonIgnoreProperties("employees")
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;

您可以使用@JsonManagedReference@JsonBackReference

@JsonBackReference
public Department department;

和部门模型

@JsonManagedReference
public Set<Employee> employees

它现在应该可以工作:)

是的,这是意料之中的,杰克逊将迭代您的引用,并且由于关系是双向的,因此它将卡在无限操作中。

要解决此问题,您可以使用@JsonIgnore忽略序列化关系的一侧以中断循环

@Entity
public class Employee {
@Override
public String toString() {
return "Employee [employee_id=" + employeeId + ", employee_name=" + employeeName + ", department="
+ department + "]";
}
@Id
public Integer employeeId;
public String employeeName;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;
}

最新更新