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 程序端 需手 ...
随机推荐
- jQuery之检测分析纠错------地狱的镰刀
1. 答: 或者: $(selector).eq(0).hide(); 解答:get() 方法获得由选择器指定的 DOM 元素. 2. 答: 3, 答1: 答2: 4. slideDown()方法格式 ...
- SharePoint 2013 - User Custom Action
1. User Custom Action包含Ribbon和ECB,以及Site Action菜单等,参考此处: 2. 系统默认ECB的Class为: ms-core-menu-box --> ...
- ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 5、安装Datastore
安装Datastore 解压datastore安装包,tar -xzvf ArcGIS_DataStore_Linux_1051_156441.tar.gz 切换到arcgis账户静默安装server ...
- Asio基本接口
Asio是C++的网络库,有boost和非boost这两种版本,这里涉及的都是非boost的版本.Asio官方文档 在使用Asio时可以只包含头文件asio.hpp,如果知道所用接口具体在哪个头文件中 ...
- 使用错误的操作系统用户exp数据导致ORA-15186错误
生产环境alert日志中出现如下错误:Fri Dec 30 14:28:28 2016Errors in file XXXXXX.trc:ORA-15186: ASMLIB error functio ...
- 搭建packagist私服和composer
1.下载源码 https://github.com/composer/packagist 2.修改配置文件 cp app/config/parameters.yml.dist app/config/ ...
- c++11之100行实现简单线程池
代码从github上拷的,写了一些理解,如有错误请指正 Threadpool.h #ifndef THREAD_POOL_H #define THREAD_POOL_H #include <ve ...
- axis调用cxf的webservice注意事项
需要注意的是: 1.wsdl显示部分内容 <?xml version="1.0" ?> - <wsdl:definitions name="Archiv ...
- 【luogu P2251 质量检测】 题解
也是一道ST表的板子题,很裸的RMQ问题,只需要在查询区间时处理一下下就好啦~ #include <cstdio> #include <algorithm> using nam ...
- Java运行时异常与一般异常以及错误的异同
Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAV ...