对象的状态
瞬时状态: 瞬时对象(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框架学习第三天:对象状态、一级缓存、快照等的更多相关文章

  1. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

  2. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  3. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  4. hibernate学习(5)——对象状态与一级缓存

    1.对象状态 1.1   状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...

  5. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

  6. Hibernate框架学习笔记

      Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...

  7. [转]session缓存机制和三种对象状态

    摘自 http://blog.csdn.net/csh624366188/article/details/7612142 Hibernate 的Session就是其中的一个,它提供了基本的增,删,改, ...

  8. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  9. hibernate框架学习之一级缓存

    l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...

随机推荐

  1. Hadoop记录-Federation联邦机制

    在Hadoop2.0之前,HDFS的单NameNode设计带来诸多问题:  单点故障.内存受限,制约集群扩展性和缺乏隔离机制(不同业务使用同一个NameNode导致业务相互影响)等 为了解决这些问题, ...

  2. layui(四)——table组件常见用法总结

    table是 layui 最核心的组成之一.它用于对表格进行一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求.支持固定表头.固定行.固定列左/列右,支持拖拽改变列宽度,支持排序,支持多级 ...

  3. Sqlserver中的视图

    一.视图的基本知识 什么是视图:视图是从一个或多个表导出的虚拟的表,具有普通表的结构,物理上是不存在的.视图是动态的数据的集合,数据是随着基表的更新而更新. 视图的优点: ①在多表查询时,查询方便. ...

  4. plus初始化原理及plus is not defined,mui is not defined 错误汇总

    原文 关于plus是哪里来的问题 plus是5+Runtime的内部对象.就像chrome浏览器里有chrome.开头的一些对象方法,5+runtime内部内置了plus对象.因为plus和mui不一 ...

  5. 启用SQL Server 2014 中的OLE 自动化功能

    企业中很多架构都在快走向Service概念,尽量采用平台服务方式提供给各个Application使用.因此,个系统都会去呼叫像是Web Service,WCF或ODATA…等等各种类型的服务.一般来说 ...

  6. windows10下TensorFlow安装记录

    1.安装anaconda 安装最新版:https://repo.anaconda.com/archive/Anaconda3-5.3.0-Windows-x86_64.exe 加入环境变量: path ...

  7. 错误 3 未找到类型“sdk:Label”。请确保不缺少程序集引用并且已生成所有引用的程序集。

    错误: 错误 3 未找到类型“sdk:Label”.请确保不缺少程序集引用并且已生成所有引用的程序集. 错误 1 命名空间“http://schemas.microsoft.com/winfx/200 ...

  8. Struts2的初级应用

    做一个登录注册 1.把Struts2框架的必须包导入到项目中(http://struts.apache.org/) 2.web.xml <?xml version="1.0" ...

  9. ASP.NET MVC 3 Razor 语法

    1.   三元运算符 1)   输出文本 1.   View var var1 = '@(1 < 2 ? "YES" : "NO")'; var var2 ...

  10. JS定义函数

    一.定义函数的方法 (1)函数声明 (2)函数表达式 二.函数声明方法定义函数 function functionName(arg0, arg1, arg2) { // 函数体 } (1)FireFo ...