java对象中的三种状态和脏检查及刷新缓存机制

瞬时状态

  瞬时状态又称临时状态.如果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(),然后向数据库提交事务
原文地址:https://www.cnblogs.com/hfx123/p/9982390.html