首页 技术 正文
技术 2022年11月15日
0 收藏 927 点赞 4,105 浏览 1938 个字

对象的状态
瞬时状态:瞬时对象(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河南11 2000 100 -35.6 -120
一对多
多对多

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,087
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,562
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,821
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905