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. 使用HTML5、CSS3和jQuery增强网站用户体验[留存]

    记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验?是不是立刻就想到了flash实现?这彷佛年代久远的事了.使用现在最流行的Web技术HTML5,CSS3和jQuery,同样也可以实现类 ...

  2. TreeSet的特性

    TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式. 1.存储 ...

  3. 数据库-SQLite

    技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong  数据库-SQLite 技术博客http:// ...

  4. from 表单多文本提交不为空

    假设需要提交4个文本,均不为空: <form id="form" onsubmit="return check()"> </form> ...

  5. 【leetcode 简单】第十八题 爬楼梯

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  6. 一款基于react-native的弹窗提示组件

    介绍一款基于react-native的弹窗提示插件 react-native-ms , github地址:https://github.com/jiangzhenfei/react-native-ms ...

  7. Tinyos Makerules解读

    Makerules 文件解读 位于/opt/tinyos-2.1.2/support/make #-*-Makefile-*- vim:syntax=make #$Id: Makerules,v 1. ...

  8. 一个JAVA渣渣的校招成长记,附BAT美团网易等20家面经总结

    欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享美文,分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取): 今天分享一篇牛客网上的一个 ...

  9. [006] largest_common_substring

    [Description] Given two different strings, find the largest successive common substring. e.g. str1[] ...

  10. (转)USB 基本知识

    USB的重要关键字: 1.端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点.输出端点.配置端点.批量传输端点) ...