Hibernate-ORM:04.Hibernate中的get()和load()
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)
Hibernate中查询单个,就是用get()或load()任意一个做操作即可!
我会讲明区别和相同的地方,再加上一些验证我说的区别和相同的实例:
一,查询单个
1.使用get()查询单个
@Test
/*get他是直接加载*/
public void t4GetDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
2.使用load()查询单个
@Test
/*load他是懒加载*/
public void t5LoadDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
二,相同处:
1.get()和load()都使用缓存,他们查找记录的策咯是,先找一级缓存,有就拿来用,没有再去找二级,二级还没有就找数据库
(验证规则:同样的查俩次,看看发几次sql不就好了么!)
/*get查记录从一级缓存开始找,一级没找到去二级找,二级没找到去数据库,数据库没找到返回null*/
@Test
/*测试get缓存1*/
/*从他只发一条sql就知道他走的有缓存,因为二级缓存没有配置,所以,是一级缓存*/
public void t6GetCacheDemo01(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
}
2.他俩使用基本相似,传的同样俩个参数,返回值也一样
三,区别:
1.get()是直接加载,load是懒加载(又称延迟加载)
(验证:)
/*get和load都是查询,区别:*/
@Test
/*get他是直接加载*/
public void t4GetDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
@Test
/*load他是懒加载*/
public void t5LoadDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
/*测试在有懒加载的时候不使用它查不查数据*/
public void t12LoadLazyTrueDemo02(){
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
}
2.查询一个没有的记录,get()返回的是null,load()则会引发异常ObjectNotFoundException
@Test
/*测试get获取一个没有的值*/
public void t9GetHaventDemo01(){
Teacher teacher = session.get(Teacher.class, 5);
System.out.println("----------------------------------");
System.out.println(teacher);
}
@Test
/*测试load获取一个没有的值,会抛ObjectNotFoundException*/
public void t10LoadHaventDemo01(){
Teacher teacher = session.load(Teacher.class, 5);
System.out.println("----------------------------------");
System.out.println(teacher);
}
四,操作一级缓存查看对get()和load()的影响(清除单个缓存,和全部缓存)
@Test
/*清除单个缓存*/
public void t7GetCacheDemo02(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 2);
System.out.println("----------------------------------");
session.evict(teacher1);
teacher1= session.get(Teacher.class, 1);
}
@Test
/*清除全部缓存*/
public void t8GetCacheDemo03(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 2);
System.out.println("----------------------------------");
session.clear();
teacher1= session.get(Teacher.class, 1);
teacher2 = session.get(Teacher.class, 2);
}
结论:get()和load()确实使用到了缓存,如果缓存被清除,他们就得再发sql到数据库去查
五,load()也可以直接加载
方案:
在**.hbm.xml小配置文件中,配置延迟加载lazy=false
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day01.entity">
<!--如果上面指定package的话,class的name就不必写全类名-->
<!--lazy:是否懒加载(延迟加载) 默认值是true,延迟加载-->
<!--<class name="Teacher">-->
<!--直接加载-->
<class name="Teacher" lazy="false">
<!--主键-->
<id name="id" column="tid">
<!--主键生成策咯 assigned程序员自己创建-->
<!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
<!--increment是先查最大的主键列,在下一条给主键加一-->
<!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
<generator class="assigned"></generator>
</id>
<property name="name" column="name"></property>
</class>
</hibernate-mapping>
测试:
@Test
/*测试在没有懒加载的时候不使用它查不查数据*/
public void t12LoadLazyTrueDemo02(){
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
}
作者:晨曦Dawn
转载请注明出处,博客地址:https://www.cnblogs.com/DawnCHENXI/p/9090682.html
如果有错误,请指出,感激不尽!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hibernate-ORM:04.Hibernate中的get()和load()的更多相关文章
- Hibernate 系列 04 - Hibernate 配置相关的类
引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...
- ORM和Hibernate的配置方式
分层体系结构: 逻辑上一般分为三层:表述层(提供与用户交互的界面).业务逻辑层(实现各种业务的逻辑).数据库层(负责存放和管理应用的持久性业务数据). 物理上一般分为两层:物理层(每一层都运行在网络上 ...
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- hibernate学习(三) hibernate中的对象状态
hibernate对象的状态分为三种: 游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration cfg=new Configuration().configure(); ...
- Hibernate之ORM与Hibernate
ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...
- Hibernate (ORM)
1 框架体系结构 2 hibernate入门 2.1 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational: ...
- Hibernate中的session和load延迟载入矛盾问题,怎样解决?
假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter> <filter-n ...
- ORM框架Hibernate (一) 对DAO封装和抽象
说明 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库 ...
- hibernate里的generator中class =value介绍
在*.hbm.xml必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识.<generator class="sequence ...
- wildfly 10上使用最新的 Hibernate ORM OGM
ORM是关系型数据库连接:ogm是No sql数据库连接,Mongo, redis等. 1,下载ogm zip包,解压到wildfly_home\modules\system\layers\base, ...
随机推荐
- IOS 触摸事件的处理
触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointIn ...
- Android(java)学习笔记16:多线程 - 定时器概述和使用
1. 定时器: 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行. 在Java中,可以通过Timer和TimerTask类来实现定义调度的功能 Timer public ...
- 高通Vuforia
这里使用高通的Vuroria来做一个AR歌姬. 工具: Vuforia,MMD4Mecanim 模型: 初音未来pmd模型文件,极乐净土vmd动作文件. 逻辑: 当发现识别卡时:开启音乐,模型速度为1 ...
- 关于APIT定位算法的讨论
关于APIT定位算法的讨论 [摘要] 无线传感器网络节点定位机制的研究中,基于距离无关的定位技术得到快速发展,其中基于重叠区域的APIT定位技术在实际环境中的定位精度高,被广泛研究和应用. [关键 ...
- LA 2038 最少点覆盖
题目链接:https://vjudge.net/problem/UVALive-2038 题意:我看了原题,lrj的书上题意写错了,应该是最少点覆盖,当然可以用最大匹配去做,由于是树形的: 可以树形D ...
- FFT抄袭笔记
你看我都不好意思说是学习笔记了,毕竟\(FFT\)我怎么可能学得会 那就写一篇抄袭笔记吧ctrl+c真舒服 先从多项式说起吧 1.多项式 我们定义一个多项式 \[F(x)=\sum_{i=0}^{n- ...
- UVA1184 Air Raid
嘟嘟嘟 最小路径覆盖板子题. 建二分图,然后跑Dinic(因为我不会匈牙利),然后ans = n - maxflow(). 主要是发一下用链前存图的写法.(好像比vector短一点) #include ...
- 在文本框输入数据后,因为有历史记录,鼠标点或者敲回车这个历史记录时,请问会触发什么JS事件
非ie触发 oninput事件,ie触发>onpropertychange事件 jquery写法 $("#input").bind("input propertyc ...
- 【题解】洛谷P2914[USACO08OCT]断电Power Failure
洛谷P2914:https://www.luogu.org/problemnew/show/P2914 哇 这题目在暑假培训的时候考到 当时用Floyed会T掉 看楼下都是用Dijkstra 难道没有 ...
- Redis集群整合到springboot框架
整合步骤 1 配置application.properties spring.redis.cluster.nodes=192.168.60.131:8000,192.168.60.131:8001,1 ...