我有两个名为Lecturer和Course的课程。我的Lecturer类有一个Course对象List,一个变量如图所示
@OneToMany(mappedBy = "lecturer")
@NotFound(action = NotFoundAction.IGNORE)
private List<Course> courseList = new ArrayList<Course>();
在我的课程课程中,我将Lecturer对象作为变量,如下所示。
@ManyToOne
@JoinTable(name = "course_lecturer", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "lecturer_id"))
private Lecturer lecturer;
现在我有一个spring Controller方法,它返回Lecturer的json对象,如下所示。
@RequestMapping(value = "/getlecturerbyid", method = RequestMethod.POST)
public @ResponseBody
Object getLecturer(@ModelAttribute(value = "id") Lecturer lecturer) {
Map<String, Object> response = new HashMap<String, Object>();
response.put("message", "succeess");
response.put("lecturer", lecturer);
return response;
}
问题是它抛出了一个懒惰的初始化异常。因此,我将Lecturer和Course类中的两个变量的fetch类型设置为eager。现在的问题是它无限地试图获取对象(如果我取消设置任何一个,它会引发相同的异常)。
另一方面,如果我删除任一类的变量,那么hibernate不知道另一个的关系。例如:如果我从Lecturer中删除课程列表并删除其中一个Lecturer对象,那么hibernate不会删除与删除的Lecturer对象相关的课程对象。所以我必须编写一个hibernate查询并在代码中手动删除它。
你能否就如何解决这个问题向我提出建议?
答案 0 :(得分:3)
这是因为循环引用(parent - &gt; child - &gt; parent)。我相信你有这个想法。
对于您的问题,最简单的解决方案是迭代课程列表并将Lecturer
设置为null,然后将其放入response
以打破循环关系,如下所示:
Object getLecturer(@ModelAttribute(value = "id") Lecturer lecturer) {
Map<String, Object> response = new HashMap<String, Object>();
response.put("message", "succeess");
//break the circular relationship
if(lecturer.getCourses() != null){
for(Course course: lecturer.getCourses()){
course.setLecturer(null);
}
}
response.put("lecturer", lecturer);
return response;
}
答案 1 :(得分:-1)
如果您使用的是jackson mapper,可以使用@JsonIgnore注释来解决此问题。 This link解决了杰克逊的问题。