Hibernate框架之get和load方法的区别

我们在学习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方法将会抛出异常。

时间: 2024-10-13 12:31:11

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

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

1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常: get方法检索不到的话会返回null: 2.从检索执行机制上对比: load方法的执行则比较复杂首先查找session的persistent Context(一级缓存)中是否有缓存,如果有则直接返回,如果没有则去查找二级缓存,如果有则返回,如果没有则判断是否是lazy,若不是lazy,直接访问数据库检索,查到记录返回(并且同时在二级缓存中存放查到的数据方便下次使

hibernate中懒加载和急加载的区别,以及hibernate中get()方法和load()方法的区别

* 懒加载在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存.而急加载在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询. 急加载就会很快,因为在第一次加载的时候,已经帮我们全部加载好了.而懒加载则会相对慢一些,因为在我门需要查询的时候,它才会执行sql操作. 所以懒加载的优点是占用内存小,执行速度慢;急加载是执行速度快,占用内存高 hibernate的get()he load()方法在执行的时候又很大的区别, 执行get()方法会把所有的基本数据全部加载, 而

Hibernate面试题 --- list和iterator方法的区别

Hibernate面试题  ---  list和iterator方法的区别 1.首先看两个例子来比较一下 (1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出: 1 @Test 2 public void listQuery() { 3 4 Configuration configuration = new Configuration().configure(); 5 SessionFacto

hibernate架构之session中get与load方法的区别

hibernate是一个用于连接数据库的升级版JDBC,与一般JDBC不同的是,hibernate架构是通过hql进行查找,通过session建立连接.其工作原理是:将实例分为瞬时状态.持久状态.游离状态,通过hql对持久状态的实例进行CRUD.在学习的过程中我们遇到了这样的一个现象:用Session对象调用get()方法和load()方法获取对象时,类似的代码会分为两种结果,get方法运行成功,load方法会报错,代码示例如下: get()方法源代码: Session session= Hib

Hibernate中get()和load()方法的区别

在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的. 一.load加载方式 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出SQL语句,当前得到的这个对象其实是一个代理对象,这个代理对象

Hibernate 中get()与load()方法的区别

一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null 而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定

hibernate的get方法和load方法区别

读者需注意:Hibernate版本不同,运行机制不太一样,以下是hibernate3.x作为讲解 get方法: Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null 结论:对于get方法,hibernate一定要获取到真实的数据,否则返回null load方法: 根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论: 若为true,先在Session缓存中查找,看看该id对应的

Hibernat的get()和load()方法的区别

get()方法是立即查询 load()方法是延迟查询,Person person = (Person)session.load(Person.class,1);这句话其实没有去查找数据库,只是返回了一个代理.当真正需要的时候才去查找数据库比如输出System.out.println(p.getName());这个时候才发出查找数据库,所以load()方法是延迟查询.如果输出的 是ID也不会发出查询语句,因为Person person = (Person)session.load(Person.c

get方法和load方法的区别

get方法的特点 get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询 get方法查询后返回的是真实对象的本身 load方法的特点 load方法采用的是延迟加载(懒加载lazy:什么时候使用,才会去加载)的策略:执行到这行的时候,不会发送 SQL语句,什么时候使用这个对象,才会发  送SQL语句. load查询后返回的是代理对象 原文地址:https://www.cnblogs.com/coder-wf/p/12221247.html