开发者社区> 阿秀a> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Hibernate中Session.load与Session.get的区别

简介: Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于: 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
+关注继续查看

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

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session在加载实体对象时,将经过的过程:

首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前所有由本SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。
之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件(相当于一个查询黑名单列表)。如此一来,如果Session中一个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。
对于load方法而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。
如在缓存中未发现有效数据,则发起数据库查询操作(Select SQL),如经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。
根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。
将其数据对象纳入当前Session实体管理容器(一级缓存)。
执行Interceptor.onLoad方法(如果有对应的Interceptor)。
将数据对象纳入二级缓存。
如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。
返回数据对象
文章出处:飞诺网(
www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20090215/155632.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Hibernate-ORM:04.Hibernate中的get()和load()
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)   Hibernate中查询单个,...
1091 0
Hibernate详细教程
一、搭建Hibernate环境 1.在src目录下创建hibernate.cfg.xml配置文件 PS:文件的名字不能改! root 1234 com.
869 0
hibernate5(6)操纵对象入门[1]Session缓存

java对象在JVM中的存活条件

在java中,我们使用User user = new User();来创建一个java对象时,JVM会为其分配一块内存空间,此时,这个对象被变量“user”引用,那么它就会一直存在于内存中,而

1338 0
hibernate错误
今天研究新的架构。 数据库连接方式用的hibernate。 以前没有深入接触hibernate。先说一下流程。 po包,下面,实体类,Person.java    Person.hbm.xml映射文件。 出错如下:特别多,没有必要仔细看,粗略看看与你出错是不是一样就得了。 [ERROR][2016/01/07 09:54:29,723][org.springframework.
1289 0
Hibernate杂问
1 谈谈你对ORM框架的基本思想的了解?    首先 ORM是 对象关系映射,是为了解决类似于JDBC实现对象持久化的问题开发的。     框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射。
729 0
Hibernate中Session接口的用法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/8906227 Session的save()和persist()方法 Session的save()方法使一个临时对象转变为持久化对象。
854 0
翻译的Hibernate的Session的javadoc
org.hibernateInterface Session All Superinterfaces: Serializable All Known Subinterfaces: EventSource, Session All Known Implementing Classes: SessionImpl public interface Session exte
1050 0
+关注
阿秀a
专注于大型分布式系统的架构和实践,精通阿里云相关产品使用,专注阿里云VPC,专有云,分布式服务互通等技术的研究
114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载