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的一级缓存 ...
随机推荐
- JAVA核心技术I---JAVA基础知识(格式化相关类)
一:格式化相关类 (一)java.text包java.text.Format的子类 –NumberFormat:数字格式化,抽象类 DecimalFormat –MessageFormat:字符串格式 ...
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- Gym 100820C(级别排序 **)
题意是说有一些人参加了不同级别的班,级别有 lower,middle,upper 三种,级别可以组合,出现比如 lower upper,middle upper 这种级别,级别的比较是从右往左,如果在 ...
- IntelliJ IDEA(2017)安装和破解
IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具( ...
- [Android] Android Studio 修改Gradle使用国内源
Gradle 仓库中心的项目,下载速度又比较慢, 网上查询了下, 使用阿里云的Maven镜像仓库 在 project 的 build.gradle中修改如下: allprojects { reposi ...
- int、bool和str
int bit_length 返回以二进制表示的最短长度 print(int.bit_length(10)) 结果 4 Process finished with exit code 0 int() ...
- 'DataVisualization' does not exist in the namespace 'System.Web.UI'一例解决办法
之前项目是vs2010 aspx项目,用vs2017打开后,非运行状态下有一行错误:CS0234 C# The type or namespace name 'DataVisualization' d ...
- jqweui Picker使用一个小问题
地址:http://jqweui.com/extends#picker加了Display Value后,会产生改变值后,Picker显示Value而不显示Text情况.需要在OnClose里做如下处理 ...
- Windows 常用的 CMD 命令
Ø 简介 本文主要记录 Windows 下一些常用的 CMD 命令,俗话说好记性不如烂笔头. 1. help 查看 cmd 命令帮助信息(包括所有的 cmd 命令) 2. 设置 cmd 进入 ...
- Javascript async异步操作库简介
异步操作知识 在js世界中, 异步操作非常流行, nodejs就是特点基于异步非阻塞. js语言支持的异步语法包括, Promise async await generator yield. 这些语 ...