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