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文件),我们可以取消懒加载

时间: 2024-10-09 15:04:30

Hibernate中get和load的相关文章

Hibernate中get和load的区别

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

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

Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: User user=session.get(User.class, "1"); 当get()方法被调用的时候就会立即发出SQL语句: Hibernate: select user0_.ID as ID1_1_0_, user0_.CREATETIME as CREATETI2_1_0_, user0_.UPDAT

hibernate中get和load的理解

hibernate中查询时,有get和load两种方法,但两者有一些不同,说说我的理解. get是直接从数据库中查询,而load是缓存. 比如,getBean表示get方法查到的对象,loadBean表示load方法查到的对象. 在getBean中,该对象中所有的属性,已经全部封装完毕了: 但是loadBean中,只封装了该对象的id,其他的值还没有封装,要等到我们去调用这些值的是,才会去数据库中查出来封装进去. 所以,getBean中的属性,我们可以随时调用: 但是loadBean中的属性,我

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

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

hibernate中get和load区别

在日常开发中,获取数据时必不可少的,这样就要用到get和load方法来实现了.下面简单说一下get和load的区别. 1.返回值不同 使用get方法检索数据时,没有该数据返回值为null. 而使用load方法时,则返回org.hibernate.ObjectNotFoundException异常,如下: 2.检索机制不同 get方法和find方法都是直接从数据库中检索 而load方法的执行则比较复杂首先查找session的persistent Context中是否有缓存,如果有则直接返回 如果没

【hibernate】Hibernate中get()和load()的区别

Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: 1 User user=session.get(User.class, "1"); 当get()方法被调用的时候就会立即发出SQL语句: 1 2 3 4 5 6 7 8 9 10 11 Hibernate:     select         user0_.ID as ID1_1_0_,         use

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

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

SHOP++ 中 hibernate中get()与load()的区别

这是我最近看shop++4.0 源码 体会到的一些东西,因为要做二次开发,所以先记录下来. 1.使用load()方法:         hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,使用代理来延迟加载该对象.在用到对象中的其他属性数据时才查询数据库,如果数据库中不存在该条记录,此时会抛异常,load方法抛异常是指在使用该对象的数据(调用get()方法获取属性)时,当数据库中不存在该数据时,才抛出异常,而不是在创建这个对象时.由于session缓存问题,在load时会

详解Hibernate中的NoSession问题

1.前言 今天在整合SSH框架的时候,当在表现层调用bean层查找数据的时候,报错,具体如下所示 根据字面上的意思,应该是代理不能被初始化,session已经关闭,这篇博客就来解决一下这个问题. 2.NoSession问题 1.原因分析 当执行Session的load()方法时,Hibernate不会立即执行查询CUSTOMERS表的select语句,仅仅返回Customer类的代理类的实例,这个代理类具由以下特征: (1)由Hibernate在运行时动态生成,它扩展了Customer类,因此它