2017-08-01 69 views
-1

我有两个表部门和员工。 Department是Employee的父级,两者都由department_id加入。Spring-jpa中的关系无限递归

@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: 
+1

它无关休眠/弹簧JPA。如果传递给杰克逊的对象包含循环引用,则会遇到这种行为 –

回答

-1

有这种预期,杰克逊将遍历您参考,因为关系是双向的,将陷入无限的操作。

为了解决这个问题,你可以使用@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; 

} 
+0

但是,其目的是在部署加载时获取员工的灵活性以及加载员工时的部门详细信息 – Sam

+1

您不能在返回的JSON中拥有这种灵活性这是序列化的数据,而不是模型 –

0

您可以使用@JsonManagedReference@JsonBackReference

@JsonBackReference 
public Department department; 

,并在系车型

@JsonManagedReference 
public Set<Employee> employees 

它应该工作k现在:)

+0

但是在这种情况下,部门细节永远不会成为JSON权利的一部分? – Sam

+0

这将是..但嵌套(部门中的员工细节)不会 –

1

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

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

@JsonIgnoreProperties("employees") 
@ManyToOne 
@JoinColumn(name = "departmentId") 
public Department department;