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会为对象的值类型的属性复制一份快照

刷新缓存机制

扫描二维码关注公众号,回复: 4142888 查看本文章

猜你喜欢

转载自www.cnblogs.com/hfx123/p/9982390.html
今日推荐