------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

本篇博客会讲如何用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()的更多相关文章

  1. Hibernate 系列 04 - Hibernate 配置相关的类

    引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...

  2. ORM和Hibernate的配置方式

    分层体系结构: 逻辑上一般分为三层:表述层(提供与用户交互的界面).业务逻辑层(实现各种业务的逻辑).数据库层(负责存放和管理应用的持久性业务数据). 物理上一般分为两层:物理层(每一层都运行在网络上 ...

  3. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  4. hibernate学习(三) hibernate中的对象状态

    hibernate对象的状态分为三种:  游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration   cfg=new Configuration().configure(); ...

  5. Hibernate之ORM与Hibernate

    ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...

  6. Hibernate (ORM)

    1 框架体系结构 2 hibernate入门 2.1 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational: ...

  7. Hibernate中的session和load延迟载入矛盾问题,怎样解决?

    假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter>  <filter-n ...

  8. ORM框架Hibernate (一) 对DAO封装和抽象

    说明 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库 ...

  9. hibernate里的generator中class =value介绍

    在*.hbm.xml必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识.<generator class="sequence ...

  10. wildfly 10上使用最新的 Hibernate ORM OGM

    ORM是关系型数据库连接:ogm是No sql数据库连接,Mongo, redis等. 1,下载ogm zip包,解压到wildfly_home\modules\system\layers\base, ...

随机推荐

  1. IOS 触摸事件的处理

    触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointIn ...

  2. Android(java)学习笔记16:多线程 - 定时器概述和使用

    1. 定时器: 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行. 在Java中,可以通过Timer和TimerTask类来实现定义调度的功能 Timer public ...

  3. 高通Vuforia

    这里使用高通的Vuroria来做一个AR歌姬. 工具: Vuforia,MMD4Mecanim 模型: 初音未来pmd模型文件,极乐净土vmd动作文件. 逻辑: 当发现识别卡时:开启音乐,模型速度为1 ...

  4. 关于APIT定位算法的讨论

    关于APIT定位算法的讨论 [摘要]   无线传感器网络节点定位机制的研究中,基于距离无关的定位技术得到快速发展,其中基于重叠区域的APIT定位技术在实际环境中的定位精度高,被广泛研究和应用. [关键 ...

  5. LA 2038 最少点覆盖

    题目链接:https://vjudge.net/problem/UVALive-2038 题意:我看了原题,lrj的书上题意写错了,应该是最少点覆盖,当然可以用最大匹配去做,由于是树形的: 可以树形D ...

  6. FFT抄袭笔记

    你看我都不好意思说是学习笔记了,毕竟\(FFT\)我怎么可能学得会 那就写一篇抄袭笔记吧ctrl+c真舒服 先从多项式说起吧 1.多项式 我们定义一个多项式 \[F(x)=\sum_{i=0}^{n- ...

  7. UVA1184 Air Raid

    嘟嘟嘟 最小路径覆盖板子题. 建二分图,然后跑Dinic(因为我不会匈牙利),然后ans = n - maxflow(). 主要是发一下用链前存图的写法.(好像比vector短一点) #include ...

  8. 在文本框输入数据后,因为有历史记录,鼠标点或者敲回车这个历史记录时,请问会触发什么JS事件

    非ie触发 oninput事件,ie触发>onpropertychange事件 jquery写法 $("#input").bind("input propertyc ...

  9. 【题解】洛谷P2914[USACO08OCT]断电Power Failure

    洛谷P2914:https://www.luogu.org/problemnew/show/P2914 哇 这题目在暑假培训的时候考到 当时用Floyed会T掉 看楼下都是用Dijkstra 难道没有 ...

  10. Redis集群整合到springboot框架

    整合步骤 1 配置application.properties spring.redis.cluster.nodes=192.168.60.131:8000,192.168.60.131:8001,1 ...