一.get与load对照

在hibernate中get和load方法是依据id取得持久化对象的两种方法。但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高。下边具体说一下get和load的不同,有些时候为了对照也会把find加进来。

1.从返回结果上对照:

load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常

get方法检索不到的话会返回null

2.从检索运行机制上对照:

get方法和find方法都是直接从数据库中检索 而load方法的运行则比較复杂首先查找session的persistent Context中是  否有缓存。假设有则直接返回 假设没有则推断是否是lazy。假设不是直接訪问数据库检索,查到记录返回。查不到抛出异常 假设是lazy则须要建立代理对象。对象的initialized属性为false。target属性为null 在訪问获得的代理对象的属性时,检索数据库,假设找到记录则把该记录的对象拷贝到代理对象的target上。并将initialized=true,假设找不到就抛出异常。

3.根本差别说明

假设你使用load方法,hibernate觉得该id相应的对象(数据库记录)在数据库中是一定存在的。所以它能够放心的使用,它能够放心的使用代理来延迟载入该对象。在用到对象中的其它属性数据时才查询数据库,可是万一数据库中不存在该记录,那没办法,仅仅能抛异常。

所说的load方法抛异常是指在使用 该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。

因为session中的缓存对于hibernate来说是个相当便宜的资源。所以在load时会先查一下session缓存看看该id相应的对象是否存在,不存在则创建代理。

所以假设你知道该id在数据库中一定有相应记录存在就能够使用load方法来实现延迟载入。

对于get方法,hibernate会确认一下该id相应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找。还没有就查数据库,数据库中没有就返回null。

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

get方法首先查询session缓存,没有的话查询二级缓存。最后查询数据库。反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

二.使用情况分析

至于何种情况使用get什么时候使用load。我感觉最本质的还是要看要载入的持久化对象及数据量。

当要载入的对象与其它对象没有复杂的联系时使用get和load没有太大的差别;当要载入的对象和其它对象之间有复杂的关联关系。而且对象之间的关联数量比較大的情况下使用load方法要比get方法效率高。

比方班级和学生两个持久化对象实体,当取得班级信息时也要载入相应班级的全部学生信息。可是假设在程序中我们如今须要的知识班级信息而不须要学生信息。在这样的情况下get方式要等到班级信息连同学生信息都载入完成才干使用,而load方式会首先载入班级信息并保存班级与学生之间的关系,等到真正使用学生信息的时候才会去载入。所以在关系复杂而且数据量大的情况下load方式要明显有优势。

三.简单总结

      

      总之对于get和load的根本差别。一句话,hibernate对于load方法觉得该数据在数据库中一定存在,能够放心的使用代理来延迟载入,假设在使用过程中发现了问题,仅仅能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。在实际使用过程中假设分不清使用哪一种,直接使用load方式就可以。

hibernate载入持久化对象的两种方式——get、load的更多相关文章

  1. iOS:创建单例对象的两种方式

    单例模式:创建单例对象的两种方式 方式一:iOS4版本之前      static SingleClassManager *singleManager = nil;      +(SingleClas ...

  2. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  3. Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式

    1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...

  4. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

  5. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  6. hibernate级联查询映射的两种方式

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  7. Python与数据库 sqlalchemy 建立声明层表对象的两种方式

    在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...

  8. Redis:存储对象的两种方式(序列化和json字符串)

    方式一:序列化操作   public class SerializeUtil {   /*   * 序列化   * */   public static byte[] serizlize(Object ...

  9. java中产生对象的两种方式

    /* * 普通new对象的过程! */ Person pp = new Person(); System.out.println(pp); /* * 利用代用参数的构造器产生对象实例! * 首先获得相 ...

随机推荐

  1. PAT Basic 1021

    1021 个位数统计 给定一个k位整数N = d~k-1~*10^k-1^ + ... + d~1~*10^1^ + d~0~ (0<=d~i~<=9, i=0,...,k-1, d~k- ...

  2. 算法学习记录-图——应用之拓扑排序(Topological Sort)

    这一篇写有向无环图及其它的应用: 清楚概念: 有向无环图(DAG):一个无环的有向图.通俗的讲就是从一个点沿着有向边出发,无论怎么遍历都不会回到出发点上. 有向无环图是描述一项工程或者系统的进行过程的 ...

  3. python红包随机生成(隔板法)

    #红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...

  4. Silverlight调用GP工具实现缓冲分析

    目的: 在地图上点击一个点生成一个缓冲区. 1.制作GP工具: GP工具制作按照http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.h ...

  5. IOS 自动布局-UIStackPanel和UIGridPanel(一)

    我以前是做windows phone开发的,后来转做IOS的开发,因此很多windows phone上面的开发经验也被我带到了IOS中.其实有些经验本身跟平台无关,跟平台有关的无非就是实现方法而已.好 ...

  6. ajax 原生 post

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 【bzoj4237】稻草人 分治+单调栈+二分

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  8. [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)

    传送门 开2个树状数组 一个存的是下标,一个存的是数量 细节...看标称吧,懒得说了,好气啊 #include <cstdio> #include <iostream> #in ...

  9. [luoguP3668] [USACO17OPEN]Modern Art 2 现代艺术2(栈)

    传送门 还是一个字——栈 然后加一大堆特判 至少我是这么做的 我的代码 #include <cstdio> #include <iostream> #define N 1000 ...

  10. ubuntu mysql安装及需要其他主机连服务器mysql时的设置(error:10061)

    说明: 一个朋友在使用ubuntu-server 16.04安装mysql,设置远程访问的时候出现了问题,请我帮忙.但是,我也没有使用过ubuntu安装mysql,于是乎搜索了很多技术文件,比着葫芦画 ...