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); /* * 利用代用参数的构造器产生对象实例! * 首先获得相 ...
随机推荐
- Ubuntu 16.04上thunderbird配置163邮箱出现“配置无法被验证-请查看用户名或密码是否正确?”
在Ubuntu 16.04 上用thunderbird配置163免费邮箱时出现的提示信息如图1: 图1 提示信息 网上有不少方法都说是将接收和发出的主机名分别改为 imap.ym.163.com 和 ...
- 【LeetCode】Available Captures for Rook(车的可用捕获量)
这道题是LeetCode里的第999道题. 题目叙述: 在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 &quo ...
- 图论trainning-part-2 B. Claw Decomposition
B. Claw Decomposition Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld ...
- Leetcode 376.摆动序列
摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
- php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法
这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...
- 【转】Python + Android + Uiautomator自动化测试
1.首先来介绍下UIAutomator工具 UIAutomator是Android官方推出的安卓应用界面自动化测试工具,是最理想的针对APK进行自动化功能回归测试的利器. 2.UIAutomator测 ...
- 【bzoj4237】稻草人 分治+单调栈+二分
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- POJ 3469 Dual Core CPU ——网络流
[题目分析] 构造一个最小割的模型. S向每一个点连Ai,每一个点向T连Bi. 对于每一个限制条件,在i和j之间连一条Cij的双向边即可. 然后求出最小割就是最少的花费. 验证最小割的合理性很容易. ...
- 实验三 kali下metasploit的漏洞攻击实践
一.实验内容 1.使用kali进行靶机的漏洞扫描,利用metasploit选择其中的一个漏洞进行攻击,并获取权限. 2.分析攻击的原理以及获取了什么样的权限. 二.实验要求 1.熟悉kali原理和使用 ...
- win8激活工具,win 8激活工具,windows8激活工具,赶紧来下载咯
同事前几天买了一个电脑,装的win8的系统,由于装office,需要激活,找了下office的激活工具,那个Office激活工具自带有win8激活,同事点错了,把正版系统给激活了,变成盗版了(悲剧.. ...