我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get和load这两个方法。

我们都知道这两个方法都能够去加载对象,但是他们之间的区别我们必须要去了解一下,这可能也会成为面试的重点。下面我们

主要分析一下get和load这两个方法的区别:

一.Load加载方式和get加载对象方式的区别:

1.load加载方式:

Hibernate在使用Load方法获取一个对象时,Hibernate会采用延迟加载的机制来加载这个对象。

我们可以来看一个例子来证明一下:

package cn.hyj.Test;

import org.hibernate.Session;

import cn.hyj.entity.User;
import cn.hyj.util.HibernateUtil;

public class test1 {
  public static void main(String[] args) {
      //实例化一个工具类,主要用户回去session对象
    HibernateUtil hu=new HibernateUtil();
    //通过currentSession获取session对象
    Session session=hu.currentSession();
    //通过load方法加载User对象
    User user=(User)session.load(User.class, new Integer(42));
    System.out.println("没有执行查询的sql");
    }
}

我们可以来看一下控制台的效果:

我们看到,如果我们仅仅是通过load来加载我们的User对象,此时从控制台我们会发现并不会从数据库中查询出该对象,即并不会发出sql语句。

如果我们在后面要输入这个对象我们可以看到这样一个结果:

public static void main(String[] args) {
      //实例化一个工具类,主要用户回去session对象
    HibernateUtil hu=new HibernateUtil();
    //通过currentSession获取session对象
    Session session=hu.currentSession();
    //通过load方法加载User对象
    User user=(User)session.load(User.class, new Integer(42));
    System.out.println(user);
  }

控制台输出结果:

当你输出user对象的时候,我们可以在控制台看出他会在数据库中将这个对象查询出来。这个时候我们应该产生一个疑问,刚才不是说load方法查询出对象不会发出sql语句,但为什么输出user对象会发出sql语句。这时又要抛出一个概念了,就是代理对象。这个代理对象其实仅仅保存了id这个属性。

为了证明这个代理对象保存的只有id这个属性我们可以看下面一段案例:

 public static void main(String[] args) {
      //实例化一个工具类,主要用户回去session对象
    HibernateUtil hu=new HibernateUtil();
    //通过currentSession获取session对象
    Session session=hu.currentSession();
    //通过load方法加载User对象
    User user=(User)session.load(User.class, new Integer(42));
    System.out.println(user.getId());
  }

我们可以看一下如果我查询这个对象的别的属性,那么他会发出sql吗?

 public static void main(String[] args) {
      //实例化一个工具类,主要用户回去session对象
    HibernateUtil hu=new HibernateUtil();
    //通过currentSession获取session对象
    Session session=hu.currentSession();
    //通过load方法加载User对象
    User user=(User)session.load(User.class, new Integer(42));
    System.out.println(user.getName());
  }

答案可想而只,因为我在上面已经说了,user只不过是一个代理对象,他只保存了id这个属性,所有当你输出user的其他属性值,他会根据这个id到数据库进行查询。

2.get加载方式

相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来。

public static void main(String[] args) {
      //实例化一个工具类,主要用户回去session对象
    HibernateUtil hu=new HibernateUtil();
    //通过currentSession获取session对象
    Session session=hu.currentSession();
    //通过load方法加载User对象
    User user=(User)session.get(User.class, new Integer(42));
  }

控制台输出结果:

经过上述的几个案例我们可以看到,使用load的加载方式比get的加载方式性能要好一些,因为load加载时,得到的只是一个代理对象,当真正需要使用这个对象时再去从数据库中查询。

二.关于get和load方法遇到根据主键查不到数据的区别:

1.get方式:

当使用Session中的get方法来获取对象时,如果查询主键为11的用户信息,如果数据库中没有这条信息,则get方法返回的是NULL。

2.load方式:

当使用Session中的load方法来获取对象时,如果查询主键为11的用户信息,如果数据库中没有这条信息,则load方法将会抛出异常。

Hibernate框架之get和load方法的区别的更多相关文章

  1. Hibernate中get方法和load方法的区别

    一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...

  2. Hibernate中session回话的get方法和load方法的区别

    1.报错方式不同: 前提:获取的数据不存在 get方法会报异常:空指针异常 load方法会报异常:对象为找到异常,给定值没有行存在. 2.load方法 这种方式总是会返回一个代理而不是真正得去查询数据 ...

  3. hibernate的get方法和load方法区别

    读者需注意:Hibernate版本不同,运行机制不太一样,以下是hibernate3.x作为讲解 get方法: Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然 ...

  4. hiberante中get和load方法的区别

    1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索执行机制上对比: ...

  5. initialize和init以及load方法的区别与使用以及什么时候调用

    initialize不是init initialize在这个类第一次被调用的时候比如[[class alloc]init]会调用一次initialize方法,不管创建多少次这个类,都只会调用一次这个方 ...

  6. get方法和load方法的区别

    get方法的特点    get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询    get方法查询后返回的是真实对象的本身   load方法的特点    load方法采用的是延 ...

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

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

  8. Hibernate的Session会话中get()和load()方法的区别

    1.get和load都可以从数据库中获取数据 .get拿到的是真的对象,load拿到的是代理对象 2.get和load从数据库中获取数据,如果获取不到,get返回null,load会出现ObjectN ...

  9. json.dumps(),json.loads(),json.dump(),json.load()方法的区别

    1. json.dumps() json.dump()是将字典类型转化成字符串类型. import json dic = {'a':'1111','b':'2222','c':'3333','d':' ...

随机推荐

  1. 精通javascript(看书笔记)

    变量的类型检查 //检测类型 var str = "Hello World"; if (typeof str=="string") {//使用typeof来判断 ...

  2. BZOJ1691: [Usaco2007 Dec]挑剔的美食家

    传送门: 一句话题解:贪心+treap 好几天前刚学的treap,然后真到了考treap又写不出来,这么辣鸡还搞什么OI 先按$A_i$递减排序,然后把$C_i$也递减排序,然后用一个指针指向$M$序 ...

  3. css015 定位网页上的元素

    css015 定位网页上的元素 一.   定位属性的功能 1.         四中类型的定位 Position: absolute relative fixed static a. 绝对定位 绝对定 ...

  4. asp.net 性能优化

    在MSDN网络课堂中下载了一些九月份的网络讲座.有很多还是很有意义的.<ASP.NET系列讲座之一:性能与缓存>是由微软开发工具专家王立楠讲授.王先生的讲解非常清晰,课件也很详细,虽然是网 ...

  5. 阻塞式socket例子学习

    /************************************************************************* > File Name: Win_Serve ...

  6. js内存泄漏

    IE和webkit浏览器都是采用计数来处理垃圾,也就是说每个对象被引用一次,该对象的计数器成员+1,如果计数器为0,那么这个对象被销毁 例如: function A() { var obj = {}; ...

  7. macbook 放flash发烫,转html5

    http://zythum.sinaapp.com/youkuhtml5playerbookmark/

  8. 分享一个控制JS 浏览器缓存的解决办法。

     JS 缓存的问题一直都是我们又爱又恨的东西.也是我们比较头痛的问题, 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端, 但是另一方面,当js 文件有改动的时候 ...

  9. php Hash Table(一) Hash Table的结构

    关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...

  10. msbuild

    https://msdn.microsoft.com/zh-cn/library/ms171466(v=vs.100).aspx