问题描述
服务器使用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的过程中忽略该属性,用在前后端分离的项目中
网友评论