java对象中的三种状态和脏检查及刷新缓存机制
瞬时状态
瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于
瞬时状态的ava对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被java虚拟机按照垃圾回收处理
持久状态
当对象与session关联,被session管理时,它就处于持久状态.处于直接状态的对象拥有数据库标识符(数据库中主键的值).那么,对象是什么时候与session发生关联呢?
- 通过session查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的session发生关联,
- 对瞬时状态的对象调用session的save(),saveOrUpdate()等方法时,在保存对象数据的同事,java对象的内部状态发生了任何变更,hibernate会选择合适的时间(如事务提交时)将变成同步到数据库中
游离状态
游离状态又称托管状态,处于持久状态的对象,脱离与其关联的session的管理后,对象就处于游离状态.处于游离状态的对象,hibernate无法保证对象所包含的数与数据
库中的记录一致,因为hibernate以及无法感知对该对象的任何操作.session提供了update(),saveOrupdate()等方法,将处于游离状态的对象数以更新的方式同步到数据库中
,并将该对象与当前的session关联.这时,对的状态就从游离状态重新转换为持久状态
三种状态之间的转换
瞬时转持久
- 使用session的save(),saveOrUpdate()等方法保存对象后,该对象的状态由谁是状态转换为持久状态
- 使用session的get()或load()方法获取对象,该对象的状态是持久状态
持久转瞬时
- 执行session的delete()方法后,对象由原来的持久状态变为瞬时,因为此时该对象没有与任何数据库关联
持久转游离
- 执行session的evict(),clear()或close()方法,对象由原来的持久状态转为游离
游离转持久
- 执行session的update()或saveOrUpdate()方法,对象由游离转为持久,该对象再次与当前session相关联
游离转瞬时
1.执行session的delete方法,对象由游离转为瞬时
注意:处于瞬时或游离的对象不再被其他对象引用时,会被JVM按照垃圾回收机制处理
脏检查
在hibernate中,数据前后发生变化的对象,称为脏对象.
tx= HibernateUtil.currentSession().beginTransaction();
//获取员工对象,此时对象处于持久状态
Emp empUpdate = empDao.update(7900);
//修改后,信息和之前不同,此时 empUpdate对象成为"脏对象"
empUpdate.setSal(6666);
//提交事务
tx.commit();
以上代码中empUpdate对象处于持久状态,当对象被加入session缓存中时,session会为对象复制一份快照,如果快照的属性发生改变即成为脏对象.
在事务提交时,hibernate会对session中持久化的对象进行检查,即比较对象当前属性与它的快照,以判断属性是否发生变化,这种判断成为脏检查.如
发生改变session会使用最新的属性值来执行相关的SQL语句,将变化保存确保数据库和对象数据的数据一致
刷新缓存机制
当session缓存中对象的属性发生变化时,session并不会立即执行脏检查和相关的SQL语句,而是在特定的时间,即刷新缓存时才执行.使得session
能够把多次变化合并为一条或者一批SQL语句,减少访问次数提高程序的数据访问性能.
在默认情况下,session会在以下时间点刷新缓存
- 应用程序显示调用session的flush()方法
- session的flush()方法进行刷新缓存的操作,会触发脏检查,从而执行相关的SQL语句
- 应用程序调用事务的 commit()方法时
- commit()方法会先调用session的刷新缓存的方法flush(),然后向数据库提交事务
java对象中的三种状态和脏检查及刷新缓存机制的更多相关文章
- Hibernate延迟加载、三种状态、脏检查 缓存
一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
- Hibernate对象持久化的三种状态
1.三种状态: public static void testSel() { Session session = HibernateUtils.openSession(); Transaction t ...
- WPF中CheckBox三种状态打勾打叉和滑动效果
本文分为两个demo, 第一个demo实现checkBox的打叉或打勾的效果: 第二个demo部分实现checkBox的滑动效果. Demo1: wpf的CheckBox支持三种状态,但是美中不足的是 ...
- 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态
以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根 ...
- java数组中的三种排序方法中的冒泡排序方法
我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...
- 浅谈Java对象回收的三种方式
半夜睡不着,加上最近在看Java虚拟机,写点给新手和自己看的东西. 第一类:生命周期中止 void scope(){ Test t = new Test(); } 第二类:对象无引用 (一).对象的应 ...
- OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态
主键生成策略 sequence 数据库端 native 数据库端 uuid 程序端 自动赋值 生成的是一个32位的16进制数 实体类需把ID改成String 类型 assigned 程序端 需手 ...
随机推荐
- 设置cssrem,设置emmet
1.文件->首选项->设置 2.搜索cssrem-> 点击设置:"cssrem.rootFontSize": 16, 4.emmet
- Linux 一直提示 login incorrect
- Python学习系列----第六章 数据结构
本章主要讲的是python中重要的四种数据结构,分别是列表.元组.字典和集合. 6.1 列表 list 是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目应该包括在方括 ...
- 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯
最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...
- java面试题之----数据库事务的四大特性及隔离级别
本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...
- pcharm激活
服务器搭建命令:(一直默认即可) wget http://home.ustc.edu.cn/~mmmwhy/jetbrain.sh && sh ./jetbrain.sh 我搭建的服务 ...
- sqlplus中设置在屏幕中上不打印出输出
在某些特定的情况下我们想在做某种实验,需要执行一段sql语句,但是不想在屏幕上打印出sql语句的结果(太长了)可以采用如下方式.1 把想要执行的语句写到一个sql脚本中,例如:[oracle@i ...
- 【图文详解】Zookeeper集群搭建(CentOs6.3)
Zookeeper简介: Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务的. A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程 ...
- Java传引用问题
Java传引用问题 使用Java调用方法时,可以传值,也可以传引用.下面说说两者的区别: 1.传值 传值中的"值"类型是指java的8大基本类型(基础知识,不知道 ...
- python接口测试-项目实践(七)脚本优化
七 脚本优化:重复代码的提取成函数:与项目接口相关的都封装到一个类中:添加手工验证脚本,增加输入值的判断逻辑 将所有与该项目接口相关的封装成类 class ProjectApi: #3个数据源接口 d ...