异常说明
在使用JPA框架的时候,调用getById()
在输出时使用了log.debug("findById" + ibs.findById(2));
或者System.out.println(ibs.findById(2));
发生了
org.hibernate.LazyInitializationException: could not initialize proxy [com.dyit.springboot.entity.Publisher#2] - no Session
异常
解决方案
- 实体类上添加注解
@Proxy(lazy = false)
- 父类上添加注解
这是在别的博客看见的,我在Test类上加的,也可以解决
@Transactional注解
- 添加配置
我在.yml上添加的
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
原因
懒加载
因为 hibernate(这里是 Spring Data JPA ) 跟 spring 整合以后 hibernate 的 session
就交给 spring 管理了 请求进来的时候打开 session,请求完成的时候关闭 session 当我们想要使用懒加载去获取数据的时候
这时候原先的那个 session 已经关闭了 不能再获取数据了。
是因为在代理的时候因为通过Id查询语句,在代理的时候其实只是先将Id穿进去了,里面并没有其他属性,输出ibs.findById(2)时,默认调用了toString方法但是其他字段并没有,所以会报错。
验证:
输出ID : System.out.println(ibs.findById(2).getId());
没有报错