我有两个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()
的正确对象?
答案 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() {}
}
这会自动处理无限递归,解决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或名称。