Hibernate持久化三种对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaibian0823/article/details/51793704

    在Hibernate中,持久化对象在被操作过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。
    持久化对象的生命周期有三种,分别是瞬时态(Transient),持久态(Persistent)和脱管态(Detached)。

   

    对它的深入理解,才能更好的理解hibernate的运行机理, 对于理解hibernate,JVM和sql的关系有更好的理解。对于需要持久化的JAVA对象,在它的生命周期中有三种状态,而且互相转化。

瞬时对象(Transient Objects):使用new操作符初始化的对象不是立刻就持久化的。他们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态将会丢失,并由垃圾回收机制回收。

    临时对象的特征。临时对象具有以下特征:
    (1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
    (2) 在数据库中没有对应的记录。

    在以下情况下,Java对象进入临时状态:
   (1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
   (2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。

持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的———他们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT,UPDATE和DELETE语句把内存中的状态同步到数据库中。

   持久化对象的特征。持久化对象具有以下特征:
   (1) 位于一个Session实例的缓存中,也可以说,持久化对象总是被一个Session实例关联。
   (2) 持久化对象和数据库中的相关记录对应。
   (3) Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。

   Session的许多方法都能够触发Java对象进入持久化状态:
   (1) Session的save()方法把临时对象转变为持久化对象。
   (2) Session的load()或get()方法返回的对象总是处于持久化状态。
   (3) Session的find()方法返回的List集合中存放的都是持久化对象。
   (4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。

离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。


   游离对象的特征。游离对象具有以下特征:
   (1) 不再位于Session的缓存中,也可以说,游离对象不被Session关联。
   (2) 游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。

    游离对象与临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。

    Hibernate三种状态之三:游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;

Hibernate三种状态中游离对象和临时对象异同:

    两者都不会被Session关联,对象属性和数据库可能不一致;

游离对象由持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;

Hibernate和SQL的关系:

   在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库。

猜你喜欢

转载自blog.csdn.net/gaibian0823/article/details/51793704