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. iOS开发中GCD在多线程方面的理解

    GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...

  2. NGUI基础之button(按钮)

    1,button的创建:2,button组件的基本属性:3,button的事件监听 原位地址:http://blog.csdn.net/dingkun520wy/article/details/504 ...

  3. CS0016: 未能写入输出文件的解决方法

    编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727 \Temporary ASP.NET Files\roo ...

  4. CGI与Servlet的区别和联系

    1. 定义: CGI(Common Gateway Interface 公共网关接口)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. 2. 功能: 绝大多 ...

  5. android编程常见问题-程序真机中不显示

    新手编程常见问题: 问题表现:连接上手机后,程序不显示 解决版本:检查AndroidManifest.xml 文件中SDK版本的设置(要求要兼容当前手机版本系统),如下:

  6. 1452: [JSOI2009]Count - BZOJ

    Description Input Output Sample Input Sample Output 1 2HINT 一开始还想什么离线做,其实不用,空间足够,我们直接开100个二维树状数组,然后就 ...

  7. Java多线程——<二>将任务交给线程,线程声明及启动

    一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...

  8. java 几种常见的定时器

    今天闲着没事就总结了一下在java中常用的几种定时器. 主要有3种java.util.Timer, ScheduledExecutorService和quartz 一.Timer 举个简单例子.每隔5 ...

  9. Unity3d - 初学篇 Event Functions 的 继承 机制

    我们知道Start() Update() 等之类的 事件函数 在Unity 主线程中是依次调用的.至于调用的顺序可以查手册. 由此继承机制也会发生一些改变. 测试一: public class MyT ...

  10. jquery层居中,点击小图查看大图,弹出层居中代码,顶部层固定不动,滚动条滚动情况

    jquery层居中,点击小图查看大图,弹出层居中代码 http://www.cnblogs.com/simpledev/p/3566280.html 见第一版,发现一个情况,如果页面内容多出一屏的情况 ...