Hibernate中对象的三个状态解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate中对象的三个状态解析相关的知识,希望对你有一定的参考价值。

Hibernate 将操作的对象分为三种状态:

1.

瞬时 (Transient )/临时状态/自由状态 

持久 (Persistent)

脱管 (Detached)

 

瞬时对象特征:

  第一、不处于 Session 的缓存中,也可以说,不被任何一个 Session 实例关联。

  第二、在数据库中没有对应的记录。

持久化对象特征:

  第一、持久化对象总是被一个 session 关联。

  第二、持久化对象与数据库中的记录对应。

  第三、Session清理缓存的时候,会根据持久化对象的改变,更新数据库。

托管对象特征:

  第一、Session断开关联

  第二、持有OID

 

2.三种状态的区别分析:

  只要与session关联的就是持久态。

  Session没关联,没有OID就是瞬时状态。

  Session没关联,有OID的就是游离状态。

 

3.持久化对象状态的相互转换:

转换图:

 

技术分享

瞬时对象:

         如何直接获得  --- new 出来

         转换到持久态 ---- save、saveOrUpdate 保存操作

         转换到脱管态 ---- setId 设置OID持久化标识(这个id是数据库中存在的)

持久对象:

   如何直接获得 ---- 通过session查询方法获得 get、load、createQuery、createCriteria

         转换到瞬时态 ---- delete 删除操作 (数据表不存在对应记录 )(其实还有id,只是不叫OID)

         转换到脱管态 ---- close 关闭Session, evict、clear 从Session清除对象

脱管对象:

   如何直接获得 ----- 无法直接获得 ,必须通过瞬时对象、持久对象转换获得

         转换到瞬时态 ---- 将id设置为 null,或者手动将数据库的对应的数据删掉

         转换到持久态 ---- update、saveOrUpdate、lock (对象重新放入Session ,重新与session关联)

在Hibernate所有的操作只认OID,如果两个对象的OID一直,它就直接认为是同一个对象。

 

以上是关于Hibernate中对象的三个状态解析的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate

ORM进阶之Hibernate中对象的三大状态解析

请问hibernate中merge()、attachDirty()、attachClean()这三个方法是做啥的?怎么用?

Hibernate save() 和事务回滚

Hibernate Criteria 不向表中添加模式

Hibernate 学习路程之一(Hibernate 环境的搭建)