JPA/Hibernate LazyInitializationException 懒加载异常的四种解决方案

问题描述

服务器使用thymeleaf渲染html页面,执行到语句${blog.type.id}时(即获取blog对象中的关联type对象),发生LazyInitializationException 异常。其原因是service事务结束之后,session已经关闭,所以在渲染html时,无法通过懒加载的方式读取数据。

解决方案

1. 添加属性fetch=FetchType.EAGER

友情提示:小心内存溢出!!!

2. 在业务层手动查询数据被加载

因为事务结束之前,session都是开着的,因此这个方法行得通,但是麻烦。

3. 使用OpenEntityManagerInViewFilter

通过将一个Hibernate Session和一次完整请求过程对应的线程相绑定,实现OpenSession in View模式,达到允许在事务提交之后延迟加载显示所需要的对象的目的。

更多有关OpenSession in View模式的解释请点这里

如果使用的是Spring Boot 2.x 那么就可以在启动类中添加如下配置:

@Bean
public OpenEntityManagerInViewFilter openEntityManagerInViewFilter(){
   return new OpenEntityManagerInViewFilter();
}

备注:Spring Boot 2.x 配置文件中的spring.jpa.open-in-view 默认为 true

4. get属性方法上添加@JSON(Serialize=false)

在转json的过程中忽略该属性,用在前后端分离的项目中

你可能感兴趣的:(JPA/Hibernate LazyInitializationException 懒加载异常的四种解决方案)