jpa懒加载异常
1、项目背景概述
事情是这样子的,使用了spring data jpa的项目jeesite
jeesite的实体中使用了懒加载模式。

并且一个实体类中还不止一个属性设置了懒加载模式。
项目本身已经存在登录页面,但是我的目的是把此项目当成中间层来给一个.net项目提供服务,不需要一个有页面的登录接口。所以现在我需要重新写个servlet处理登录请求。
如下
如果用户已经登录,用如下方式处理:

如果用户未登录,则进行登录验证:

2、错误描述
然后在vs上写了个winform版的测试程序用来发送登录请求,包括用户名密码。注意不是浏览器版本。
然后我启动vs上的测试程序,发送请求,第一次请求,很正常的返回了数据,第二次请求(此时已经登录了)报错。
错误提示如下:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
3、原因分析
百度上一搜,说是因为实体上设置了懒加载模式,调试一下是在out.write(gson.toJson(loginInfo));处报错的,具体原因是获取与user实例关联的area实体设置了懒加载的属性时出错。
fetch=FetchType.LAZY情况下,jpa查询时尽可能创建一个Entity的 Proxy(仅含ID),而不是一个Instance(包含状态数据)。在一个Session中,如果你访问未初始化的 Proxy 时,jpa 会先进行Initialization(加载数据)。如果Session关闭了,这个时候再去获取Entity的实例,jpa就会抛出一个异常 org.hibernate.LazyInitializationException。
下面分析一下登录,在处理登录时,获取到的user实际上只是一个代理,而不是一个实例。设置了懒加载的属性实际上都只是返回了一个获取数据的方法,而不是实际的数据。而这个方法只有在session存在的时候才能获取到数据。而在二次登录时,seesion已经不存在,此时再获取数据就会出现上面所说的异常。
4、解决方案
4.1方法一
根据网上的答案,把fetch=FetchType.LAZY改成fetch=FetchType.EAGER即可,但是area实体中有两个地方设置了懒加载,若都改成FetchType.EAGER,则又会出现另外一个错误:org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
百度一下,是由于当(fetch = FetchType.EAGER)多余一个时,持久框架抓取一方的对象时,同时又将多方的对象加载进容器中,多方又可能关联其它对象,Hibernate实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3),若多方(第二级)存在重复值,则第三级中抓取的值就无法映射,就会出现 multiple bags。
4.2方法二
于是又找到另外一种方法,就是在配置文件web.xml中加入如下配置:

但是查看配置文件,发现已有这样的配置,查原因发现此种配置只适用于web项目,而我的测试程序是winform.
4.3方法三
于是再查,网上说,只要调用一下实体中除getid()之外的属性方法,就会获取得到一个实体的实例,于是在登录验证时,额外的调用了一下user的getOffice()属性方法,但是结果并不如人意,二次登录时还是报一样的错误。这个我也不知道为什么。
4.4方法四
百般无奈之下,我修改了当用户已经登录时的处理代码,直接通过SystemService中的UserDao类获取user实例,但是执行到out.write(gson.toJson(loginInfo));时还是报错。
调试至已登录条件下的user,发现它所有的属性都是有值的。百思不得其解,明明有值,为什么写入到测试程序时为什么又会报错呢?
查看user实体类,发现它有两个构造函数,一个是无参的,一个是带ID参数的构造函数。于是从原来的user中取得ID,再使用带ID参数的构造函数重新实例化一个user。试图把原来user的值都赋给另外一个新建的user,然后再输出。即改成如下代码:

奇迹发生了,竟然可以正常的输出信息。
原因分析:
待查
jpa懒加载异常的更多相关文章
- SpringBoot JPA懒加载异常 - com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy
问题与分析 某日忽然发现在用postman测试数据时报错如下: com.fasterxml.jackson.databind.JsonMappingException: could not initi ...
- 关于Web项目出现懒加载异常的解决方案
manytomany关系中,使用 fetch = FetchType.LAZY 来做懒加载,加快些性能.但是却一直出错,原因是session被关闭,要保持session,需要事务. Hibernate ...
- dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决
dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...
- 在web.xml中添加配置解决hibernate 懒加载异常
在web.xml添加如下,注意:在配置在struts2的拦截器之前,只能解决请求时出现的懒加载异常:如果没有请求,还需要lazy属性的添加(比如过滤器) <!-- 配置Spring的用于解决懒加 ...
- Hibernate和Spring整合出现懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
出现问题: SSH整合项目里,项目目录结构如下: 在EmployeeAction.java的list()方法里将employees的list放入到request的Map中. EmployeeActi ...
- Web程序中的懒加载异常说明及解决方案
所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...
- 解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph
因为在设计一个树形结构的实体中用到了多对一,一对多的映射关系,在加载其关联对象的时候,为了性能考虑,很自然的想到了懒加载. 也由此遇到了N+1的典型问题 : 通常1的这方,通过1条SQL查找得到1个对 ...
- Spring Boot JPA 懒加载
最近在使用spring jpa 的过程中经常遇到懒加载的错误:"` org.hibernate.LazyInitializationException: could not initiali ...
- 懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中 ...
随机推荐
- 安装gcc及开发环境
安装gcc及开发环境================================> 安装gcc: * apt-get install build-essential * gcc ...
- matlab实现判断是否能否生成严格对角占优矩阵
如题: function X = IsStrictDiagMatrix(A) % input: A matrix % output: The matrix after transformation % ...
- 101个MySQL的调节和优化的Tips
MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些 ...
- ubuntu12.04之后该死的文件关联
这是抱怨贴~~~当然也提供了解决方法~敬请期待. 这个帖子中我们介绍如何在ubuntu下安装quartus II 13.1,安装完毕功能正常,但是有个“小问题”就是如何在文件管理器中(这里是nauti ...
- Palindrome Partitioning
Palindrome Partitioning Given a string s, partition s such that every substring of the partition is ...
- rJava配置
1. 下载安装R-3.1.1-win.exe: 2. 在R中安装rJava > install.packages("rJava") 3. 设置环境变量: PATH:D:\So ...
- 搭建Asp.Net MVC4
启动vs2012,开始创建一个新的web应用程序.使用菜单:“文件”>“新建项目” 请在左侧选择 Visual C#,然后选择ASP.NET MVC 4 Web 应用程序.命名您的工程为&quo ...
- 【SharePoint 文档管理解决方案设计系列一】文档使用分析
在我们在 SharePoint 端设计文档管理解决方案之前我们要了解目前客户在他们已有的系统里是怎么对文档进行使用和管理的.只有了解了当前的使用情况才能根据客户的需求量身定做一套适合他们的有效的解决方 ...
- 1226: [SDOI2009]学校食堂Dining - BZOJ
Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
- js获取时间
var myDate = new Date(); console.log(myDate.toLocaleString()); function getNowFormatDate() { var dat ...