hibernate对象的三种状态及转换

hibernate对象的三种状态转换关系图

        

三种状态

瞬时状态transient

  通过new创建对象后,对象并没有立刻持久化,  它并未参与数据库中的数据有任何的关联,此时java对象的状态为瞬时状态。session对瞬时状态的对象一无所知,当对象不再被引用时,她的数据也就丢失了, 对象将会被java虚拟机按照垃圾回收机制处理。

持久状态persistent

  当对象与session关联,被session管理时,它就处于持久化状态。处于持久状态的对象拥有数据库的标志。对象什么时候与session建立联系的?

         1)通过session查询的接口,或者get,或者load方法从数据库中加载对象的时候

         2)瞬时状态的对象,通过调用save或者saveorupdate方法时处于持久状态的对象,session会持续跟踪和管理他们,如果对象的内部状态发生了任何更改,hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。              

 游离状态Detached

     处于持久状态的对象,脱离与其session 的管理后,对象就处于游离状态。  执行sessionevict,clear,close()方法后,可以将持久状态变为游离状态

  session提供了两个方法(updatemerge)将处于游离状态的对象,与一个新的session关联,此时对象的状态就重新变回持久状态。

状态转换:

1.瞬时状态转换为持久状态

   使用sessionsave()或者saveorupdate()方法保存对象后,变为持久状态

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

 2.持久状态转为瞬时状态

      执行sessiondelete()后,变为瞬时状态 

 3.持久状态转换为游离状态

   执行了sessionevict(),clear()或者close()方法后

   

4.游离状态转为持久状态

    重新获取session对象,执行session对象的update或者saveorupdate()后,变为持久状态

  

5.游离状态转为瞬时状态

   执行sessiondelete()后,对象有游离状态转为瞬时状态。

 

状态前后发生变化的对象称为脏对象

脏检查: 提交事务的时候,hibernate会对session中持久状态的对象检查,看数据是否发生了变化

目的: 保证内存中的数据对象和数据库表的数据一致

刷新缓存机制:

  1.执行事务的commit方法的时候,可以刷新缓存

  2. 执行session.flush()方法

 

 

原文地址:https://www.cnblogs.com/wuxinyiwu/p/7488868.html