2017-07-27 61 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