hibernate框架学习第三天:对象状态、一级缓存、快照等
对象的状态
瞬时状态: 瞬时对象(TO)
应用程序创建出来的对象,不受H3控制
注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO
持久化状态:持久化对象(PO)
受H3控制的对象,PO一定具有OID
托管状态: 托管对象(DO)
曾经受到H3控制,当前不受H3控制(Session关闭),一定具有OID
给TO赋值OID
TO,PO,DO的区别
1.受控(Session)
2.OID
对象状态对应的时机
TO
new创建的对象并且不携带OID
PO
save后的对象 update后的对象
saveOrUpdate后的对象 merge后的对象
delete后的对象
load/get等通过查询方法获取到的对象
Query Criteria读取的数据对应的对象
DO
Session关闭后,在此Session操作过程中所有的PO对象
手工清除session中的某个PO(特殊)
为TO对象指定OID
一级缓存
什么是缓存?数据的临时存储空间,缓存中保存的数据是真实数据的一份拷贝
H3具有两级缓存
一级缓存(H3自带)
二级缓存(外部技术实现)
一级缓存
H3内部Session操作的数据就是保存在一级缓存中,无论Session操作多少个对象,都存放在这个空间内
不同的Session对应存储的区域是不同的区域
一级缓存的操作
1.证明一级缓存存在性
无论进行什么样的操作,只要Session控制过某个对象,该对象就加入一级缓存
下一次使用直接从一级缓存中获取
2.get/load区别
load/get在查询时,首先判断一级缓存中是否存在该数据
如果存在,直接获取
如果不存在,执行下面的操作
get方法获取数据将直接执行SQL语句,从数据库获取,将数据加载到一级缓存
load方法获取数据,先不执行SQL,创建一个代理对象,只具有OID,并且放入一级缓存
当开发者只使用OID属性时,不用执行查询
当开发者使用OID属性之外的属性时,才执行查询
load方法的延迟加载
关闭lazy延迟加载功能:
1.
2.
3.
lazy=false,load方法与get方法基本相同
3.读取一级缓存,SQL执行后获取数据并加载到一级缓存
4.修改数据,将要修改的数据放入一级缓存,此时不执行SQL,刷新一级缓存时执行
5.刷新一级缓存的方式
执行事务提交
t.commit();
刷新Session范围的缓存数据
s.flush();
关闭Session
s.close();
刷新缓存对应的操作一定要基于事务,如果没有事务保障,缓存数据将不与数据库同步
flush操作是强制将一级缓存数据与数据库同步,因此此时无需事务保障就可以进行
6.快照
快照保存了一级缓存中的一份数据的克隆,当一级缓存中的数据发生改变时,如果刷新缓存
首先与快照进行比对
如果不同,更新数据库,执行UPDATE,同时更新快照
如果相同,不做任何动作
7.操作一级缓存
刷新一级缓存
s.flush();
清除一级缓存
s.clear();
清除一级缓存中指定对象
s.evict(obj);
更新一级缓存中指定对象(使用数据库中数据覆盖一级缓存数据及快照数据)
s.refresh(obj);
8.一级缓存刷新时机
一级缓存操作注意事项
1.save TO->PO
2.update
2.1 DO->PO
2.2 在update将DO->PO之前,可以将数据库中的信息加载到快照区
如果缓存数据与加载的快照数据相同,避免执行无效的UPDATE
在class元素中配置select-before-update,该配置值默认false
2.3 DO->PO 必须保障OID是数据库端存在的,如果不存在将抛出异常
2.4 DO->PO 如果存在相同OID的PO,此时抛出异常
3.saveOrUpdate
对TO操作,insert
对DO操作,update
4.megre
如果当前缓存中存在有相同的OID数据,那么将现有合并的对象数据与原始的PO进行数据合并
如果当前缓存中没有相同的OID数据,那么首先判断当前的DO是否在数据库中存在,执行查询
如果查询到了存在有DO对应的OID,修改
如果查询没有存在的OID,插入
5.get/load
get如果获取的OID不存在,返回null
load如果获取的OID不存在,抛异常
6.delete
删除一个PO对象
如果是DO,首先DO->PO,然后删除PO
操作注意事项:
增删改数据时,先将对象->PO,然后再刷新缓存时才执行对应的操作
PO (insert)*
flush刷新时,如果是insert
1.检测OID存在性
不存在,并且没有生成策略,报错
不存在,有生成策略,先获取OID,此时TO->PO->INSERT
PO (update)
PO (delete)
PO ()
PO (update)
关联关系
一对一
用户数据
1 张三 男 23 河南 1 1 2000 100 -35.6 -120
一对多
多对多
hibernate框架学习第三天:对象状态、一级缓存、快照等的更多相关文章
- Hibernate-实体-对象状态-一级缓存-事务-查询
一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造 --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...
- hibernate框架学习之对象状态
lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- hibernate学习(5)——对象状态与一级缓存
1.对象状态 1.1 状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...
- [ SSH框架 ] Hibernate框架学习之二
一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...
- Hibernate框架学习笔记
Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...
- [转]session缓存机制和三种对象状态
摘自 http://blog.csdn.net/csh624366188/article/details/7612142 Hibernate 的Session就是其中的一个,它提供了基本的增,删,改, ...
- spring框架学习(三)junit单元测试
spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...
- hibernate框架学习之一级缓存
l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...
随机推荐
- CentOS7用Mono和MonoDevelop写C#程序
MonoDevelop 是个Linux平台上的开放源代码集成开发环境,主要用来开发Mono与.NET Framework软件. MonoDevelop 整合了很多Eclipse与Microsoft V ...
- 2019.03.03 - Linux搭建go语言交叉环境
编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...
- CSS-With-BEM
Naming rules block_name__element_name--modifier_name-modifier_value Names are written in lowercase L ...
- jQuery使用(四):DOM操作之查找兄弟元素和父级元素
查找兄弟元素 向下查找兄弟元素 next() nextAll() nextUntil() 向上查找兄弟元素 prev() prevAll() prevUntil() 查找所有兄弟元素 siblings ...
- bzoj千题计划314:bzoj3238: [Ahoi2013]差异(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include ...
- IntelliJ IDEA(2017)安装和破解
IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具( ...
- HanLP二元核心词典解析
HanLP二元核心词典解析 本文分析:HanLP版本1.5.3中二元核心词典的存储与查找.当词典文件没有被缓存时,会从文本文件CoreNatureDictionary.ngram.txt中解析出来存储 ...
- Mac 键盘符号 及VSCode快捷键 说明
Mac 键盘符号说明 ⌘ == Command ⇧ == Shift ⇪ == Caps Lock ⌥ == Option ⌃ == Control ↩ == Return/Enter ⌫ == De ...
- 二十二、Linux 进程与信号---进程创建
22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...
- office 2016 破解教程
骤: 下载安装包——>安装(断网状态)——>下载破解工具——>破解完成 1. 下载 office2016,大家进入下面的链接进行 http://pan.baidu.com/s/1mi ...