Hibernate lazy(延迟加载)
Hibernat加载策略有两种,分别为即时加载和延迟加载(懒加载或者lazy),get使用的是即时加载,使用get获取数据时会立即查找(会先去缓存查找,如果缓存中没有找到,才会去数据库中查找),而load使用的为延迟加载,不会立即去查询,当需要的时候才会去查找,而且load获取到的类型不是查找的类型,而是一个代理类型。本文主要学习延迟加载。
1.首先将表与pojo类创建好,建立好映射关系
2.写测试方法
这里为了比较,写一个get方法,写一个load方法。


经过debug发现,get方法在执行时直接去查找数据库,而load方法是在调用book.getName()时才去查询数据库,而且get方法获得的返回值为Book类型,而load方法返回值为一个代理类,并且如果将book.getName()改为book.getId(),get方法依旧会去查询数据库,而load方法不会。
如果将以上代码进行修改,将输出语句修改到session关闭以后。


如果进行这样的修改,get方法依旧会正常执行,正常查询数据库,而load方法则会抛出异常:lazy初始化异常,不能初始化代理,没有session。因为load只有在使用时才会去查询,此时session已经关闭,所以无法初始化代理,所以抛出异常。

3.class的lazy
1)class中用一个lazy属性,它的默认值为true,也就是说class本身默认为延迟加载。

如果将lazy修改为false,将延迟加载关闭,执行上面的load方法,发现不会抛出异常,而进行debug发现,在执行load方法时直接查询了数据库,而返回的类型也不再是代理类型,而是Book类型,也就是说,如果要使用hibernate的延迟加载需要将class中的lazy设置为true,以前没有设置是因为class的lazy本身默认为true。
4.多端关联关系的lazy(list,set)
上面都说的是单表的lazy,下面说一下关联关系的lazy。(创建Book与Category之间的关系)

经过debug发现,在执行get时,只是去数据库查询了category的信息,而没有去查询book的信息,但是在执行iterator.next().getBookName()时去查询了book的信息,但是get为即时加载,为什么在这里会进行延迟加载呢?经过查询发现原来配置关系的set,list等默认为懒加载,即延迟加载。

如果在此将set中的lazy的值设置为false,则在查询category时直接会发出2条sql语句,直接将set中的值查询出来。、
注意:当set中lazy=true时,支持延迟加载,但是使用size方法时依旧会查询整个set集合,当set中lazy=extra时,比较智能,支持延迟加载,但是使用size方法时,sql语句中使用的是count语句,而不是查询所有。
5.单端关联上的lazy(many-to-one,one-to-one)
这里lazy有三个值,false,proxy,no-proxy,这里默认为proxy,支持延迟加载,使用时调用代理,查询数据。如果设置为false则立即加载,而no-proxy是不使用代理,这里需要使用第三方插件增强它才可以使用,这里就不做演示。
6.property的lazy
其实property也是支持延迟加载的,但是其中默认lazy=false,当lazy=true时需要使用第三方插件增强,才可以使用。一般不会将property的lazy设置为true,当使用大对象时才会使用。
总结:load支持延迟加载,get不支持延迟加载,如果没有设置延迟加载,那么load也会立即加载对象。
注:本文是在学习期间根据网上视频写的学习笔记,如有侵权请联系删除!
Hibernate lazy(延迟加载)的更多相关文章
- hibernate的延迟加载及其与session关闭的矛盾
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不 ...
- about hibernate lazy load and solution
about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ...
- J2EE进阶(八)Hibernate与延迟加载机制探究
Hibernate与延迟加载机制探究 前言 Hibernate对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的 ...
- Hibernate -- lazy加载
Hibernate -- lazy加载 hibernate类级别懒加载: lazy:true(默认) //类级别懒加载 //load方法 //class lazy属性 //默认值:true load获 ...
- 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?
对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...
- FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL
原帖 https://grokonez.com/hibernate/use-hibernate-lazy-fetch-eager-fetch-type-spring-boot-mysql In the ...
- 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...
- Hibernate之lazy延迟加载
一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...
- Hibernate之lazy延迟加载(转)
一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...
随机推荐
- MongoDB-3.4集群搭建:分片
概念 集群拥有三个节点: 分片(sharding),分发路由(query routers)和配置服务器 (config server) Shard 分片是存储了一个集合部分数据的MongoDB实例,每 ...
- 成为优秀 Node.js 程序员的10个习惯
JavaScript出现近二十年了,但由于其有些问题不能解决,使得像Python和Ruby这一类的语言很吸引人,这些问题包括命令行接口.交互式开发环境.包的管理和没有一个有组织开源社区等.幸亏Node ...
- 使用JSON Web Token设计单点登录系统
用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制. 小知识:可别把用户认证和用户授权(Aut ...
- 绿色的银行类cms管理系统模板——后台
链接:http://pan.baidu.com/s/1pK7Vu9X 密码:4cc5
- sqlalchemy更新和插入操作
def save_app_info(self): try: # update app_info print(self.dicts) data = db_session.query(App_Info). ...
- HTML 禁止显示input默认提示信息
看问题 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- appium---【Mac】Appium-Doctor提示WARN:“applesimutils cannot be found”解决方案
报错提示“ applesimutils cannot be found”截图如下: 解决方案: brew tap wix/brew brew install applesimutils 再次执行app ...
- nginx配置tomcat集群
显示nginx的核心配置 #user nobody;worker_processes 1; events { worker_connections 1024; #并发连接数} http { in ...
- CircleIndicator
dependencies { compile 'com.nineoldandroids:library:2.4.+' compile 'me.relex:circleindicator:1.0.0@a ...
- 安卓使用WebView清除缓存
原文:https://blog.csdn.net/liwei123liwei123/article/details/52624826 Android 清除WebView缓存 最近项目中需要用WebVi ...