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. 常见前端面试题之HTML/CSS部分

    转自http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html Doctype是什么?如何触发严格模式与混杂模式模式?区分它们有何意义? ...

  2. Eclipse C/C++开发环境搭建

    1 Eclipse的安装 到http://java.sun.com/j2se/1.5.0/download.jsp 下载JRE安装: 到http://eclipse.org下载Eclipse安装.(这 ...

  3. 与MySQL交互(felixge/node-mysql)

    目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...

  4. Apache网站根目录

    Apache环境配置好了,把项目放到网站根目录下的htdocs文件夹下,运行网站的时候不需要加上该文件夹的名称,Apache直接在上面找对应的项目

  5. iOS 进阶 第十天(0410)

    0410 在tableViewCell之间添加一根线,通栏 iOS应用数据存储的常用方式 plist存储文件 plist读取文件 下面是plist存储读取的图解: 注意:plist只能存储常见的属性. ...

  6. 设计模式Builder(建造者)模式

    1.出现原因 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法 ...

  7. Android-Empty-Layout:展示不同类型的页面布局,用于视图是空的时候

    Android-Empty-Layout:这个布局可以作用在Listview,Gridview,用于显示数据的是空的时候,可以提示友好的页面.这库可以显示页面出错,页面加载,页面是空. 加载的动画页面 ...

  8. js图片旋转

    <script type="text/javascript" language="javascript"> function rotate(id, ...

  9. mvc异步表单遇到的问题

    1,mvc异步表单遇到的问题    问题:使用jqury easy ui 时提交异步数据不能请求到服务器   解决办法:经过细心调试和检测,发现jqury的加载顺序放在了easy ui之后,所以首先加 ...

  10. VMware虚拟机中Hadoop服务的端口无法访问的问题

    今天安装了一个hadoop集群,因为已经在单个虚拟机上安装成功,所以初期安装相对顺利. 初始环境如下:       通过Vmware Esxi服务器虚拟机出来四台机器,每台机器的网络配置如下:     ...