hibernate载入持久化对象的两种方式——get、load
一.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的更多相关文章
- iOS:创建单例对象的两种方式
单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClas ...
- Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- Asp.net Web API 返回Json对象的两种方式
这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...
- JS中访问对象的两种方式区别
可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...
- hibernate级联查询映射的两种方式
Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...
- Python与数据库 sqlalchemy 建立声明层表对象的两种方式
在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...
- Redis:存储对象的两种方式(序列化和json字符串)
方式一:序列化操作 public class SerializeUtil { /* * 序列化 * */ public static byte[] serizlize(Object ...
- java中产生对象的两种方式
/* * 普通new对象的过程! */ Person pp = new Person(); System.out.println(pp); /* * 利用代用参数的构造器产生对象实例! * 首先获得相 ...
随机推荐
- Java-确定一个类对象代表一个类还是接口
package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...
- kendo Grid 列添加自定义模板
columns: [ {field: "行为",template: "<a href='#= 行为#'>#= 行为#</a>"}, {f ...
- [转]python开发_shelve_完整版
''' python中的shelve模块,可以提供一些简单的数据操作 他和python中的dbm很相似. 区别如下: 都是以键值对的形式保存数据,不过在shelve模块中, key必须为字符串,而值可 ...
- vmware安装CentOS " Intel VT-x 处于禁用状态"
我刚用虚拟机vmware 11安装CentOS 7 ,出现错误“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题,如下图. Intel VT-x 即Virtualiza ...
- ubuntu14.04 Cannot find OpenSSL's <evp.h>
Cannot find OpenSSL's <evp.h> when i configure php7 manually,i get trouble with that problem,f ...
- 【Luogu】P1330封锁阳光大学(bfs染色)
题目链接 这题恶心死我了. bfs染色,统计每个联通块两色的个数,ans加它们的最小值. #include<cstdio> #include<cctype> #include& ...
- Java中的自动类型转换
Java里所有的数值型变量可以进行类型转换,这个大家都知道,应该不需要详细解释为什么. 2 在说明自动类型转换之前必须理解这样一个原则“表数范围小的可以向表数范围大的进行自动类型转换” 3 关于jav ...
- Numpy 花式索引
记住:花式索引跟切片不一样,它总是将数据复制到新数组中. 一 给定一个列表,返回索引为1,3,4,5,6的数组 2 针对二维数组 需要注意的一点是,对于花式索引.对照下后面的两种方式,查询结果的不同.
- 洛谷 [P3834] 可持久化线段树(主席树)
主席树可以存储线段树的历史状态,空间消耗很大,一般开45n即可 #include <iostream> #include <cstdio> #include <cstri ...
- CatchTheCaw ----广搜入门
抓住那头牛(POJ3278)农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有 ...