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. C++ STL 优先队列 priority_queue 详解(转)

    转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...

  2. The Bits (思维+找规律)

    Description Rudolf is on his way to the castle. Before getting into the castle, the security staff a ...

  3. 多源最短路——Floyd算法

    Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...

  4. QSettings配置读写-win注册表操作-ini文件读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSettings配置读写-win注册表操作-ini文件读写     本文地址:http:// ...

  5. 【Leetcode】50. Pow(x, n)

    Implement pow(x, n). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 O ...

  6. apache反向代理服务器

    1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器) 适用于: ①局域网的代理服务器 ...

  7. Eureka服务注册过程

    上篇博客<SpringCloud--Eureka服务注册和发现>介绍了Eureka的基本功能,这篇我们来聊聊eureka是如何实现的. 上图是eureka的架构图,Eureka分为Serv ...

  8. fsocket发送post实现异步请求

    function triggerRequest($url, $post_data = array(), $cookie = array()){ //可以通过POST或者GET传递一些参数给要触发的脚本 ...

  9. Android中res/layout文件夹里新建布局文件,R中不生成ID的奇葩错误

    新浪微博:http://weibo.com/u/1928100503 网上看了下,发现大都是xml文件名大写而导致的id不能生成的问题,但在下的问题却不是大小写的问题,在下发现,当你的layout目录 ...

  10. promise你懂了吗?

    你能答对几题? 题目一 const promise = new Promise((resolve, reject) => { console.log(1) resolve() console.l ...