Hibernate学习(5)- session的get与load方法对比
1、共同点:get和load都是根据Id单条查询获取对象
org.hibernate.Session.get(Class<User> entityType, Serializable id)
不难看出,两者的调用方式一样
2、不同点:
这里先引入结论,再验证:
get方法
根据id直接查询对应的数据,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。
load方法
根据id直接查询对应的数据,首先查询session缓存,如果session中有对应对象,则直接返回该对象,若没有就创建代理对象,实际使用数据其他属性(非标识符)时才查询二级缓存和数据库。(如果只用到标识符,那么便不会去做后续的查询)
使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常ObjectNotFoundException;
由于session中的缓存对于hibernate来说是个相当轻量的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
下面做一个简单的测试对比:
使用get()来根据ID进行单条查询:
@Test
public void getTest() {
Session session = null;
try {
session = HibernateUtil.currentSession();
User user = session.get(User.class, 1L); System.out.println(user.getName());
}catch (Exception e) {
e.printStackTrace();
}finally {
HibernateUtil.closeSession();
}
}
断点调试一下:

现在看一下user对象

看一下控制台:(已经打印出查询语句)

接下来继续程序:

使用load()来根据ID进行单条查询:
@Test
public void loadTest() {
Session session = null;
try {
session = HibernateUtil.currentSession();
User user = session.load(User.class, 1L); System.out.println(user.getName());
}catch (Exception e) {
e.printStackTrace();
}finally {
HibernateUtil.closeSession();
}
}
断点调试一下:

看一下user

这里发现虽然load已经执行,但是user对象是一个User_$$_jvst7b1_0
我们打开handler 看看:(这里只保存了id,tartget还是为null,说明实际并未查询,而是先用代理类把id记录下来)

再看一下控制台:(并未执行select查询)

接下来继续运行

发现这时执行了select语句;
对比一下我们发现差别了;
再深入的测试,请自行验证;
PS:源码地址 https://github.com/JsonShare/hibernate-demo
PS:原文地址 http://www.cnblogs.com/JsonShare/p/8686887.html
Hibernate学习(5)- session的get与load方法对比的更多相关文章
- Hibernate中Session之get和load方法的真正区别
最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...
- Hibernate学习---用Session实现CURD
我们使用Hibernate的目的是什么?对数据库进行操作,所有接下来我们就用Hibernate来进行CURD. 前边我们已经分析过了Configuration,SessionFactory和Sessi ...
- Hibernate学习(四)get和Load比较
package cn.lonecloud.test.crud; import org.hibernate.HibernateException; import org.hibernate.Sessio ...
- Hibernate中Session.get()方法和load()方法的详细比较
一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...
- Hibernate的Session的get()和load()方法区别
hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别. get Session接口提供了4个重载的get方法,分别通过“持 ...
- session get和load方法对比
get测试代码如下: public class Test { public static void main(String[] args) { // TODO Auto-generated metho ...
- jQuery 学习05——AJAX:定义、load()方法、get()/post()方法
AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). load() 方法:从服务器加载数据,并把返回的数据放入被选元素中. 语法:$ ...
- hibernate中session的get和load方法的区别和联系:
1. get:及时加载,调用到get方法时立即向数据库查询(在没有session缓存的请况). 2. load:默认使用懒加载,当用到数据的时候才向数据库查询(在没有session缓存的请况). 3. ...
- Hibernate学习三----------session详解
© 版权声明:本文为博主原创文章,转载请注明出处 如何获取session对象 1. openSession 2. getCurrentSession - 如果使用getCurrentSession需要 ...
随机推荐
- Hybrid APP基础篇(四)->JSBridge的原理
说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:J ...
- 每日scrum--No.1
Yesterday:无 Today: 查找学校的官方地图和亲自测试其准确性 Problem :不能使地图适应我们的软件;未解决地图上存在的问题: 明天继续加油.
- 项目Beta冲刺(团队)第一天
1.今天解决的进度 成员 进度 陈家权 回复界面设计,由于成员变动加上和其他成员距离较远,服务器404 赖晓连 改进Alpha版本页面没能及时更新的问题 雷晶 获取提问问题时间更新到数据库 林巧娜 今 ...
- 【IdentityServer4文档】- 术语&演示服务器和测试
术语 你需要了解一下,规范.文档和对象模型使用的术语有哪些. IdentityServer IdentityServer 是一个 OpenID Connect 提供程序 - 它实现了 OpenID C ...
- 处理了一个以前写的java小程序的异常
之前用java做过0-99的数字和英文之间的翻译,输入数字就会翻译成英文,输入英文会翻译成数字,比如输入56 输出fiftysix 输入fiftysix 输出56, 发现这会有一个异常,当输入 ...
- shader language学习(1)——shader language简介背景
shader language,称为着色语言,shade在英语是阴影.颜色深浅的意思.shader language基于物体本身属性和光照条件,计算美格橡塑的颜色值. 实际上这种解释具有明显的时代局限 ...
- Struts2(七)
以下内容是基于导入struts2-2.3.32.jar包来讲的 1.xml验证 Struts2提供了验证器,实现了通用的验证逻辑.例如: 非空验证器.长度验证器.日期验证器.email验证器等.具体定 ...
- 桥接,NAT,Host Only的区别
桥接,NAT,Host Only的区别 一.Brigde——桥接 :默认使用VMnet0fish批注:只要在虚拟机中将IP设对,即使宿主机的IP是错的,也可以通信.但是如此物理网卡被禁用了,则不能 ...
- linux的一些机制Signal, Fork,
signal(SIGCHLD, SignalHandler); 注册软中断,对应的api close(socket); ret=fork(): 父进程,返回子进程的pid. 子进程返回0, 出错返回& ...
- malloc与free函数用法
在C里,内存管理是通过专门的函数来实现.另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明 (Windows 本身也由C和汇编语言写成). 1 分配内存 malloc 函数 ...