对象的状态
瞬时状态: 瞬时对象(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. SonarQube(代码质量管理)配置与使用

    继 Sonarqube(代码质量管理)环境搭建,交大家如何配置与使用Sonarqube 1: 汉化Sonarqube: 找到 Setting --> Update Center --> A ...

  2. Hadoop记录-hive merge小文件

    1. Map输入合并小文件对应参数:set mapred.max.split.size=256000000;  #每个Map最大输入大小set mapred.min.split.size.per.no ...

  3. STM32学习笔记:【004】USART串口通信

    版本:STM32F429 Hal库v1.10 串口通信能够实现两块电路之间不同的通信,在开发中作为打印调试也是一门利器(printf重定向). 补充一点小知识: 1. weak修饰符修饰的函数,说明这 ...

  4. HTML5-语义化标签

    article -- 解释 article标签装载显示一个独立的文章内容.例如一篇完整的论坛帖子,一则网站新闻,一篇博客文章等等,一个用户评论等等 artilce可以嵌套,则内层的artilce对外层 ...

  5. Java高并发秒杀API之Service层

    Java高并发秒杀API之Service层 第1章 秒杀业务接口设计与实现 1.1service层开发之前的说明 开始Service层的编码之前,我们首先需要进行Dao层编码之后的思考:在Dao层我们 ...

  6. redis基本操作

    ''' pip install redis redis 可以看成内存中的大字典 redis五大数据类型 --> 指的是第一层的value值的类型 - 字符串 "k1" - 列 ...

  7. Lua的协程基础

    参考:Lua中的协同程序 coroutine   http.lua 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行). ...

  8. eventproxy 介绍这款好用的工具,前端事件式编程的思维

    前端事件式编程 <script src="eventproxy.js"></script> <script> // EventProxy此时是一 ...

  9. ext Ext.grid.去除右边空白

    1.当Scroll没有显示时,Ext.grid右边会显示一个空白间隔. 2.解决办法<View> <ext:GridView ForceFit="true" Sc ...

  10. Jquery触发Change事件

    Jquery直接使用val的话不会触发Change事件需要做如下处理$("#"+p_id).val(p_time); $("#"+p_id).change();