Hibernate学习_006_Hibernate对象的三种状态

来源:互联网 发布:html js display none 编辑:程序博客网 时间:2024/05/16 17:03

        学习Hibernate的时候,通过Session的各种方法操作数据库时,一定会涉及到对象的三种状态。到底Hibernate中对象的三种状态是个什么样的关系,以及对象三种状态之间如何相互的转换,弄清楚这个,对于理解Hibernate的各种持久化操作的细节至关重要。

        Hibernate对像的三种状态的关系图如下所示:

 

       那么如何区别对象的三种状态呢?其实最最关键的区别点就在于对象的ID在如下三个地方是否存在:

  1. 对象的ID在内存中是否存在:持久化状态对象不一定有,脱管状态对象有,瞬态对象一定没有。
  2. 对象的ID在缓存中是否存在:持久化状态对象不一定有,脱管状态对象没有,瞬态对象一定没有。
  3. 对象的ID在数据中是否存在:持久化状态对象一定有,脱管状态有,瞬态对象一定没有。
        要理解上面的三句话,首先的理解对象,内存,缓存之间的关系,这个其实不复杂,缓存是内存中的一个区块,这个缓存可以理解为Session的一级缓存,而Session中存在一个HashMap,这个Map对象中就存放了各个持久化对象的相关信息,首先,这个Map中的key就存放的是对象的ID属性,Map的value就存放的是指向这个对象的引用。
有了上面的知识,下面我们一步步来分析一个对象 从开始New出来到最后把它Delete的全过程中是怎么和这三种状态关联:

        首先,new出来一个对象之后,还没有通过Session保存到数据库的时候,这个时候,内存中是存在这个对象的,但是没有ID属性,缓存和数据库中都没有这个对象的相关信息,这个时候对象的状态就属于脱管状态,当我们把这个对象保存到数据库中的时候,这个时候,内存中的对象就有了ID值,同时数据库中会存放这个对象的完整信息,而且,此时在Session中的Map也会有一个Entity,其key就是这个对象的ID,其value值就是指向内存中的对象的一个引用。这个时候,因为数据库中存在完整信息,而且内存和缓存中均有对象的ID属性存在,对象就是属于持久化状态。这个时候,假设我们关闭Session,这个时候,Session一级缓存中的信息(Map中的信息)就会清空,所以,此时缓存中没有了对象的信息,但是内存和数据库中的信息还是存在的,所以这个时候,对象的状态就属于脱管状态,而如果此时我们是把一个经过持久化过的对象Delete的话(注意一定要有ID,刚刚new出来的瞬态对象,由于没有ID,是无法删除掉的。而且可以通构造一个对象,给其赋予数据库中已经存在的一条记录的ID值,来达到删除数据库中的一条记录的目的。),此时数据库中,缓存中,都不会有对象的信息,但是这个时候内存中还是有这个对象的,这个时候如果再次保存这个对象,会重新会为这个对象分配ID值,这个时候对象的状态就是属于瞬态了。



0 0
原创粉丝点击