2016-09-01 38 views
1

這個特定的環境下的程序: EJB3.0 + JPA +球衣Web服務JPA雙向一對多JSON無限循環

第一實體:

@Entity 
@Table(name = "student_by_test_yao") 

public class StudentTest implements Serializable { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "class_id") 
    private ClassTest classes; 

    public StudentTest() {} 
} 

第二實體:

@Entity 
@Table(name = "class_by_test_yao") 
public class ClassTest implements Serializable{ 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 

    @OneToMany(mappedBy = "classes",cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    private List<StudentTest> students; 

    public ClassTest() {} 
} 

當我拿到ClassTest的學生名單時。 的例外是:

com.fasterxml.jackson.databind.JsonMappingException: 
Infinite recursion (StackOverflowError) 

如果我改變了獲取FetchType.LAZY唯一的例外是:

org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role: 
cn.gomro.mid.core.biz.goods.test.ClassTest.students, 
could not initialize proxy - no Session 

如何解決我的問題呢?

回答

0

嘗試@JsonIgnore註釋添加到一個領域,以避免循環

+0

@JsonIgnore是沒用的。仍然在Excepton的'org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:167)引起:com.fasterxml.jackson.databind.JsonMappingException: 無限遞歸(StackOverflowError)' –

+0

嗯,奇怪。它幫助我,當我有同樣的異常 –

0

對於雙向關係中,你可以使用這些批註:

@JsonManagedReference家長和@JsonBackReference的孩子。

而且,這個鏈接可以幫助: Jackson – Bidirectional Relationships

+0

其實我需要在ClassTest中獲得List也得到StudentTest中的實體。 –

+0

對不起,我不確定我是否得到了那個.. 您希望能夠從StudentTest中從ClassTest和ClassTest中獲取StudentTest? –

+1

使用\ @JsonManagedReference和\ @JsonBackReference,您應該能夠在反序列化過程中重建關係的兩個方向。 當然,在JSON表示中,關係的兩邊都不是序列化的,否則你會在堆棧溢出中產生,因爲entites會保持相互引用。 –