Hibernate中get和load

Posted 冉兵成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate中get和load相关的知识,希望对你有一定的参考价值。

首先观察这样一个实验
  Student stu=(Student) session.get(Student.class, 1); //切换这个位置
  System.out.println("--------------------------------我是华丽丽的风格线----------------------------------------------------");
  System.out.println(stu.getStuName());


当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

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


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


如果使用get方式来加载对象,当我们试图得到一个id不存在的对象时,此时会报NullPointException的异常


如果使用load方式来加载对象,当我们试图得到一个id不存在的对象时,此时会报ObjectNotFoundException异常:

get查询为空会得到一个null而load会报异常

 


(1)get()方法直接返回实体类,如果查不到数据则返回null。load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常

 

(2)load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load在默认情况下支持延迟加载(lazy)

 

(3) get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)。总之,如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)


(4)get和load查询数据库

 

1. 如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException

2. 使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)

3. 通过修改配置文件(*.hbm.xml文件),我们可以取消懒加载

 

以上是关于Hibernate中get和load的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中Session的get和load

Hibernate中Session的get和load

hibernate的get方法和load方法区别

Hibernate中使用load和get加载的区别

Hibernate的load和get方法的区别

hibernate中get和load的理解