Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

  假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下:

  假设现在我想查询id为2的那本书的书名,使用session.get(...)方法:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.get(Book.class,2);
3 System.out.println(book.getName());

  当执行完第二行代码,还未执行第三行时,控制台已经打印出了sql语句,执行第三行时打印出书名"斗破苍穹".

  而如果使用session.load(..)查询时:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.load(Book.class,1);
3 System.out.println(book.getName());

  当执行完第二行代码还未执行第三行时,控制台什么都没有打印,执行第三行时,控制台打印出sql语句和书名"斗破苍穹".

  看出get和load的区别了吗?

  实际上,当使用get方法查询时,程序立即去访问数据库(实际上是先去一级缓存session中查询,没有发现的话再去二级缓存,再没有的话才去访问数据库),得到id=2的Book,并且打印出sql语句,而是用load方法查询时,load并未立即去访问数据库,他先是返回了一个Book的代理对象,当你真正要用到Book中信息时,才去访问数据库.load支持延迟加载,get不支持延迟加载,当然如果设置了lazy=false,get和load都会直接去访问数据库,都变成即时加载.

  get/load方法还有一个很重要的区别就是:

    load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
    get方法检索不到的话会返回null

  这就引出了即时加载和延时加载的概念,通俗的说,即时加载,就是立即去数据库查找,延迟加载,就是真正需要的时候才去数据库查找,这类似于单例模式中的懒汉式和饿汉式的加载方式.

  假设我现在想通过查询Book,来得到Book所对应的Category,如果设置为即时加载,当加载Book时,会自动加载Category,如果设置为延迟加载,则加载Book时,不会加载Category,只有当第一次调用getCategory(),时,才去执行sql语句,加载Category.

  一般来说,延迟加载要比即时加载节省资源,但是如果处理不当,延迟加载容易抛出延迟加载异常(LazyInitializationException).这是因为延迟加载时,只有第一次调用getCategory()时才会加载Category数据,如果这时候数据库连接已经关闭了,就会因为无法加载数据而抛出异常.

  在*.hbm.xml中可以设置加载方式,class标签中可以设置:lazy="true",打开延迟加载,默认就是lazy="true".

  在set/bag标签下,默认也是lazy="true",支持延迟加载,也叫懒加载.

  单端关联(many_to_one或者one_to_one)上也可以设置lazy="true".默认也是true支持懒加载.

下面是网络上一段关于get和load方法的详细异同,写的不错,贴在这里:

 一、get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null

  而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy='false' 则不使用延迟加载,这是load的访问机制就和get一样了。

  二、对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。

 

 

 


抓取策略:

  在hibernate的官方文档中对于抓取策略,是这么定义的:

当应用程序需要在(hibernate实体对象图的)关联关系间进行对象导航的时候,hibernate如何获取关联对象的策略.

fetch="select":当查询关联对象通过select语句去查询,Select语句的发出时机,是根据lazy的值来确定的,如果lazy="false",那么在获取对象时,就会发出一条select语句,将关联对象查询出来,就是说,我们在查询Book信息的时候会自动把Category的数据也查询出来,但如果lazy="true",那么只有在获取关联对象的时候才会发出select语句去查询.

fetch="join":当查询Book信息时,会通过outer join把关联的对象Category一起查询出来,这个时候lazy无效,所有数据会立即查询出来.

fetch="subselect":如果要查询关联集合的内容,会查询之前已经查询出来的所有关联集合的内容,<category对应了多张Book,如果查询了"玄幻类","武侠类",那么在使用"玄幻类"和"武侠类"对应的集合对象("所对应的书籍信息"),会将他们的书籍信息一并查询出来,

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php多人点餐可以看到对方点的菜,千万不要小看你身边那个会点菜的人,因为

饭局上&#xff0c;你常常是负责点菜的那个人&#xff0c;还是只负责吃&#xff1f;拿起菜单点菜&#xff0c;你是很从容&#xff0c;还是不知道怎么点&#xff1f;事实上&#xff0c;饭局上那个会点菜的人&#xff0c;千万不能小看。某次随老板外出开会&#xff0c;跟去的几个…

gvim for php,转 : Gvim建立IDE编程环境 (Windows篇)

说明&#xff1a;本文是作者在完全按照著名的《手把手教你把Vim改装成一个IDE编程环境》一文&#xff0c;在Windows XP上用gvim建立IDE环境时所作的备忘。原作地址&#xff1a;http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx。1.安装gvim7.2。运行gvim72.exe&…

阿里云使用笔记-Lrzsz上传下载文件-centos7

2019独角兽企业重金招聘Python工程师标准>>> 上传文件时提示&#xff1a; -bash: rz: command not found rz命令没找到&#xff1f; 执行sz&#xff0c;同样也没找到。 原来是要安装个叫 lrzsz 的东西&#xff0c;一查可以直接yum。 安装lrzsz&#xff1a;# yum -y …

