避免hibernate延迟初始化exception
我有两个叫Lecturer和Course的课程。 我的Lecturer类有一个Course对象List,一个变量如图所示
@OneToMany(mappedBy = "lecturer") @NotFound(action = NotFoundAction.IGNORE) private List courseList = new ArrayList();
在我的课程中,我有一个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 response = new HashMap(); response.put("message", "succeess"); response.put("lecturer", lecturer); return response; }
问题是它抛出了一个懒惰的初始化exception。 因此,我将Lecturer和Course类中的两个变量的fetch类型设置为eager。 现在问题是它无限地尝试急切地获取对象(如果我取消设置任何一个,它会引发相同的exception)。
另一方面,如果我删除任一类的变量,那么hibernate不知道另一个的关系。 例如:如果我从Lecturer中删除课程列表并删除其中一个Lecturer对象,那么hibernate不会删除与删除的Lecturer对象相关的课程对象。 所以我必须编写一个hibernate查询并在代码中手动删除它。
你能告诉我如何解决这个问题吗?
这是因为循环引用(parent – > child – > parent) 。 我相信你有这个想法。
对您的问题最简单的解决方案是迭代课程列表并将Lecturer
设置为null,然后将其置于response
以打破循环关系,如下所示:
Object getLecturer(@ModelAttribute(value = "id") Lecturer lecturer) { Map response = new HashMap(); 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; }
如果您使用的是jackson mapper,则可以使用@JsonIgnore注释来解决此问题。 这个链接解决了jackson的问题。
- 使用cascade =“save-update”保存时出现Hibernateexception
- Hibernate使用PostgreSQL序列不会影响序列表
- 寻找一个不被弃用的会话工厂
- 使用sql查询在hibernate中创建一个新的对象实例
- 与Bean Validation API结合使用时,Hibernate不遵循JPA规范吗?
- Hibernate没有在Spring Boot Project中抛出LazyInitializationException
- Hibernate Criteria和多个join
- 使用@ElementCollection映射Set
- 如何让Hibernate在与JPA一起使用时自动在数据库中创建表?