Hibernate中load和get的区别

Hibernate中Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

1.get()方法直接返回实体类,load()方法可以返回实体的代理类实例。

2.hibernate load是采用延迟机制(当lazy属性为true时) 而get不采用延迟机制(get语句马上读库)

3.找不到符合条件的数据 get方法将返回null

load将会报出ObjectNotFoundExcepion

4.get支持多态查询,load只有在lazy=false的情况下才支持多态查询

所谓多态查询,就是可以明确区分加载的是什么类型的对象,load采用代理机制无法支持

延迟加载:Hibernate尽量延迟向数据库发送sql,它自己有一个缓冲区,先把sql放在里面,最后一起发送,减少网络开销和数据库开销。

load方法原理:

当对象.hbm.xml配置文件元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作。

注意:

01.StudentEh s=(StudentEh)session.load(StudentEh.class,10);
02.
03.System.out.println(s.getId());

这两条语句同样不会产生sql语句,因为session.load后会在hibernate的一级缓存里存放一个map对象,该map的key就是id的值,但是当你getId()时,它是从一级缓存里取map的key值,而不去执行数据库查询。

当对象.hbm.xml配置文件元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。

get方法原理:

get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

总结描述:

如果使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

自己在开发过程中遇到的问题:

我们用MyEclipse hibernate工具通过数据库生成的DAO类,它的findById方法是用的session.get()方法,这是即时获得pojo对象,如果是load方法,在执行完load后如果关闭了session,那在接下来用到这个pojo对象时就会报session已关闭的错误。

时间: 2024-11-01 14:58:59

Hibernate中load和get的区别的相关文章

Hibernate中load方法与get方法的区别_java

主要区别在于是否延迟加载. load方法 不会立即访问数据库,当试图加载的记录不存在时,load方法返回一个未初始化的代理对象. get方法 总是立即访问数据库.当试图加载的记录不存在时,直接返回null 在hibernate中发现有2个方法很雷同.查阅后发现 Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于: get是直接查询数据库,如果查不到

Hibernate学习(二)Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别

      最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致.       先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接

Hibernate学习之------>Hibernate中Session.load与Session.get的区别

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象. 其区别在于: 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException. Load方法可返回实体的代理类实例,而get方法永远直接返回实体类. load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取. Session

Hibernate 中get()和load()与Hibernate简介

hibernate 中get()和load()与hibernate简介 session先判断对象是否存在,如果存在就不到数据库教程中检索.返回的对象都位于session缓存中,接下来修改了持久化对象的属性后,当session清理缓存时,会根据持久化对象的属性变化来同步更新数据库.     区别:    (1)当数据库中不存在与oid对应的记录时,load()方法抛出objectnotfoundexception异常,而get()方法返回null.    (2)两者采用不同的检索策略.     

框架-hibernate中的“二级缓存”和“类集合二级缓存”有什么关系和区别?

问题描述 hibernate中的"二级缓存"和"类集合二级缓存"有什么关系和区别? hibernate中的"二级缓存"和"类集合二级缓存"有什么关系和区别?请言简意骇的解释一下这两个呢,可举些小例子,谢谢作答 解决方案 Hibernate的一二级缓存区别

在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别?

问题描述 在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别? 在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别? 我最近在学习如何配置struts2+spring+hibernate,其中数据库连接池使用c3p0,一开始在hibernate.cfg.xml中添加c3p0连接的信息如下: <property name="hibernate.connection.provider_class"

关于hibernate中对象的三种状态分析

一.首先Hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二.Hibernate的状态 hibernate的

Hibernate中的Cache管理

Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能. Hibernate中的Cache可分为两层:一级Cache和二级Cache. 一级Cache: Session实现了第一级Hibernate Cache,它属于事务级数据缓冲.一旦事务结束,这个Cache也随之失 效.一个Session的生命周期对应一个数据库事务或一个程序事务. Session-cache保证了一个Session中两次请求同一个对象时,取得的对象是同一个JAVA