Hibernate中get和load方法的区别

转载 2018年04月15日 14:38:50

https://blog.csdn.net/lenotang/article/details/2595349


这次我们来谈一下Hibernate3.2 Session加载数据时getload方法的区别,其实这个在网上有很多的论述,可大多语焉不详或经不起实践的推敲,让很多初学者学的满腹疑窦,现在我给大家讲解一下:

 

1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!

 

2.  load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:

(1)若为true,首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException

(2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException

 

这里getload有两个重要区别:

  1. 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException
  2. load方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于loadget方法返回类型:好多书中都说:“get方法永远只返回实体类,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)

 

总之对于getload的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null

 

最后,我们分析下为什么网路上那么多关于二者区别的文章不太准确!首先可能是版本问题,Hibernate版本不同,运行机制不太一样;其次就是很多朋友只是把自己经验所得与人分享,并没有经过全方位代码的检测;最后就是有些技术牛人,表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷信权威,一定要综合多方资料,比较和整理,再经过自己实践检验,这样得到的知识才是真实有效的。

 


Hibernate中get和load方法的区别详解

1. 对于Hibernate的get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这...
  • qq_33642117
  • qq_33642117
  • 2016-07-23 23:44:07
  • 927

Hibernate Session对象load()方法和get()方法区别

(1)当记录不存在时候,get方法返回null,load方法产生异常(2)load方法可以返回实体的代理类,get方法则返回真是的实体类(3)load方法可以充分利用hibernate的内部缓存和二级...
  • daryl715
  • daryl715
  • 2007-02-08 16:56:00
  • 2156

hibernate中get和load,find的区别 .

get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org.hib...
  • wenzhihui_2010
  • wenzhihui_2010
  • 2013-08-27 10:38:15
  • 1772

hibernate中get和load的区别

hibernate中get和load的区别
  • hoho_12
  • hoho_12
  • 2016-11-03 16:24:42
  • 1478

Hibernate中get和load方法

在Hibernate中,get和load方法都是根据id查询 下边详细说一下get和load的不同
  • sunqing0316
  • sunqing0316
  • 2015-04-30 21:15:03
  • 1493

Hibernate的加载方式——GET与LOAD的对比

在Hibernate框架中,最常用到的加载方式就非Get和Load莫属了,然而Get和Load在加载方式上边还有很多的不同,下面让我们来分析一下他们的不同之处。 区别        从返回...
  • happylee6688
  • happylee6688
  • 2013-12-14 10:00:18
  • 4062

Hibernate中get和load有什么不同之处?

学习笔记 1、Hibernate中get和load有什么不同之处? (1)Hibernate的get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,...
  • buhuikanjian
  • buhuikanjian
  • 2016-11-16 15:40:06
  • 5295

hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。

update是更新一个对象,针对的是已经存在的对象 saveOrupdate是根据实体判断,如果没有的话就保存实体,如果有实体的话才修改(对象的存在与否都不会有人格影响) 重点:最主要的区别就在于...
  • qq_35733535
  • qq_35733535
  • 2017-03-03 12:30:28
  • 1857

Hibernate中Session.get()方法和load()方法的详细比较

1、get()方法直接返回实体类,如果查不到数据则返回null。load()会 返回一个实体代理对象(当前这个对象可以自动转化为实体对象), 但当代理对象被调用时,如果没有数据不存在,就会抛出个 or...
  • u010870518
  • u010870518
  • 2014-10-04 15:56:58
  • 4556
收藏助手
不良信息举报
您举报文章:Hibernate中get和load方法的区别
举报原因:
原因补充:

(最多只允许输入30个字)