java - 避免 hibernate 惰性初始化异常

标签 java hibernate spring-mvc

我有两个类(class),分别是讲师和类(class)。我的讲师类有一个类(class)对象列表,一个变量,如图所示

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

在我的类(class)中,我有一个 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 类的两个变量中的获取类型都设置为 eager。现在的问题是它会无限地尝试急切地获取对象(如果我取消设置其中任何一个的获取,它会引发相同的异常)。

另一方面,如果我删除任一类的变量,那么 hibernate 就不知道与另一个类的关系。例如:如果我从 Lecturer 中删除类(class)列表并删除其中一个 Lecturer 对象,则 hibernate 不会删除与已删除的 Lecturer 对象相关的类(class)对象。所以我必须编写一个 hibernate 查询并在代码中手动将其删除。

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

最佳答案

发生这种情况是因为循环引用(父 -> 子 ->父)。我相信你已经明白了。

针对您的问题,最简单的解决方案是迭代类(class)列表并将 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;
   }

关于java - 避免 hibernate 惰性初始化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354766/

相关文章:

java - 组织.hibernate.MappingException : Unknown entity Employee

java - 使用连接或嵌套子查询更新 Hibernate (HQL)

spring-mvc - 基于 Spring Annotation 的 Controller 和重复表单提交

java - 如何获取 HiveMQ 客户端中使用的密码套件?

java - 如何在 singleton jersey 拦截器中使用 RequestScoped 对象?

java - org.hibernate.hql.internal.QueryExecutionRequestException : Not supported for DML operations without using hibernate

json - 使用 java.util.Set 时的 Jackson bug(或功能!?) - mySet.size() 始终为 1

java - Hibernate Validator 注释不适用于 spring mvc

java - 通过 putExtra() 传递自写对象

JavaFX:在 TextArea 中显示文本,每行之间有延迟