美文网首页
JPA/Hibernate LazyInitialization

JPA/Hibernate LazyInitialization

作者: pepsi1000 | 来源:发表于2019-08-07 17:51 被阅读0次

    问题描述

    服务器使用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 LazyInitialization

          本文链接:https://www.haomeiwen.com/subject/pweadctx.html