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, ...
随机推荐
- LA 4256 商人
题目链接:https://vjudge.net/contest/160916#problem/B 题意:给一个无向图,和一个序列:要求,在这个序列中,两两相连的两个数相同,或者,在无向图中相邻:(n& ...
- sparkStreamming原理
一.Spark Streamming 是基于spark流式处理引擎,基本原理是将实时输入的数据以时间片(秒级)为单位进行拆分,然后经过spark引擎以类似批处理的方式处理每个时间片数据. 二.Spar ...
- POJ 2195 Going Home 【二分图最小权值匹配】
传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- ASP.NET MVC有用工具
Route Debugger https://www.nuget.org/packages/routedebugger 在Asp.Net MVC程序中,路由(Route)是一个非常核心的概念,可以说是 ...
- 活到老学到老:iOS开发中的基础知识(一)
本文参考 标哥的博客:宝库iOS开发笔试题 进行学习整理.与其说是看面试题,不如说是对自己知识的巩固.工欲善其事必先利其器,基础知识不牢固可能会导致编程中的一些注意不到的问题.总之一句话:活到老,学到 ...
- IntelliJ Idea 常用快捷键列表和快速输入
IntelliJ Idea 常用快捷键列表和快速输入 快速输入查看 最常用快捷键 Alt+Enter 万能快捷键,用于引入错误包 Ctrl+ Mouse left 快速调转定义 快捷键 Ctrl+Sh ...
- UICollectionViewCell「居左显示」
UICollectionViewCell「居左显示」 准备: 1.UICollectionView Left Aligned Layout 一款UICollectionView居左显示的约束点击下载_ ...
- 构建高可靠hadoop集群之4-保全模式
本文主要翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/SecureMode.html 译注:之所以 ...
- (第03节)三种ApplcationContext的实现
- nginx 安装目录详解
rpm -ql nginx 路径 类型 介绍 /etc/logrotate.d/nginx 配置文件 Nginx 日志轮转,用于logrotate服务日志切割 /etc/nginx /etc/ng ...