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,一经查实,立即删除!

相关文章

指纹图像方向图matlab,matlab指纹方向场方向图程序

function Fangxiangtu zhiwen_fangxiangtu( Zhiwentuxiang )%函数功能计算指纹方向图%函数参数指纹图像Zhiwentuxiang%函数返回值指纹方向图FangxiangtuSizeZhiwentuxiang size( Zhiwentuxiang ) ;Zhiwentuxiang double( Zhiwentuxiang ) ;W 4; % 窗口大小(2W1)*(2W1)W 4;…

怎样实现一个简单的jQuery编程

第一步&#xff1a;在head中载入jQuery框架 <script  type"text/javascript" src"jQuery文档所在的绝对路径"></script> 注&#xff1a; type——指定脚本的mime类型 src——规定外部脚本文件的URL jQuery是一个javascript库&#xff0c;相…

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&…

1081. Rational Sum (20) -最大公约数

题目如下&#xff1a; Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (<100), followe…

CRC8校验分析

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是…

insert mysql后加where,如何在MySQL Insert語句中添加where子句?

This doesnt work:這不起作用:INSERT INTO users (username, password) VALUES ("Jack","123") WHERE id1;Any ideas how to narrow insertion to a particular row by id?任何想法如何通過id縮小插入到特定行?8 个解决方案#120In an insert statement y…

阿里云使用笔记-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…

matlab数值很小出错,求大神帮忙解决一下,用MATLAB求解动力学数据总是出错~ - 计算模拟 - 小木虫 - 学术 科研 互动社区...

CODE:function KineticsEst5 % 动力学ODE方程模型的参数估计%%%% The variables y here are y(1)xB, y(2)xoNB, y(3)xmNB,y(4)xpNB,y(5)xDNB .clear allclck0 [5 5 5 5 5]; % 参数初值lb [0 0 0 0 0]; % 参数下限ub [inf inf inf inf inf]; % 参数上限x0 [0 0 0 0 0 0];Kin…

iOS开发--验证码

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

Standard C Episode 8

C语言函数和程序结构 通过函数可以把大的计算任务分解成若干个较小任务&#xff0c;从而使得思路更加清晰&#xff0c;同时函数也大大提高了代码的复用率&#xff0c;提高了工作效率。要注意的是多函数之间应该尽可能地高聚合低耦合。另一方面&#xff0c;一个程序可以保存在一…

C# Socket 编程详解

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

java 线程池 wait,Java 多线程 之 wait等待 线程实例

package com.wait.notify;/**题目: 人们在火车站的售票窗口排队买火车票1. 北京西站开门2. 打开售票窗口3. 北京西站有10张去长沙的票4. 打开2个售票窗口,5 假设每个售票窗口每隔1秒钟买完一张票1. 根据 名词 找类人们(Person), 火车站(Station),火车票(Ticket) , 售票窗口e 是…

002 exercises

求列表全排列lst [1,2,3] l1 [(x,y,z) for x in lst for y in lst for z in lst if x ! y if y ! z if x ! z] print(l1)给定一个非负整数num,重复的加每一位,直到最后只剩下一位例如: num 38,计算过程如下:3 8 111 1 2最后输出结果为2#递归 def add(num):if len(str(num…

(线段树 点更新 区间求和)lightoj1112

链接&#xff1a; http://acm.hust.edu.cn/vjudge/contest/view.action?cid88230#problem/D &#xff08;密码0817&#xff09; Description Robin Hood likes to loot rich people since he helps the poor people with this money. Instead of keeping all the money togeth…

TCP/ip通信模式

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

PHP中判断空的方法,php中类型判断和NULL,空值检查的方法

在一些接口和数据库的设计中。数据库的非必填字段可能为null或者为空。这个时候接口前端javascript去判断的时候就会比较麻烦。为了便于统一的判断。一律把null和 空装换成 空.这样前端的判断就变得简洁 if(aa ){........}建议使用 或者 来判断。。以下是我简短的一个把数据…

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…