懒加载异常 途径

简介:

     首先,了解一下什么是延迟加载:

所谓懒载入(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延时关闭。
Hibernate中懒载入错误的解决方法 - 九鬼 - 朝阳起又落
 
在action类中会调用service层的方法,然后调用session.一般当session訪问结束之后就会将session关闭.
比方我们要得到user的列表,默认情况下是不会将当中的roles的所有信息所有查出来的,最多仅仅给出一个id,或者是name.
可是我们这个时候假设要打印roles的类容,就会报懒载入异常了.由于hibernate根本就没有将role的数据查出来.


版权声明:本文博客原创文章,博客,未经同意,不得转载。








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4632826.html,如需转载请自行联系原作者


相关文章
|
SQL 机器学习/深度学习 存储
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
随着 Apache Flink 自身的发展,越来越多的企业选择 Apache Flink 应用于自身的业务场景,如底层平台建设、实时数仓、实时推荐、实时分析、实时大屏、风控、数据湖等场景中,解决实时计算的需求。
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
|
传感器 编解码 数据处理
Open Google Earth Engine(OEEL)——哨兵1号数据的黑边去除功能附链接和代码
Open Google Earth Engine(OEEL)——哨兵1号数据的黑边去除功能附链接和代码
420 0
|
存储 数据采集 分布式计算
从 0 到 1 搭建大数据平台之数据采集系统
从 0 到 1 搭建大数据平台之数据采集系统
1437 0
阿里云短信套餐包什么意思?
阿里云短信套餐包是什么意思?短信套餐包就是一次性购买多少条的短信,然后使用时自动从短信套餐包中扣除短信数量。假设你花了6.9元购买了200条的短信套餐包,使用阿里云短信服务平台发送短信,发送了10条,就自动从这个套餐包中扣除已经使用的10条,还剩190条。
537 1
|
存储 测试技术 Python
【附源码】ttkbootstrap实现GUI信息管理系统
使用`ttkbootstrap`构建的GUI学生信息管理系统,展示学生数据的`Treeview`,支持添加、编辑和删除记录。核心功能包括: - `Treeview`展示学生信息。 - 表单窗口添加和编辑信息,利用`open_form_window`处理交互。 - 选择项后,`edit_data`和`delete_data`分别用于编辑和删除。 - 需要Python 3.8+和ttkbootstrap 1.10.1。 - 源码展示了数据结构、事件处理和窗口布局。 要运行,安装依赖并执行代码,测试各项功能以确保正常工作。
611 0
【附源码】ttkbootstrap实现GUI信息管理系统
|
12月前
|
数据可视化 项目管理 数据库
提高工作效率:5个实用的SOP模板与技巧
SOP(标准操作程序)是将工作流程标准化,明确每一步骤、责任人及时间要求,以提高效率、减少错误并增强团队协作。初入职场者掌握SOP,能更快适应环境,提升个人与团队的工作表现。
2290 1
提高工作效率:5个实用的SOP模板与技巧
|
9月前
|
负载均衡 算法 安全
硬件负载均衡和软件负载均衡有什么区别?
硬件负载均衡和软件负载均衡有什么区别?
470 127
|
9月前
|
前端开发 JavaScript
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
400 58
|
自动驾驶 5G 网络架构
|
机器学习/深度学习 人工智能 监控
如何利用AI实现银行存量客户的营销?
金融行业是当今大数据、人工智能应用最广、最深的领域之一。随着数据仓库和数据科学的发展,以银行为代表的金融行业企业拥有了海量数据,应运而生了金融领域的大数据分析、智能营销等大数据和人工智能的应用。其中针对存量客户的智能营销成为银行业的一项重要策略。