5

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

@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。现在的问题是它无限地尝试急切地获取对象(如果我取消设置任何一个的获取,它会引发相同的异常)。

另一方面,如果我删除任一类的变量,则休眠状态不知道另一个类的关系。例如:如果我从 Lecturer 中删除课程列表并删除其中一个 Lecturer 对象,则休眠不会删除与已删除 Lecturer 对象相关的课程对象。所以我必须编写一个休眠查询并在代码中手动删除它。

你能建议我如何解决这个问题吗?

4

2 回答 2

3

这是因为循环引用(parent -> child ->parent)发生的。我相信你已经明白了。

您的问题最简单的解决方案是迭代课程列表并将其设置Lecturer为空,然后再放入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;
   }
于 2012-11-13T02:33:05.313 回答
-1

如果您使用杰克逊映射器,则可以通过使用 @JsonIgnore 注释来解决此问题。 此链接解决了杰克逊的问题。

于 2012-12-08T17:12:16.597 回答