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懒加载异常的更多相关文章

  1. SpringBoot JPA懒加载异常 - com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy

    问题与分析 某日忽然发现在用postman测试数据时报错如下: com.fasterxml.jackson.databind.JsonMappingException: could not initi ...

  2. 关于Web项目出现懒加载异常的解决方案

    manytomany关系中,使用 fetch = FetchType.LAZY 来做懒加载,加快些性能.但是却一直出错,原因是session被关闭,要保持session,需要事务. Hibernate ...

  3. dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决

    dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...

  4. 在web.xml中添加配置解决hibernate 懒加载异常

    在web.xml添加如下,注意:在配置在struts2的拦截器之前,只能解决请求时出现的懒加载异常:如果没有请求,还需要lazy属性的添加(比如过滤器) <!-- 配置Spring的用于解决懒加 ...

  5. Hibernate和Spring整合出现懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    出现问题:  SSH整合项目里,项目目录结构如下: 在EmployeeAction.java的list()方法里将employees的list放入到request的Map中. EmployeeActi ...

  6. Web程序中的懒加载异常说明及解决方案

    所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...

  7. 解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph

    因为在设计一个树形结构的实体中用到了多对一,一对多的映射关系,在加载其关联对象的时候,为了性能考虑,很自然的想到了懒加载. 也由此遇到了N+1的典型问题 : 通常1的这方,通过1条SQL查找得到1个对 ...

  8. Spring Boot JPA 懒加载

    最近在使用spring jpa 的过程中经常遇到懒加载的错误:"` org.hibernate.LazyInitializationException: could not initiali ...

  9. 懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中 ...

随机推荐

  1. RMAN备份失败之:mount: block device /dev/emcpowerc1 is write-protected, mounting read-only

    今天再做巡检的时候发现有一台服务器的RMAN备份不正常,有一段时间没能正常备份了.检查了一下脚本,正常,定时任务列表也正常,再检查一下/var/log/cron的内容,也没有问题.尝试在该挂载点上创建 ...

  2. 纯JS文本比较工具

    前段时间由于工作需要写了一个纯JS文本比较工具 在这里与大家分享下 算法有待优化,还希望大家多多指教 先上效果图: 奉上源码(把源码保存为html格式的文件就可以直接运行了): <!doctyp ...

  3. Windows程序消息机制浅析

    1.消息  消息是由MSG结构体来表示的.如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lPar ...

  4. WPF中使用ValueConverter来实现“范围条件触发器”

    在WPF中,我们知道界面层可以通过Trigger触发器实现“条件”——“赋值”的功能 属性触发器Property Trigger:当Dependency Property的值发生改变时触发.数据触发器 ...

  5. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...

  6. 面试中问到SpringMVC与struts的区别

    1.先简单的介绍一下SpringMVC 废话不多说,其实SpringMVC就是一个MVC的框架,SpringMVC它的annotation式的开发比struts 开发的方便很多,可以直接代替strut ...

  7. c++ 信号量

    最近写了个c++项目,发现 ctrl + c 退出程序可以出发析构,但kill pid,则不会触发析构,导致现场数据丢失. 解决方案:同时捕捉以下信号. signal(SIGINT, &完成命 ...

  8. HDU 2121 Ice_cream’s world II 不定根最小树形图

    题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  9. BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...

  10. SQL Server 之 锁

    锁,是由锁管理器负责维护,其目的是保证事务的ACID,是平衡并发和数据安全的机制. 锁定粒度与并发性是成反比的,默认情况下,SQL Server Compact 4.0 对数据页使用行级锁定,对索引页 ...