瞬时状态

  瞬时状态又称临时状态.如果java对象与数据库中的数据没有任何的关联,即此java对象在数据库中没有相关联的记录,此时java对象的状态为瞬时状态,session对于

瞬时状态的ava对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被java虚拟机按照垃圾回收处理

持久状态

  当对象与session关联,被session管理时,它就处于持久状态.处于直接状态的对象拥有数据库标识符(数据库中主键的值).那么,对象是什么时候与session发生关联呢?

  1. 通过session查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的session发生关联,
  2. 对瞬时状态的对象调用session的save(),saveOrUpdate()等方法时,在保存对象数据的同事,java对象的内部状态发生了任何变更,hibernate会选择合适的时间(如事务提交时)将变成同步到数据库中

游离状态

  游离状态又称托管状态,处于持久状态的对象,脱离与其关联的session的管理后,对象就处于游离状态.处于游离状态的对象,hibernate无法保证对象所包含的数与数据

库中的记录一致,因为hibernate以及无法感知对该对象的任何操作.session提供了update(),saveOrupdate()等方法,将处于游离状态的对象数以更新的方式同步到数据库中

,并将该对象与当前的session关联.这时,对的状态就从游离状态重新转换为持久状态

三种状态之间的转换

  1. 瞬时转持久

    1. 使用session的save(),saveOrUpdate()等方法保存对象后,该对象的状态由谁是状态转换为持久状态
    2. 使用session的get()或load()方法获取对象,该对象的状态是持久状态
  2. 持久转瞬时

    1. 执行session的delete()方法后,对象由原来的持久状态变为瞬时,因为此时该对象没有与任何数据库关联
  3. 持久转游离

    1. 执行session的evict(),clear()或close()方法,对象由原来的持久状态转为游离
  4. 游离转持久

    1. 执行session的update()或saveOrUpdate()方法,对象由游离转为持久,该对象再次与当前session相关联
  5. 游离转瞬时

     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会在以下时间点刷新缓存

  1. 应用程序显示调用session的flush()方法
    1. session的flush()方法进行刷新缓存的操作,会触发脏检查,从而执行相关的SQL语句
  2. 应用程序调用事务的 commit()方法时
    1. commit()方法会先调用session的刷新缓存的方法flush(),然后向数据库提交事务

java对象中的三种状态和脏检查及刷新缓存机制的更多相关文章

  1. Hibernate延迟加载、三种状态、脏检查 缓存

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  2. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  3. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

  4. Hibernate对象持久化的三种状态

    1.三种状态: public static void testSel() { Session session = HibernateUtils.openSession(); Transaction t ...

  5. WPF中CheckBox三种状态打勾打叉和滑动效果

    本文分为两个demo, 第一个demo实现checkBox的打叉或打勾的效果: 第二个demo部分实现checkBox的滑动效果. Demo1: wpf的CheckBox支持三种状态,但是美中不足的是 ...

  6. 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态

    以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根 ...

  7. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  8. 浅谈Java对象回收的三种方式

    半夜睡不着,加上最近在看Java虚拟机,写点给新手和自己看的东西. 第一类:生命周期中止 void scope(){ Test t = new Test(); } 第二类:对象无引用 (一).对象的应 ...

  9. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

随机推荐

  1. vue学习笔记之基础篇

    本文主要记录学习vue的一些基础内容及常用知识点的记录. 1.搭建脚手架 vue init webpack vue-demo 初始化一个使用webpack打包的vue项目 npm install 安装 ...

  2. H5分享到微信好友朋友圈QQ好友QQ空间微博二维码

    这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...

  3. Android上使用RecyclerView实现顶部悬浮标题效果的Sticky Title View

    目前很多的项目都在使用顶部悬浮标题的效果,很明显,这的确是一个比较人性化,用户体验效果比较好的UI交互效果,对于这个效果,有很多种实现方式,如果说要用RecyclerView来实现一个分类信息展示,并 ...

  4. python获取硬件信息模块

    https://github.com/redhat-cip/hardware https://github.com/rdobson/python-hwinfo https://github.com/r ...

  5. 缓存溢出Buffer Overflow

    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址.在某些情况下,这些过量的字符能够作为“可执行”代码来运 ...

  6. Android(java)学习笔记30:泛型接口的概述和使用

    1. 泛型接口的概述和使用: package cn.itcast_06; /* * 泛型接口:把泛型定义在接口上 */ public interface Inter<T> { public ...

  7. GPU使用

    GPU .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1p ...

  8. UVA - 11488 前缀

    题目链接:https://vjudge.net/contest/166647#problem/A 题意: 从一些字符串集合里面挑一子集,然后公共前缀长度*字符串个数最大: 分析: 将这些字符串放到一个 ...

  9. CF526D Om Nom and Necklace

    嘟嘟嘟 我们可以把AB看成S,则要找的串可以写成SSSSA或者SSSSS.假设S出现了Q次,那么A出现了Q % k次,则B出现了 Q / k - Q % k次. 当ABABA是SSS的形式时,B可以为 ...

  10. 剑指offer23 从上往下打印二叉树

    没有把队列的头部弹出,出现内存错误: