懒加载异常 处理方法

2023-10-28

     首先看一下什么是懒加载:

所谓懒加载(lazy)就是延时加载,延迟加载。

什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。

至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,

因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,

我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。

比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为 false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。但是实际上有时候只是需要用到部门的信息,不需要用到 员工的信息,这时员工po的加载就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。

 

hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".
具体设置成什么要看你的需求,并不是说哪个设置就是最好的。
假如在student对象中包含一个head对象
如果你确定在用student对象的时候就要用到head对象里的属性,那你就设置立即加载,因为设置立即加载那么在查询student的同时就会查询 student的head,hibernate就会在查询的时候关联两张表从而生成的sql就可能只有一条。而如果你设置的是延迟加载,那么肯定会要生成 1+N条sql语句:其中“1”是查询student的语句,“N”是根据N个student的id去查询head的N条语句。而且,延迟加载是要用到的 时候才去执行查询,这样系统判断那里需要加载,那里不需要加载也需要时间,性能上肯定就不如立即加载了!
如果,你是有的地方需要用到student的时候才用到head属性,那么你就设置成延迟加载,因为查询2张表的数据肯定要比查询1张表的数据消耗大。
到低要怎样设置就要看你的实际需求了

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
A、实体对象的延迟加载 
如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:
<hibernate-mapping>
 <class name=”com.neusoft.entity.User” table=”user” lazy=”true”>
    ……
 </class>
</hibernate-mapping>
     通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:
    User user=(User)session.load(User.class,”1”);(1)
    System.out.println(user.getName());(2)
  当运行到(1)处时,Hibernate并没有发起对数据的查询,如果此时通过一些调试工具,观察此时user对象的内存快照,会惊奇的发现,此时返 回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回 事?session.load()方法会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用 CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显 示的内存快照,可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时 调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用 该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName 方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。
  这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。 所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方 法才会返回实体类的代理类对象。




两种处理方法:
一、这是延时加载的问题,把有关联的所有pojo类,在hibernate.cfg.xml文件中。一般在many-to-one中,set标签内中设lazy="false" 。

二、用OpenSessionInViewFilter过滤器,注意hibernateFilter过滤器和struts2过滤器在映射时的先后顺序。同时要配置事物处理,否则会导致session处于只读状态而不能做修改、删除的动作。

在web.xml文件中加入一个filter如下:注意要加载 struts过滤器前面。

<!-- 配置opensessionInViewFilter 用于解决懒加载问题-->
	<filter>
	   <filter-name>OpenSessionInViewFilter</filter-name>
	   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
<filter-mapping>
		<filter-name>OpenSessionInViewFilter</filter-name>
		<url-pattern>*.action</url-pattern>
</filter-mapping>


分析原理:
作用是拦截".action“结尾的请求,OpensessionInViewFilter的作用是将session延时关闭。
 
在action类中会调用service层的方法,然后调用session.一般当session访问结束之后就会将session关闭.
比如我们要得到user的列表,默认情况下是不会将其中的roles的所有信息全部查出来的,最多只给出一个id,或者是name.
但是我们这个时候如果要打印roles的类容,就会报懒加载异常了.因为hibernate根本就没有将role的数据查出来.


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

懒加载异常 处理方法 的相关文章

