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



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

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()

对于未来的读者,解决方案是使用反向引用:

任务类:

@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() {}
}
  • 添加适当的批注。将"托管引用"添加到"@OneToMany(父级)",将"反向引用"添加到"@ManyToOne(子级)"。按指示在括号中写表名,用连字符分隔。

这会自动处理无限递归,从而解决 StackOverflowError 问题。

一些链接:


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

当您在AbstractCollectiontasks.toString() toString()的默认实现时,请为列表中的每个元素(对于每个Task)调用toString()。因此,您不应该使用默认实现并在循环中从tasks获取信息,当然也不要为每个Task调用toString()。您可以从Task获取并添加到结果字符串任务的 ID 或名称。

最新更新