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, ...
随机推荐
- appendChild与Transition动画
在createElement之后,直接把这个div append到body中,是不会触发css3 transition动画的 必须要让浏览器计算div的css属性后,然后再设置div的style,才会 ...
- C语言 数组的使用
#include <stdio.h> // 数组的定义和存储 void test1() { ]; // 64bit环境下占用4*5=20个字节 // 计算数组占据的存储空间 // size ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- MySQL:数据库入门篇1
1,什么是数据库?——存储数据的仓库 数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支. 简单的说,数据库就是一个存放数据的仓库 ...
- python:部分内置函数与匿名函数
一.内置函数 1,数据类型:int,bool .......... 2,数据结构:dict,list,tuple,set,str 3,reversed--保留原列表,返回一个反序的迭代器 revers ...
- 2019.03.19 ZJOI2019模拟赛 解题报告
得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...
- Jupyter notebook远程访问linux服务器
[转]https://blog.csdn.net/akon_wang_hkbu/article/details/78973366
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...
- Jquery 1.8全选反选删除选中项实现
JQuery1.6以后,Prop的出现,让1.6以下的全选反选效果全部失效了.以下是修正后的版本: 全选反选效果: $(".checkbox").click(function () ...
- Mybatis自动生成的BO对象继承公共父类(BO中过滤掉公共属性)
使用mybatis的代码生成工具:mybatis-generator,如果自动生成的BO都有公共的属性,则可以指定这些BO继承父类(父类中定义公共属性) 1.定义父类 注意:属性public,不要使用 ...