随机推荐

  • ipad能不能写python_如何在ipad上写python

    ipad或者手机支持python代码编写 让我们再也不用一本正经待在办公室或者家里正襟危坐了 让我们编写代码的方式更加随意 当我们写一些轻量级的代码可以随时随地的进行 那么如何在ipad上写python代码呢 这里给大家推荐两款应用于不同平
  • 区块链技术的本质是分布式数据库

    当微服务撞上区块链 系列微课分为 1 区块链的业务价值是通过数据共享降低信任成本 2 区块链的本质是分布式数据库 本文 3 区块链与微服务是天生的一对 转载本文需注明出处 微信公众号EAWorld 违者必究 区块链技术是基于比特币应用提出的
  • anaconda使用系列教程--4)环境迁移

    概述 跨平台尽量避免 比如windows和linux就不要跨平台 就在linux之间跨还是可以的 直接copy整体环境文件 适合于无法联网或网速不佳的新环境 anaconda最好是同版本的 迁移方法 使用requirement文件 A机器
  • pytorch 目标检测数据处理(二)提取困难样本,低ap样本

    摘要 比赛当中数据处理有很多种 对图像数据的分析 和分析之后该如何加强比较低的ap类别 今天就讲解我最近使用的几种困难样本学习和专注低ap的数据增强后的处理 困难样本就是loss比较大的 在每一个批次训练当中都占有很大部分的loss 导致l
  • 蓝牙之五-bludroid协议栈和厂商代码的交互

    协议栈和厂商代码交互 完整的蓝牙调用图 协议栈所在的目录是 system bt 厂商代码所在的目录是hardware broadcom libbt 这两个不同的目录反应的是协议栈和厂商固件的交互流程 它们通过hci层进行交互 在bluez时
  • SCWS分词库自定义

    最近因为要进行搜索功能的实现 而实现搜索给用户一个更好的体验就需要对输入的内容进行分词 所以静下心来 好好看看分词的知识 并记录下来 还是很有必要的 今天主要做了写关于SCWS的分词的词库的一些了解学习 首先就是需要知道SCWS这个分词的词
  • XSSLabs Less1-10

    Xsslabs下载地址 https github com do0dl3 xss labs Less 1 常规插入语句 把test的值改成跨站脚本语句即可name Less 2 gt 闭合前面的语句
  • 代理IP和Socks5代理:跨界电商与全球爬虫的关键技术

    跨界电商在全球化市场中崭露头角 而代理IP和Socks5代理则成为实现全球市场洞察和数据采集的不可或缺的工具 本文将深入探讨这两种代理技术在跨界电商 爬虫技术和出海战略中的关键作用 引言 介绍跨界电商的崛起和全球市场的机遇与挑战 引出代理I
  • 说句“圣诞快乐”不容易!

    1 圣诞快乐 嘿 别以为我们这里都是基督教徒 2 哦 好吧 光明节快乐 犹太教节日 宽扎节快乐 非裔美国人的节日 3 那些节日到了吗 4 好吧 只能说节日快乐了 别说 快乐 抑郁的人伤不起
  • Python对接LDAP/AD的过程详解

    不同公司的 LDAP AD 服务配置各不相同 很难封装一个通用的方法 所以我们在对接 LDAP AD 的过程中 需要了解自己公司的 LDAP AD 服务配置是怎么样的 才能写出正确的对接代码 因此下面将拆解过程并提供相关的文档地址 首先需要
  • 从源码角度分析RabbitMQ重启后,消费者停止消费怎么解决

    前段时间的RabbitMQ broker服务端由于某个队列一直积压消息 运维在凌晨对mq服务端机器pod进行了扩容 重启了RabbitMQ 然后早上发现自己的服务在mq重启之后一直报异常 停止消费了 导致影响了业务的运行 虽然mq重启成功了
  • 服务器虚拟化设计与实现拓扑图,VMware服务器虚拟化解决具体技术方案(详细).doc...

    文档介绍 虚拟化解决方案 目 录 一 V ware解决方案概述 3 1 VMw re服务器整合解决方案 3 1 2 VMware商业连续性解决方案 1 3 VMwar 测试和开发解决方案 8 二 VMware虚拟化实施方案设计 9 2 1
  • 微信小程序:搜索动画显示

    摘要 有时候 我们再加载时 搜索蓝牙和wifi时 需要一个搜索中的动画来渲染我们的页面 动画如下图所示 搜索动画函数wx showLoading wx showLoading函数的所有参数如下 而我们一般用到的是title 如图一中的tit
  • 010.汇编语言基于x86处理器教材习题4.2.8:①-⑤程序

    386 model flat stdcall stack 4096 ExitProcess proto dwExitCode dword data val1 byte 10h val2 word 8000h val3 dword 8000h
  • VUE渲染后端返回含有script标签的html字符串

    在接入支付宝支付模块的时候 支支返回的是一个form串 细看一下还有一个script标签 如何将其渲染出来给大家分享一下经验 注意点 不能在当前页面追加任何元素例如原生js innerHtml appendChiled等等 Vue原生v h
  • JavaCV FrameGrabber问题汇总

    JavaCV FrameGrabber问题汇总 Date 2018 09 27 FrameGrabber类 JavaCV中FrameGrabber类可以连接直播流地址 进行解码 获取Frame帧信息 常用方式如下 FrameGrabber
  • 匈牙利算法

    趣写算法系列之 匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds于1965年提出 因而得名 匈牙利算法是基于Hall定理中充分性证明的思想 它是部图匹配最常见的算法 该算法的核心就是寻找增广路径 它是一种用增广路径求二分图最大匹配的算法
  • vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站

    链接 vtk7 1 1官方文档 链接 官方示例代码 链接 VTK资源网站 需要什么资源搜索就行 官网示例中的数据集 资源基本都有 体绘制代码运行不了 一直报错的解决方案 大家应该都看过VTK图形图像进阶那本书了 那本书的VTK版本为5 10
  • 运用Python解析HTML页面获取资料

    在网络爬虫的应用中 我们经常需要从HTML页面中提取图片 音频和文字资源 本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面 获取这些资源 一 环境准备 首先 确保您已经安装了Python环境 接
  • 懒加载异常 处理方法

    首先看一下什么是懒加载 所谓懒加载 lazy 就是延时加载 延迟加载 什么时候用懒加载呢 我只能回答要用懒加载的时候就用懒加载 至于为什么要用懒加载呢 就是当我们要访问的数据量过大时 明显用缓存不太合适 因为内存容量有限 为了减少并发量 减