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也会立即加载对象。

注:本文是在学习期间根据网上视频写的学习笔记,如有侵权请联系删除!

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
  2. S3C2440UART之FIFO
  3. PowerGUI错误-Microsoft SharePoint is not supported with version 4 of the Microsoft .Net Runtime
  4. mac10.9下eclipse的storm开发环境搭建
  5. Type-Length-Value编码
  6. Maven使用笔记(二)Eclipse中maven项目添加依赖
  7. 黄聪:Dsicuz x2.5、X3、X3.2如何去掉域名后面的/forum.php
  8. Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
  9. golang channel初次接触
  10. spring mvc 与 jquery ajax
  11. PHP 14:类的实例
  12. CentOS自带mysql配置(密码更改、端口开放访问、添加进系统启动项)
  13. JS实现时钟特效
  14. Linux_服务器_07_ 将用户设置为管理员
  15. Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]
  16. js获取网页面的高度和宽度
  17. HDFS API编程
  18. css实现按钮固定在底部
  19. kafka性能测试1.0.0
  20. models.doc2vec – Deep learning with paragraph2vec

热门文章

  1. MongoDB - MongoDB CRUD Operations, Query Documents, Query for Null or Missing Fields
  2. 开发技巧:高效的使用 Response.Redirect
  3. CodeForces 990C
  4. NYOJ 202 红黑树 (二叉树)
  5. Linux命令之uptime
  6. 25、Python垃圾回收机制?
  7. js base64加密解密
  8. Nginx 502错误:upstream sent too big header while reading response header from upstream
  9. selenium webdriver操作各浏览器
  10. hive的窗口函数ntile、row_number、rank