延迟加载

一.什么是懒加载?他的作用?

延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。

Hibernate中主要是通过代理(proxy)机制来实现延迟加载。它的具体过程:Hibernate丛数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不是数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都是默认值;只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载它的数据,这样在某些情况下,就可以提高查询效率。

有如下程序代码:

User user=(User)session.load(clazz, id);//直接返回的是代理对象

System.out.println(user.getId());//没有发送sql语句到数据库加载

user.getName();//创建真实的User实例,并发送sql语句到数据库中

注意:1.不能判断User=null;代理对象不可能为空

代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。session关闭之前访问数据库

2.getId()方法不行因为参数为ID,getClass()方法不用访问数据库就可以得到的数据

Hibernate中默认采用延迟加载的情况主要有以下几种

1,当调用session上的load()加载一个实体时,会采用延迟加载。

2,当session加载某个实体时,会对这个实体中的集合属性值采用延迟加载

3当session加载某个实体时,会对这个实体所有单端关联的另一个实体对象采用延迟加载。

二.关闭延迟加载

延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载,如果Hibernate先默认使用延迟加载,而后又必须去数据库加载,反而会降低效率

1.     加载单个实体,如果不需要延迟加载,就可以使用session的get()方法。

2.     当session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这是可以在映射文件中这个集合的配置元素(set bag list)添加属性lazy=false;

3.     当session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在影射文件中针对这个单端关联的配置元素()添加lazy=false;

三.抓取策略

通过asm和cglib二个包实现;Domain是非final的。

1.session.load懒加载。

2.one-to-one(元素)懒加载:

必需同时满足下面三个条件时才能实现懒加载

(主表不能有constrained=true,所以主表没有懒加载)

lazy!=false 2)constrained=true3)fetch=select

3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select

4.many-to-one (元素) :1)lazy!=false 2)fetch=select

5.many-to-many (元素) :1)lazy!=false 2)fetch=select

6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

分享到:

2015-01-24 06:24

浏览 975

评论

hql懒加载后判断对象是否存在_hibernate延迟加载(懒加载)详解相关推荐

  1. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. python 生成器 send_python(可迭代对象,迭代器,生成器及send方法详解)

    一.可迭代对象 对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象, 像列表,元祖,字典等都是可迭代对象 可使用isinstance(obj,Iterable)方法判断 1 from ...

  3. dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

  4. Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作

    Hibernate中的对象状态 在Hibernate中持久化对象具有三种状态: 瞬时态, 持久态, 游离态. 瞬时态: 对象没有与Hibernate产生关联(transient,session中没有缓 ...

  5. python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  6. vue 用key拿对象value_基于vue--key值的特殊用处详解

    数组的v-for item in items item of items item,index in items (item,index) in items 对象的v-for(键值,键名,索引) va ...

  7. 【数据结构】共享栈详解 判断共享栈满条件栈顶指针变化详解记忆方法例题

    摘要:简单易懂,详细地介绍共享栈概念,指针,判断共享栈栈满条件以及记忆方法等 目录 共享栈概念 栈顶指针&变化详解 栈顶指针种类的记忆方法 判断栈满条件 判断栈满条件的记忆方法 例题 解题思路 ...

  8. Java对象的序列化(Serialization)和反序列化详解

    ####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以 ...

  9. “空对象 {}” 与 “空数组 []” 的相加问题(详解)

    本文旨在让读者能更加清晰地了解 "空对象 {}" 与 "空数组 ()" 相加(eg:"[] + []" ."[] + {}&quo ...

最新文章

  1. mysql在建站起什么作用_数据库操作对比:Sql Server与MYSQL相比有哪些建站优势?...
  2. mysql大事务导致系统变慢_MySQL因大事务导致的Insert慢实例分析
  3. const char*, char const*, char*const 的区别
  4. C# 获取MAC地址
  5. java内存泄露分析方案
  6. JavaScript实现使用 BITWISE 方法查找集合的幂集算法(附完整源码)
  7. 文献记录(part81)--Clustering-based k -nearest neighbor classification for large-scale data with ...
  8. VS2015上配置opencv2.4.11
  9. 【Matplotlib】【Python】如何使用matplotlib绘制绘制随机生成的点--随机漫步详解
  10. UVA11038 How Many O's?题解
  11. Java实现复制文件(文件、文件夹)
  12. 《Unix编程艺术》
  13. 2021 年“认证杯”数学中国数学建模网络挑战赛 B题解题思路
  14. 拼音工具类PinyinUtils
  15. Git使用学习(十四、解决分支合并后产生的冲突)
  16. java第三课:原生数据类型是用陷阱(pitfall of Primitive Data Type)
  17. (新)Chrome浏览器自定义背景插件
  18. 电脑无法使用typec耳机
  19. Python——超级鹰打码平台实现selenium对b站的自动化登陆
  20. python中init函数详解_Python 中__init__函数以及参数self

热门文章

  1. 州 选择国家_青海的三大城市:海南州、海北州和海西州,谁的风景更美?
  2. QT QNetworkInterface::allAddresses();获取了很多无效的地址_Qt编写地图综合应用16-省市轮廓图下载...
  3. python创建变量_Python每天一分钟:给类对象动态新增/删除成员变量和方法(函数)...
  4. php分布式微服务开发_分布式微服务架构
  5. 安规电容能用什么代替_电容系列之安规电容
  6. java并发编程之美-阅读记录5
  7. 我的Android进阶之旅------gt;Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题...
  8. (持续更新)webstorm快捷键及术语翻译
  9. PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
  10. JAVA(小技巧--List)