Java之旅hibernate(5)——hibernate的三种状态

  记得在讲述hibernate的第一个例子那篇文章中,详见:

  http://blog.csdn.net/u010955843/article/details/47903881

  我们提到了PO这个词,PO就是持久化对象,(PersistentObjects,PO)可以是普通的JavaBean,惟一特殊的是它们与(仅一个)Session相关联。JavaBean在Hibernate中存在三种状态:临时状态(transient)、持久化状态(persistent)和脱管状态(detached)。当一个JavaBean对象在内存中孤立存在不与数据库中的数据有任何关联关系时,那么这个JavaBean对象就称为临时对象(TransientObject);当它与一个Session相关联时,就变成持久化对象(Persistent Object);在这个Session被关闭的同时,这个对象也会脱离持久化状态,变成脱管对象(Detached Object),可以被应用程序的任何层自由使用,例如,可用做与表示层打交道的数据传输对象(Data transfer Object)。

那么现在我们来讲解一下hibernate的三种状态:临时状态(transient)、持久化状态(persistent)和脱管状态(detached)。

 1.      三种状态详解

  Ø  临时状态(transient)

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

  Ø  持久化状态(persistent)

  处于持久化状态的对象就是持久化对象(PersistObjects):持久实例是任何具有数据库标识的实例。它有持久化管理器session统一管理,持久实例是在事务中进行操作的——它们的状态是在事务结束时同数据库进行同步的。当事务提交时,通过执行sql的insert、update和delete把内存中的状态同步到数据库。

  Ø  脱管状态(detached)

  Session关闭后,持久化对象将会变成离线对象,离线表示这个对象不再与数据库保持同步,它们不再受hibernate管理。

 2.      生命周期图

 3.      代码详解

 在建立应用程序之前,创建一个工具类来用于封装session的创建,销毁等一系列的操作。

 代码如下所示:

  Ø  临时状态(Transient)

  由上图可以看出,我们知道了临时状态就是new的一个过程,也就说new出来一个对象的时候,还没有保存到数据库的时候,此时的状态就是transient。


  Ø  持久化状态(persistent)

  持久化状态就是将数据纳入了session的管理范围内,纳入的标识是执行save方法后就会被session管理,保存的形式是以键值对的形式进行保存的,key就是id,而value就是整个的user对象,也就是持久化的状态。此时数据库便会受理此对象。

  Ø  游离状态(detached)

  游离状态就是当session关闭后,对象所处的状态,


  此时对象已经存在了数据库,但是session关闭后,此时将不再受session托管。

  Ø  那么Transient与detached有什么区别?

  游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。

  因为游离对象是被持久化的对象,故而是存在oid,但是由于临时对象没有被session管理,也没有写进数据库,故而没有oid,因此这是其中的一个区别,游离对象去除持久化标识(持久化标识可以认为映射表的主键)后变为临时对象。临时对象对象添加持久化标识后变为游离对象。

  无论是游离状态还是临时状态在被session再次托管后,都会变成持久化状态。


  Detached的状态通过session的纳入再次变成了持久化的状态,也就是三种状态在一定的条件下是可以相互转换的。

 4.      小结

  和java的线程很相似,java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。

  用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。

   新生--->就绪:通过调用start()方法

   就绪--->运行:处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法

   运行--->阻塞:处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态

   阻塞--->就绪:睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。

   运行--->死亡:(1)(正常情况下)线程任务完成

         (2)(非正常状况)线程被强制性的中止,如通过执行stop()或destroy()方法来终止一个线程。

  五个状态在一定条件下是可以相互转换的,hibernate的三个状态也是,是一个数据存储过程的三个状态,三个状态在一定的条件下也是可以转换的。很多东西还需要慢慢的体会~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值