JPA延迟加载no Session报错解决分析

 更新时间:2023年09月11日 14:49:31   作者:土豆肉丝盖浇饭  
这篇文章主要为大家介绍了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报错的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Java回顾之反射的使用分析

    基于Java回顾之反射的使用分析

    本篇文章是对Java反射的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 完全解析Java编程中finally语句的执行原理

    完全解析Java编程中finally语句的执行原理

    这篇文章主要深度介绍了Java编程中finally语句的执行原理,细致讲解了finally在异常处理中的流程控制作用,需要的朋友可以参考下
    2015-11-11
  • Java编程Commons lang组件简介

    Java编程Commons lang组件简介

    这篇文章主要介绍了Java编程Commons lang组件的相关内容,十分具有参考意义,需要的朋友可以了解下。
    2017-09-09
  • 5分钟快速创建spring boot项目的完整步骤

    5分钟快速创建spring boot项目的完整步骤

    这篇文章主要给大家介绍了关于通过5分钟快速创建spring boot项目的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • JMeter参数化4种实现方式(小结)

    JMeter参数化4种实现方式(小结)

    参数化是自动化测试脚本的一种常用技巧,可将脚本中的某些输入使用参数来代替,JMeter提供了多种参数化方式,下面就其中常用的4种展开阐述,感兴趣的可以来了解一下
    2021-12-12
  • JAVA程序员不得不留意的编码规范

    JAVA程序员不得不留意的编码规范

    这篇文章主要介绍了JAVA程序员不得不留意的编码规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 详解SpringBoot的jar为什么可以直接运行

    详解SpringBoot的jar为什么可以直接运行

    SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包,本文给大家介绍了为什么SpringBoot的jar可以直接运行,文中有相关的代码示例供大家参考,感兴趣的朋友可以参考下
    2024-02-02
  • SpringMVC如何自定义响应的HTTP状态码

    SpringMVC如何自定义响应的HTTP状态码

    这篇文章主要介绍了SpringMVC如何自定义响应的HTTP状态码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • mybatis返回list<Integer>时resultType写Integer问题

    mybatis返回list<Integer>时resultType写Integer问题

    这篇文章主要介绍了mybatis返回list<Integer>时resultType写Integer问题,具有很好的参考价值,希望对大家有所帮助,
    2023-12-12
  • SpringBoot开发实战系列之动态定时任务

    SpringBoot开发实战系列之动态定时任务

    在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面这篇文章主要给大家介绍了关于SpringBoot开发实战系列之动态定时任务的相关资料,需要的朋友可以参考下
    2021-08-08

最新评论