2016-02-05 17 views
1

我有兩個JPA實體類,任務和TaskList。 TaskList和Task(顯然)與表中的tasklist_id外鍵之間存在一對多關係。toString()函數爲JPA一對多關係引發StackOverflowError

Task類是這樣的:

@Entity(name = "task") 
public class Task implements Serializable {  

    // Id and 3 fields 

    @ManyToOne 
    @JoinColumn(name="tasklist_id") 
    private TaskList parentList; 

    // 3 more fields 

    // Constructor 
    public Task() {} 

    //Getters and Setters 
} 

TaskList類是這樣的:

@Entity(name = "task_list") 
public class TaskList implements Serializable { 

    // Id and two fields 

    @OneToMany(mappedBy="parentList") 
    private List<Task> tasks; 

    // Constructor 
    public TaskList() {} 
} 

當我嘗試自動getter和setter添加到這兩個類和一個toString()函數,我得到一個StackOverflowError。

我該如何着手寫兩個字段的getter和setter,以便我得到一個合適的對象toString()

+0

漂亮的喜歡它不是一個JPA /休眠。閱讀本[問題](http://stackoverflow.com/questions/3593893/why-im-getting-stackoverflowerror),也許它可能與你有關。 – Bonifacio

回答

2

爲未來的讀者,該解決方案是使用後向引用:

任務等級:

@Entity(name = "task") 
public class Task implements Serializable {  

    // Id and 3 fields 

    @JsonBackReference("task_list-task") 
    @ManyToOne 
    @JoinColumn(name="tasklist_id") 
    private TaskList parentList; 

    // 3 more fields 

    // Constructor 
    public Task() {} 

    //Getters and Setters 
} 

任務列表類

@Entity(name = "task_list") 
public class TaskList implements Serializable { 

    // Id and two fields 

    @JsonManagedReference("task_list-task") 
    @OneToMany(mappedBy="parentList") 
    private List<Task> tasks; 

    // Constructor 
    public TaskList() {} 
} 
  • 添加合適的註釋。將ManagedReference添加到@OneToMany(父級),並將BackReference添加到@ManyToOne(子級)。按照指示在括號中書寫表格名稱,用連字符分隔。

這會自動處理無限遞歸,解決StackOverflowError問題。

一些鏈接:

http://keenformatics.blogspot.in/2013/08/how-to-solve-json-infinite-recursion.html
http://vard-lokkur.blogspot.in/2010/10/json-jackson-to-rescue.html

+0

你的回答並不對應你的問題。你的問題是關於'toString()'實現,而不是轉換對象net到JSON。 :) –

+0

該解決方案解決了直接使用toString()導致的基本問題 - 無限遞歸。傑克遜在那裏使用,如錯誤日誌中所示,所以這些註釋是相關的。另外,我已經在我自己的代碼中親自測試了這個。 :) – cst1992

+0

在你的問題中沒有錯誤日誌,傑克遜或json標籤。 :) –

0

當你tasks.toString()toString()AbstractCollection呼叫toString()默認實現在列表(每Task)的每一個元素。所以你不應該使用默認實現並且從tasks得到循環中的信息,當然每Task不要調用toString()。您可以從Task中獲取並添加到結果字符串任務的ID或名稱。