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
JPA报错:Method threw ‘org.hibernate.LazyInitializationException‘ exception. Cannot evaluate
最新推荐文章于 2024-01-27 16:22:41 发布