2017-07-27 62 views
1

類員工:Java的Hibernate的JSON無限遞歸自引用類

@Entity 
@Table(name = "Employee") 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "EmployeeID") 
    private int EmployeeID; 

    @Column(name = "ManagerID") 
    private Integer ManagerID; 

    @ManyToOne(cascade={CascadeType.ALL}) 
    @JoinColumn(name="ManagerID", insertable = false, updatable = false) 
    @JsonBackReference 
    private Employee manager; 

    @OneToMany(mappedBy="manager") 
    @JsonManagedReference 
    private Set<Employee> employees; 

    @ManyToOne(cascade={CascadeType.ALL}) 
    @JoinColumn(name = "DepartmentID") 
    private Department department; 

    @ManyToOne(cascade={CascadeType.ALL}) 
    @JoinColumn(name = "SalaryTypeID") 
    private SalaryType salaryType; 

    @Column(name = "Name") 
    private String Name; 
    //setters and getters here, wont be posting them 
} 

每當我創建Employee的一個實例,我得到這個無限的JSON錯誤:

SEVERE: Servlet.service() for servlet [SpringMVC] in context with path 
[/SpringMVC] threw exception [Handler processing failed; nested exception is 
java.lang.StackOverflowError] with root cause 
java.lang.StackOverflowError 
at java.nio.CharBuffer.<init>(Unknown Source) 
at java.nio.HeapCharBuffer.<init>(Unknown Source) 
at java.nio.CharBuffer.wrap(Unknown Source) 
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source) 
at sun.nio.cs.StreamEncoder.write(Unknown Source) 
at sun.nio.cs.StreamEncoder.write(Unknown Source) 
at java.io.OutputStreamWriter.write(Unknown Source) 
at java.io.Writer.write(Unknown Source) 
at com.google.gson.stream.JsonWriter.string(JsonWriter.java:534) 
at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) 
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:495) 

(然後不斷去)

由於我是員工類員工中的自我引用經理,因此我該如何解決這個問題?

回答

0

有一堆的選擇取決於你的需求:

1)@JsonIgnore可以用來避免現場的系列化。

@OneToMany(mappedBy="manager") 
@JsonIgnore 
private Set<Employee> employees; 

2)@JsonView可以隱藏內部視圖的關係的一個部分(但會出現,如果你將寫JSON對象與Internal視圖):

@OneToMany(mappedBy="manager") 
@JsonView(Views.Internal.class) 
private Set<Employee> employees; 

@ManyToOne(cascade={CascadeType.ALL}) 
@JoinColumn(name = "DepartmentID") 
@JsonView(Views.Public.class) 
private Department department; 

3)Using custom serialiazer你可以確定自己構建JSON對象的規則。

4)使用上的類(@JsonIdentityInfo以指示該類型的屬性應啓用功能)以及關於各個屬性(支持其中type本身不能被註釋的情況下;或使用不同的ID生成序列)。

Example 1 @JsonIdentityInfo

Example 2 @JsonIdentityInfo