JPA报错:Method threw ‘org.hibernate.LazyInitializationException‘ exception. Cannot evaluate

SpringBoot  JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate

报错原因:系统中,每次初始化一个实体的关联就会创建一个临时的session来加载,请求的session是被立即关闭的,也就是在读取了基本属性后,session 已经close了,再进行 lazy loaiding 就会有异常。

解决方式:
1、放弃使用懒加载,懒加载的二次读取的特点,会在数据库请求时开启一个新的事务。这就导致对底层连接池压力很大,而且事务日志也会被每次flush;
2、对相关方法的Service中使用事务,@Transaction注解 ,因为事务可以保持session,仅限于Service层,Controller层事务不生效;
3、Springboot 配置文件中
spring.jpa.open-in-view=true;
这个配置就是在controller层就打开EntityManager,由controller层控制session的开启和关闭,这样controller层就可以操作对象,而不会出现no session。OpenEntityManagerInViewInterceptor这个拦截器实现session的开启和关闭。
注:这个配置一般建议关掉;
或
在application.yml中配置spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值