0%

Hibernate系统化学习之对象状态

概述

   状态       说明   
   临时状态(Transient)       刚创建的对象(new)还没有被Session持久化、缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID。   
   持久状态(Persistent)       对象经过Session持久化操作,缓存中存在这个对象的数据为持久状态并且数据库中存在这个对象对应的数据为持久状态这个时候有OID。   
   游离状态(Detached)       已经被持久化,但不处于session的缓存中。   当Session关闭,缓存中不存在这个对象数据而数据库中有这个对象的数据并且有OID为游离状态。   

状态转换

当对象在持久化状态时,它一直位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 save() 或 update() 方法是没有意义的。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE, 而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到, 它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE

相关方法说明

  1. get、load、find: 方法的使用上较为类似,他们都是将数据库中对应Id的数据映射为Java对象,此时对象变为持久化状态。
  2. save: 保存,此时Java对象已经与数据库记录建立的关系。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。
  3. saveOrUpdate: 保存或者更新,如果没有与数据库记录所对应的oid,则执行保存,如果有,则执行更新。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。
  4. delete: 删除对象,将对象从持久化状态或者游离状态变为临时状态。
  5. close: 关闭session, 先将session清空,然后再关闭。将对象从持久状态变为临时状态。
  6. clear: 清空session缓存。将对象从持久状态变为临时状态。
  7. evict: 清除指定的对象。将对象从持久状态变为临时状态.

实例说明

参考

  1. hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)
  2. Hibernate一级缓存
  3. hibernate session的flushMode的区别
  4. Hibernate的Session_flush与隔离级别
  5. Hibernate 中的session 的flush、reflush 和clear 方法 ,及数据库的隔离级别
  6. Hibernate深入理解—-03操作Session缓存方法(flush、refresh、clear,事务隔离级别)
  7. Hibernate中对象的三种状态及相互转化
  8. 深入hibernate的三种状态