首页 > 代码库 > Hibernate 中三种状态及脏检查

Hibernate 中三种状态及脏检查

java对象的三种状态

 持久态:

    Student stu=new Student()

    Session.save(stu);

Session以及数据库都有

  游离态:

     stu.setId(1);

     Session.close();

Session没有 数据库中有

  瞬时态:

  Student stu=new Student()

体现:在Session中以及DB都没有

三种状态图:

技术分享

使用new关键字构建对象,该对象的状态是瞬时状态。

1 瞬时状态转为持久状态

  使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。

  使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。

2 持久状态转为瞬时状态

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

3 持久状态转为游离状态

  吃行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态。

4 游离状态转为持久状态

  重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象相关联。

5 游离状态转为瞬时状态

  执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

  处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。

下面是关于脏检查

什么是脏数据?脏数据并不是废弃和无用的数据,而是状态前后发生变化的数据。

脏检查:当事务提交时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变

 

技术分享

缓存清理机制

当Session缓存中对象的属性每次发生了变化,Session并不会立即清理缓存和执行相关的SQL update语句,而是在特定的时间点才清理缓存,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,一遍减少访问数据库的次数,从而提高应用程序的数据访问性能。

在默认情况下,Session会在以下时间点清理缓存。

  1. 当应用程序调用org.hibernate.Transaction的commit()方法的时候.commit方法先清理缓存,然后再向数据库提交事务。Hibernate之所以把清理缓存的时间点安排在事务快结束时,一方面是因为可以减少访问数据库的频率,还有一方面是因为可以尽可能缩短当前事务对数据库中相关资源的锁定时间。
  2. 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会清理缓存,使得Session缓存与数据库已经进行了同步,从而保证查询结果返回的是正确的数据。
  3. 当应用程序显示调用Session的flush()方法的时候。

更新数据的方法:

 update()方法
 saveOrUpdate()方法
 merge(u)方法:
     User u=new User();
     User ul=(User)session.merge(u);
    1.返回一个object类型,返回的对象类型ul会被session关联变成持久对象
     2.调用此方法后u这个对象之后修改的数据不会写入到数据库中
    3.而操作返回的持久化对象ul他的数据会写入到数据库中)

 

Hibernate 中三种状态及脏检查