C#中的DBNull、Null、String.Empty和“”

null可赋值任何变量,将变量置为空 DBNull只用于DataRow对象,表示数据库中的空值 String.Empty是0长度字串 Convert.IsDBNull判断是否为DBNull DBNull.Value与Null的区别 Null是.net中无效的对象引用。 DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(&l…

iOS开发--验证码

第一步&#xff0c;拖两个空间textfiled和button到storyboard上的viewcontroller上。 第二步&#xff0c;拖线&#xff0c;链接到.h文件中代码如下&#xff1a; 1property (weak, nonatomic) IBOutlet UIButton *l_timeButton;第三步&#xff0c;在,m文件中为l_timeButton设置监…

C# Socket 编程详解

Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务&#xff0c;其名字空间System.Net和 System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络&#xff0c;开发人员…

TCP/ip通信模式

TCP/IP 应用层与应用程序*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 文档出处&#xff1a;http://blog.csdn.net/bingxx11/article…

8 Regular Expressions You Should Know

2019独角兽企业重金招聘Python工程师标准>>> Regular expressions are a language of their own. When you learn a new programming language, theyre this little sub-language that makes no sense at first glance. Many times you have to read another tutori…

poj 3278 catch that cow BFS(基础水)

Catch That CowTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 61826 Accepted: 19329Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a num…

服务器上装filezilla server后,本地的ftp客户端连接不上去

公司一台服务器&#xff0c;上面装了filezilla server后&#xff0c;按平常配置好了&#xff0c;但是在本地用FTP客户端不管怎么连接都连接不上&#xff0c;本地FTP客户端总提示连接失败&#xff0c;远程filezilla server的界面也没有提示有人连接&#xff0c; 仔细看了一下&am…

非法操作 login.php,阅文游戏中心 h5游戏接入wiki

阅文游戏中心《h5游戏 CP接口规范》接口要求规范游戏方接口说明&#xff1a;游戏方需按照规范提供&#xff0c;阅文进行调用阅文接口说明&#xff1a;阅文提供&#xff0c;游戏方调用参数 time 为Unix 时间戳(January 1 1970 00:00:00 GMT 起的秒数) &#xff0c;单位为秒编码统…

串口通信与编程:串口基础知识

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 串口是串行接口&#xff08;serial port&#xff09;的简称&#xff0c;也称为串行通信…

jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...

jmeter上传文件搞了一天&#xff0c;才搞定&#xff0c;没高人帮忙效率就是低&#xff0c;赶紧记下来&#xff0c;以备后用 先用谷歌浏览器抓包&#xff0c;抓到的包类似这样&#xff1a; 在jmeter里添加一个http请求&#xff0c;配置好参数&#xff0c;方法&#xff0c;端口&a…

自定义dialog

2019独角兽企业重金招聘Python工程师标准>>> R.layout.layout_insert_dialog自定义布局 View mViewLayoutInflater.from(MainActivity.this).inflate(R.layout.layout_insert_dialog, null); AlertDialog.Builder dialognew AlertDialog.Builder (MainActivity.this…

oracle的env函数用法,env命令_Linux env 命令用法详解:显示系统中已存在的环境变量...

env命令用于显示系统中已存在的环境变量&#xff0c;以及在定义的环境中执行指令。该命令只使用"-"作为参数选项时&#xff0c;隐藏了选项"-i"的功能。若没有设置任何选项和参数时&#xff0c;则直接显示当前的环境变量。如果使用env命令在新环境中执行指令…

网络通信的工作原理

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 1、什么是计算机网络&#xff1f; 计算机网络是由两台或两台以上的计算机通过网络设备…

Bossie Awards 2015: The best open source applicati

2019独角兽企业重金招聘Python工程师标准>>> Read about more open source winners InfoWorlds Best of Open Source Awards for 2014 celebrate more than 100 open source projects, from the bottom of the stack to the top. Follow these links to more open s…

oracle重做日志教程,Oracle教程:重做日志文件基本维护

重做日志文件最重要的用途就是用来恢复数据(其实你也可以用来logminer)&#xff0c;它记录着system global area(sga)当中的database bu重做日志文件最重要的用途就是用来恢复数据(其实你也可以用来logminer)&#xff0c;它记录着system global area(sga)当中的database buffer…

java动态代理的实现

动态代理作为代理模式的一种扩展形式&#xff0c;广泛应用于框架&#xff08;尤其是基于AOP的框架&#xff09;的设计与开发&#xff0c;本文将通过实例来讲解Java动态代理的实现过程。友情提示&#xff1a;本文略有难度&#xff0c;读者需具备代理模式相关基础知识&#xff0c…

C++基础之this指针的详解

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 关于C中的this指针&#xff0c;建议大家看看这篇文章&#xff0c;《C中的this指针》&a…