1、共同点:get和load都是根据Id单条查询获取对象

org.hibernate.Session.load(Class<User> theClass, Serializable 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方法对比的更多相关文章

  1. Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  2. Hibernate学习---用Session实现CURD

    我们使用Hibernate的目的是什么?对数据库进行操作,所有接下来我们就用Hibernate来进行CURD. 前边我们已经分析过了Configuration,SessionFactory和Sessi ...

  3. Hibernate学习(四)get和Load比较

    package cn.lonecloud.test.crud; import org.hibernate.HibernateException; import org.hibernate.Sessio ...

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

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...

  5. Hibernate的Session的get()和load()方法区别

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别. get Session接口提供了4个重载的get方法,分别通过“持 ...

  6. session get和load方法对比

    get测试代码如下: public class Test { public static void main(String[] args) { // TODO Auto-generated metho ...

  7. jQuery 学习05——AJAX:定义、load()方法、get()/post()方法

    AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). load() 方法:从服务器加载数据,并把返回的数据放入被选元素中. 语法:$ ...

  8. hibernate中session的get和load方法的区别和联系:

    1. get:及时加载,调用到get方法时立即向数据库查询(在没有session缓存的请况). 2. load:默认使用懒加载,当用到数据的时候才向数据库查询(在没有session缓存的请况). 3. ...

  9. Hibernate学习三----------session详解

    © 版权声明:本文为博主原创文章,转载请注明出处 如何获取session对象 1. openSession 2. getCurrentSession - 如果使用getCurrentSession需要 ...

随机推荐

  1. Python3 函数式编程自带函数

    一 map函数 引子 需求1:num1=[1,2,3,4],我的需求是把num1中的每个元素平方后组成新列表. ret = [] num1 = [1,2,3,4] for i in num1: ret ...

  2. loadrunner--基础2

    LR11-03 一.并发测试(n VU) 1.并发测试两个条件 1)脚本中要有 集合点(并发点) 2)控制台中要设置并发策略(选择第一项,所有虚拟用户到达集合点后释放) 集合点: 5个线程,代表5个V ...

  3. 依据Right-BICEP要求的对四则运算2的测试

    代码: #include <iostream> #include <time.h> #include <stdio.h> #include <stdlib.h ...

  4. Docker 安装与常用命令介绍

    docker的镜像文件作用就是:提供container运行的文件系统层级关系(基于AUFS实现),所依赖的库文件.已经配置文件等等. 安装docker yum install -y docker 启动 ...

  5. 第二周:Scrum Meeting

    一.站立会议 顾名思义,站立会议即是在敏捷开发的冲刺阶段,为了更好地平衡团队成员的“交流”和“集中注意力”之间的矛盾.通过每日例会,即团队成员通过面对面的交流,并且其中大多数团队成员站着对会议进行讨论 ...

  6. django amdin页面下拉列表的外键增加条件过滤

    class MenuList(admin.ModelAdmin): list_display = ('menuId', 'menuName', 'menuDesc', 'menuType', 'sor ...

  7. vscode如何用浏览器预览运行html文件

    1,打开vscode编辑器,点击编辑器主界面左上侧第五个小图标——‘扩展’按钮: 2,进入扩展搜索右拉框,在应用商店搜索框中输入“view in browser”会自动进行搜索 3,等待几秒钟时间,扩 ...

  8. 如何在DBGrid里实现Shift+“选择行”区间多选的功能!

    DELPHI 的TDBGrid 控 件 主 要 用 来 处 理 数 据 表, 它 的 属 性 中 有 一 个dgMultiSelect, 若 此 属 性 设 定 为TRUE, 则 可 以 选 中 多  ...

  9. CCSDS标准的LDPC编译码仿真

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  10. HDU4753 Fishhead’s Little Game——2013 ACM/ICPC Asia Regional Nanjing Online

    今天比赛又是做得好水的.被狂虐啊. 比赛两个多小时一直没出题,遒遒最先交的若干发都wa了.T_T 我独自在一遍苦思了1006这个题,还好最后把这个题目A掉了,不然又是深坑队友. 题目的意思我就不多说了 ...