JPA延迟加载no Session报错解决分析
异常展示
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ****, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:145)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261)
问题原因
触发延迟加载的时候,session已经失效
延迟加载原理
通过cglib对目标Entity实现代理,针对配置了延迟加载的属性,修改对应get方法的逻辑,植入延迟加载逻辑
解决方式
- 不使用延迟加载
- 延迟加载的时候session活跃
我们本来就想使用延迟加载来提高性能的,不使用延迟加载只是你逃避问题的方式!!要用延迟加载的地方必须用它!!
如何让延迟加载时session活跃
web项目
在springboot环境下,打开以下配置即可
spring.jpa.open-in-view=true
这个配置会通过WebMvcConfigurer配置一个OpenEntityManagerInViewInterceptor拦截器

而这个拦截器的作用。。我们看他的注释就知道了

就是处理请求的全程都能获取到EntityManager,其实就是能获取到session的意思。
普通提供dubbo服务的项目
在接口方法上加上@Transactional注解即可。
@Override
@Transactional(rollbackFor = Exception.class)
public List<XXDTO> getAllXX() {
List<XXEntity> result = xXQueryRepository.findAll();
return XXConverter.INSTANCE.entityListToDTOList(result);
}@Transactional会保证在所注解方法作用域内session都生效
以上就是JPA延迟加载no Session报错解决分析的详细内容,更多关于JPA延迟加载no Session报错的资料请关注脚本之家其它相关文章!
相关文章
Mybatis查询返回Map<String,Object>类型实例详解
这篇文章主要给大家介绍了关于Mybatis查询返回Map<String,Object>类型的相关资料,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此类问题,需要的朋友可以参考下2022-07-07
Maven 搭建SpringMVC+Hibernate项目详解
本文主要介绍Maven 搭建SpringMVC+Hibernate的知识,这里整理了详细的资料,并附示例代码,有兴趣的小伙伴可以参考下2016-09-09
Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析
在Mybatis中,我们需要创建一个与实体类对应的Mapper接口,然后在该接口上添加方法,这些方法对应着SQL语句,这篇文章主要介绍了Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程,需要的朋友可以参考下2023-11-11
从SpringBoot打war包并配置外部Tomcat运行的全流程
由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过,需要的朋友可以参考下2024-06-06


最新评论