Hibernate学习之get和load区别
结论:
insert():插入记录并将同步更新到session缓存。
update():更新记录并同步更新到session缓存。
delete():删除记录并同步更新session缓存。
get():
如果缓存中存在要查找的记录,直接返回该条记录。
如果缓存中不存在要查找的记录,则执行查询语句,在数据库中查找。
load():若上次已执行过load,也查找不到该记录并抛出ObjectNotFoundException异常,则这次也会直接抛出异常,不会再执行Sql查询,而且不管在这中间是否插入了记
录。
若上次已执行过get,也查找不到该记录并返回Null,这次依旧会执行SQL查询,若查找不到抛出ObjectNotFoundException异常。
实例:
代码:
@Test
public void test9(){
try{
test1();
Session s = sessionFactory.openSession();
System.out.println(s.get(Person.class, 1L));//get查询
System.out.println(s.get(Person.class, 1L));//get查询
System.out.println(s.load(Person.class, 1L));//load查询
System.out.println(s.load(Person.class, 2L));
System.out.println(s.get(Person.class, 2L));
System.out.println(s.get(Person.class, 3L));
System.out.println(s.get(Person.class, 3L));
try{
System.out.println(s.load(Person.class, 3L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
save(s, 3L);
try{
System.out.println(s.load(Person.class, 3L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
System.out.println(s.get(Person.class, 3L));
System.out.println(s.load(Person.class, 3L));
try{
System.out.println(s.load(Person.class, 4L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
save(s, 4L);
try{
System.out.println(s.load(Person.class, 4L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
Person p = (Person) s.get(Person.class, 4L);
System.out.println(s.get(Person.class, 4L));
System.out.println(s.load(Person.class, 4L));
p.setAge(121212);
update(s, p);
System.out.println(s.get(Person.class, 4L));
delete(s, p);
System.out.println(s.get(Person.class, 4L));
try{
System.out.println(s.load(Person.class, 4L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
}
日志:
Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
Person [id=1, name=张三, age=12, birthDay=2014-08-29]
Person [id=1, name=张三, age=12, birthDay=2014-08-29]
Person [id=1, name=张三, age=12, birthDay=2014-08-29]
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
Person [id=2, name=李四, age=22, birthDay=2014-08-29]
Person [id=2, name=李四, age=22, birthDay=2014-08-29]
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
null
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
null
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#3]
Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#3]
Person [id=3, name=张三, age=12, birthDay=Fri Aug 29 16:33:31 CST 2014]
Person [id=3, name=张三, age=12, birthDay=Fri Aug 29 16:33:31 CST 2014]
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
Person [id=4, name=张三, age=12, birthDay=Fri Aug 29 16:33:31 CST 2014]
Person [id=4, name=张三, age=12, birthDay=Fri Aug 29 16:33:31 CST 2014]
Hibernate: update person set pname=?, birthDay=?, age=? where pid=?
Person [id=4, name=张三, age=121212, birthDay=Fri Aug 29 16:33:31 CST 2014]
Hibernate: delete from person where pid=?
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
null
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
日志分析:
@Test
public void test9(){
try{
test1();
//新增id为1,2的两条记录
//Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
//Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
Session s = sessionFactory.openSession();
System.out.println(s.get(Person.class, 1L));//get查询
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
// Person [id=1, name=张三, age=12, birthDay=2014-08-29]
//分析:执行了查询语句,查到了id为1的记录
System.out.println(s.get(Person.class, 1L));//get查询
//日志输出:Person [id=1, name=张三, age=12, birthDay=2014-08-29]
//分析: 没有执行查询语句,直接获取了结果,说明上次get获取的结果已存入session,而这次get发现session中已存在id为1的记录,直接返回
System.out.println(s.load(Person.class, 1L));//load查询
//日志输出:Person [id=1, name=张三, age=12, birthDay=2014-08-29]
//分析:没有执行查询语句,直接获取了结果,说明上次get获取的结果已存入session,而这次load发现session中已存在id为1的记录,直接返回
System.out.println(s.load(Person.class, 2L));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
// Person [id=2, name=李四, age=22, birthDay=2014-08-29]
//分析:session中没有id为2的记录,执行查询语句,找到了id为2的记录
System.out.println(s.get(Person.class, 2L));
//日志输出:Person [id=2, name=李四, age=22, birthDay=2014-08-29]
//分析:没有执行查询语句,直接获取了结果,说明上次load获取的结果已存入session,而这次get发现session中已存在id为2的记录,直接返回
System.out.println(s.get(Person.class, 3L));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
//null
//分析:查询session缓存中没找到id为3的记录,执行查询语句,也没有查到id为3的记录,返回Null
System.out.println(s.get(Person.class, 3L));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
// null
//分析:在session中没有找到id为3的记录,再次执行查询语句,也没有查到id为3的记录,返回Null
try{
System.out.println(s.load(Person.class, 3L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
// ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
//分析:查询缓冲不存在id为3的记录,执行查询语句,在数据库中也未发现id为3的记录,抛出异常,说明未采用上次get的结果
}
save(s, 3L);
//日志输出:Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
//分析:执行插入记录的语句
try{
System.out.println(s.load(Person.class, 3L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
//分析:查询缓冲不存在id为3的记录,但未执行查询语句,抛出异常,说明直接采用了上次load的结果
}
System.out.println(s.get(Person.class, 3L));
//Person [id=3, name=张三, age=12, birthDay=2014-08-29]
//分析:缓冲存在id为3的记录,直接返回。说明save时已经更新了缓存中的记录
System.out.println(s.load(Person.class, 3L));
//日志输出:Person [id=3, name=张三, age=12, birthDay=2014-08-29]
//分析:缓存中存在id为3的记录,直接返回,不执行查询语句
try{
System.out.println(s.load(Person.class, 4L));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
//分析:缓存中不存在id为4的记录,执行查询语句
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
//分析:在数据库中也未查到相应的记录,抛出异常
}
save(s, 4L);
//日志输出:Hibernate: insert into person (pname, birthDay, age, pid) values (?, ?, ?, ?)
//分析:保存id为4的记录
try{
System.out.println(s.load(Person.class, 4L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
//分析:缓存中为找到id为4的记录,但也未执行查询语句,而是直接返回,说明,该次load直接采用了上次load的结果
}
Person p = (Person) s.get(Person.class, 4L);
System.out.println(s.get(Person.class, 4L));
//日志输出:Person [id=4, name=张三, age=12, birthDay=2014-08-29]
//分析:缓存中找到id为4的记录,直接返回,不执行查询语句。
System.out.println(s.load(Person.class, 4L));
//日志输出:Person [id=4, name=张三, age=12, birthDay=2014-08-29]
//分析:缓存中存在id为4的记录,直接返回,不执行查询语句
p.setAge(121212);
update(s, p);
System.out.println(s.get(Person.class, 4L));
//日志输出:Person [id=4, name=张三, age=121212, birthDay=2014-08-29]
//分析:没有执行查询语句,说明update时也同步更新了缓存中的记录
delete(s, p);
//日志输出:Hibernate: delete from person where pid=?
//分析:执行删除语句
try{
System.out.println(s.get(Person.class, 4L));
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
// null
//分析:在缓存中没有找到id为4的记录,执行查询语句,也未找到记录,返回Null
}
try{
System.out.println(s.load(Person.class, 4L));
//日志输出:Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.birthDay as birthDay0_0_, person0_.age as age0_0_ from person person0_ where person0_.pid=?
//分析: 缓存中未找到id为4的记录,执行查询语句
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
//日志输出:ObjectNotFoundException: No row with the given identifier exists: [hibernate.entity.Person#4]
//分析: 在数据库中也未找到id为4的记录,直接抛出异常
}
}catch(Exception e){
System.out.println(ExceptionUtils.getMessage(e));
}
}
Hibernate学习之get和load区别的更多相关文章
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习之面试问题汇总
1. Hibernate 的检索方式有哪些 ? ① 导航对象图检索 ② OID检索 ③ HQL检索 ④ QBC检索 ⑤ 本地SQL检索 2. 在 Hibernate 中 Java 对象的状态有哪些 ? ...
- Hibernate学习---缓存机制
前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...
- Hibernate学习之——搭建log4j日志环境
昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...
- hibernate学习(7)——HQL查询
1.HQL查询定义 Hibernate查询分类: 1. get/load 根据OID检索 2. 对象视图检索 c.getOrders 3. Sql语句 createSqlQuery 4. Hql语句 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- hibernate中@Entity和@Table的区别
Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
随机推荐
- windows下的SASS/Compass的安装与卸载
认识SASS/Compass SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. SASS与Compass的安装说明 SASS在Wind ...
- Couldn't get lock for %t/vertx.log
今天在启动vertx框架的项目时,报“Couldn't get lock for %t/vertx.log”的错误. 解决方案: 1,找出vertx.log的目录.一般在(C:\Users\Admin ...
- 记录一下学习VC的初步过程.
有需要把状态栏图标缓存清空. 找到DELPHI和E语言的例子.最近学VC所以要改成VC的. 做控件的时候发现函数不能直接控制控件.在网上找了半天相关资料,都是说要包含"resource.h& ...
- pyes-elasticsearch的python客户端使用笔记
elasticsearch入门: http://www.qwolf.com/?p=1387 一.重要的概念 http://834945712.iteye.com/blog/1915432 这篇文章很 ...
- 普及下Oracle hints语法
普及下Oracle hints的语法:{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */ 1.hint只能出现在诸如sel ...
- 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像Thread ...
- sqrt和Hailstone
求平方根 class SqRoot{ void calcRoot(double z){ double x=1;double y=z/x; while(Math.abs(x-y)>1E-10) { ...
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- 【Tools】Pro Git 一二章读书笔记
记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: ...
- 【网络流24题】No.16 数字梯形问题 (不相交路径 最大费用流)
[题意] 给定一个由 n 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动, 形成一条从梯形的顶至底的路径.规则 1: ...