JPA一对多关系的toString()函数引发StackOverflowError

时间:2016-02-05 13:08:02

标签: java hibernate jpa jackson

我有两个JPA实体类,Task和TaskList。 TaskList和Task之间存在一对多关系(显然)与tasklist_id表中的task外键。

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()的正确对象?

2 个答案:

答案 0 :(得分: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
}

TaskList类

@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

答案 1 :(得分:0)

{!! Form::select('entity', $entityArray) !!} 调用tasks.toString()中的toString()的{​​{1}}默认实现列表中的每个元素时(对于每个AbstractCollection)。因此,您不应该使用默认实现并在循环中从toString()获取信息,并且当然不会为Task tasks调用toString()。您可以从Task获取并添加到结果字符串任务的ID或名称。