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已经关闭,没有保存到内存中 ...
随机推荐
- Mac OS X 安装 brew 工具!
最早的ports管理就是BSD那种,后来出现强大的Debian,弄了个dpkg+apt! Mac OS X 最早使用比较多的工具是 MacPorts,但是现在来看这个工具有点老,不是很稳定,那我们推荐 ...
- (转) linux目录结构详细介绍
转自:http://yangrong.blog.51cto.com/6945369/1288072 目录 1.树状目录结构图 2./目录 3./etc/目录 4./usr/目录 5./var/目录 6 ...
- 人工智能起步-反向回馈神经网路算法(BP算法)
人工智能分为强人工,弱人工. 弱人工智能就包括我们常用的语音识别,图像识别等,或者为了某一个固定目标实现的人工算法,如:下围棋,游戏的AI,聊天机器人,阿尔法狗等. 强人工智能目前只是一个幻想,就是自 ...
- 2016 系统设计第一期 (档案一)MVC 控制器接收表单数据
1.FormCollection collection user.UserId =Convert.ToInt32(collection["UserId"]); /// < ...
- 51nod 计算N!的位数
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1130 对于这类问题:斯特林近似公式: 百度百科的证明:http: ...
- Export Farm Solution wsp Files SharePoint 2007 and 2010
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")$farm = [Microsof ...
- 两行代码搞定UITableView无数据无网络显示-b
不知是否有像我一样的,每次写TableView在监听网络和无数据源时逻辑处理提示视图都是一堆代码,很繁琐也很重复的垃圾代码(可能就只有我这样
- Wmware桥接网络虚拟机无法上网的问题
之前装好的一个虚拟机,安装到本地的Wmware workstation的时候,发现无法上网. 虚拟机使用的是桥接模式:一开始怀疑IP被占用,修改后发现不起作用. 排查所有的网络配置,发现都没有问 ...
- LA 4329
第一次敲树状数组 因为一个小错误 wa了 n 多遍 终于ac 太不容易了 /*********************************************************** ...
- ZOJ1232 Adventure of Super Mario spfa上的dp
很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...