避免休眠延迟初始化异常


问题内容

我有两个班的讲师和课程。我的讲师班有一个课程对象列表,一个变量,如图所示

@OneToMany(mappedBy = "lecturer")
@NotFound(action = NotFoundAction.IGNORE)
private List<Course> courseList = new ArrayList<Course>();

在我的课程中,我有一个讲师对象作为变量,如下所示。

@ManyToOne
@JoinTable(name = "course_lecturer", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "lecturer_id"))
private Lecturer lecturer;

现在我有一个spring控制器方法,该方法返回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;
}

问题在于它引发了延迟的初始化异常。因此,我在讲师和课程类的两个变量中都设置了获取类型,以求切入。现在的问题是,它无限地尝试热切地获取对象(如果我未设置任何一个的获取,它会引发相同的异常)。

另一方面,如果我删除任何一个类的变量,则hibernate不知道另一个存在关系。例如:如果我从讲师中删除课程列表并删除其中一个讲师对象,则hibernate不会删除与已删除的讲师对象相关的课程对象。因此,我必须编写一个hibernate查询并在代码中手动将其删除。

您能建议我解决这个问题吗?


问题答案:

这是由于 循环引用(父- >子->父)而发生的。我确定你有这个主意。

解决问题的最简单解决方案是迭代课程列表,并将其设置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;
   }