Hibernate的延迟加载问题
一、延迟加载及作用?
延迟加载又叫懒加载。是指在访问数据时,当数据用到的时候才被加载,没有被用到的时候不加载。
二、这样做有什么好处呢?
好处就是每次访问数据的时候,因为只加载需要的数据,这样就可以降低数据库以及内存压力。
虽然说有时候整体的数据量并不多,但是这是一种机制,当数据量比较大的时候,对整体项目或者
方法调用的优化就会有明显的效果。
三、hibernate中get方法和load方法区别?
1、hibernate中,对于get方法,是立即加载的,也就是会立刻从数据库中查询出数据,有数据就直接返回这个
数据,如果没有对应的数据就会返回null;
而hibernate对于load方法,并不是立即去加载的,hibernate会认为要查询的数据一定存在,所以会通过CGLIB生成一个代理对象,
当在使用到该对象的属性的时候才会去查询数据库,但是此时如果数据库中不存在该对象,就会抛出异常:
ERROR LazyInitializer:63 - Exception initializing proxy(还有一种情况会出现此异常:当session关闭之后再调用该对象中的属性 时, 一般这种情况发生在view层调用该对象的属性,因为此时session已经是关闭的了的)。
所以在使用load方法抛出异常并不是因为创建对象引起的,而是因为
调用了该对象中的属性引起的。
2、查询时涉及缓存:
对于get方法,hibernate会先查询一级缓存session,然后查询二级缓存,如果还没有的话就会去查询数据库,如果数据库
中还有就返回null;
对于load方法,hibernate会先查询一级缓存session,没有的话,就会创建代理对象,当使用实际数据时才会去查询二级
缓存和数据库。
四、解决延迟初始化错误的方法:
产生错误的原因:
延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,
那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。
如果在游离状态时才初始化它,就会产生延迟初始化错误。
解决方法:
1、不去将延迟加载对象进行初始化。
如果是一个对象中的属性可以将其忽略初始化:
配置:在该属性的set方法上添加注解:@JSON(serialize=false)
2、将延迟加载的属性在配置中配置为立即加载:lazy=false,lazy属性默认是true;
3、在业务层session关闭之前,对延迟对象初始化。
4、OpeanSessionView配置 :OpenSessionInViewFilter,可将session开启到表现层。
配置如下:
<!-- OpenSessionInViewFilter必须配置在Struts2 Filter之前 -->
<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>/*</url-pattern>
</filter-mapping>
转载于:https://www.cnblogs.com/fang-wei/p/4600841.html
Hibernate的延迟加载问题相关推荐
- Hibernate的延迟加载
---------------------------------------------- 一 ------------------------------------------- 转自: ...
- hibernate中延迟加载的设定(懒加载的设定)
User.hbm.xml: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernat ...
- 一些关于Hibernate延迟加载的误区
最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助. 首先是第一个误区:延迟加 ...
- hibernate 延迟加载问题探讨
延迟初始化错误是运用Hibernate开发项目时最常见的错误.如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它.如果在 ...
- hibernate 延迟加载(转载)
http://blog.csdn.net/xc635960736/article/details/7049863(未找到原始的引文) Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默 ...
- Hibernate 延迟加载(一)
1 延迟加载策略 Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术.这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录.通过延迟加载技术可以避免过多.过早地加载数据 ...
- hibernate延迟加载,LazyInitializationException session失效问题。多数据源配置
2019独角兽企业重金招聘Python工程师标准>>> 本人对hibernate对延迟加载的类一直很头疼,加载到页面时因为session关闭就会报出异常,查看网上解决办法是配置 Op ...
- Hibernate延迟加载-by宋迪
1:延迟加载就是延迟到真正需要数据的时候才加载,我第一次理解代理模式就是从这里开始的: 2:Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属 ...
- IT忍者神龟之hibernate 延迟加载问题探讨
关于 lazy 机制: 延迟初始化错误是运用 Hibernate 开发项目时最常见的错误.如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于S ...
最新文章
- How Vmware snapshots works
- 设计模式C++实现(3)——适配器模式
- dos安装深度linux,U盘用grub4dos引导Deepin v20 Beta iso安装的方法
- Google Maps API 申请方式变更为APIs Console, android手机申请方式
- python按照每行输出八个_Python/PyCharm的每行输出
- springboot 前缀_springboot搭配thymeleaf访问html页面的时候,什么时候需要自定义前缀和后缀呢...
- 关于直播带货被坑的厂商
- python 3.6.3自带的编程调试环境包括了_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...
- Python day 3 (3) 判断与循环
- 拓端tecdat|R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)
- 管理感悟:深入理解软件
- Wireless基本概念
- Java基础练习题及详细答案
- iOS YYText的使用笔记二(YYLabel聊天表情+文字并排)
- awr报告分析 mysql_mysql-awr报告
- 假想参考解码器 vbv HRD
- go sync.once用法
- CSS案例——静态网页制作
- Verilog仿真器
- Java对象空间分配流程