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(延迟加载)的更多相关文章

  1. hibernate的延迟加载及其与session关闭的矛盾

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不 ...

  2. about hibernate lazy load and solution

    about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ...

  3. J2EE进阶(八)Hibernate与延迟加载机制探究

    Hibernate与延迟加载机制探究 前言 Hibernate对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的 ...

  4. Hibernate -- lazy加载

    Hibernate -- lazy加载 hibernate类级别懒加载: lazy:true(默认) //类级别懒加载 //load方法 //class lazy属性 //默认值:true load获 ...

  5. 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?

    对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...

  6. 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 ...

  7. 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...

  8. Hibernate之lazy延迟加载

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

  9. Hibernate之lazy延迟加载(转)

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

随机推荐

  1. Linux 安装tomcat,搭建web app运行环境

    Tomcat 8 下载地址:https://tomcat.apache.org/download-80.cgi 解压tomcat:tar -xf apache-tomcat-8.5.31.tar.gz ...

  2. [转]FILE的用法

    #include <stdio.h> int main() { char c; ; FILE *file; file = fopen("test.txt", " ...

  3. c++ virtual总结

    virtual-关键字用于修饰成员函数时,有以下特性 1.用于修饰的基类的成员函数,被修饰的基类成员函数-其派生类的同名成员函数也默认带有virtual 关键字2.当virtual 用于修饰析构函数( ...

  4. 51Nod 1256 扩展欧几里得求乘法逆元

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...

  5. [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露

    原网址:https://segmentfault.com/a/1190000002778015 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --< ...

  6. PHP动态修改配置文件——php经典实例

    文件结构: index.php 主页 config 配置文件 doUpdate.php 修改功能页 index.php <html> <head> <title>修 ...

  7. ThinkPHP自定义错误页面、成功页面及异常页面

    为什么会选择 ThinkPHP 呢?首先,作为一款国产PHP框架,文档肯定比国外那些框架要丰富的多,而且容易看懂:其次,ThinkPHP已经发展了七八年的时间了,相对来说已经比较成熟了:当然,最重要的 ...

  8. [转载]Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  9. 执行impdp时出现的各种问题

    1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...

  10. redis基础之redis-cluster(集群)(七)

    前言 redis的主流高可用集群模式为redis-cluster.从redis3.0+版本后开始支持,自带集群管理工具redis-trib.rb. 安装redis 参考:https://www.cnb ...