2017-08-01 68 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;