1. 程式人生 > >分享知識-快樂自己:Hibernate對象的三種狀態

分享知識-快樂自己:Hibernate對象的三種狀態

png delete rup load() ear 比較 lec alt 使用

圖解:

技術分享圖片

1):瞬時狀態(Transient)

  對象與session沒有關聯,數據庫中沒有對應的數據。

  一般new出來的對象便是瞬時對象。

  對瞬時對象使用save()方法便使之成為持久對象。

  由於數據庫中沒有對應的數據,所以對瞬時對象使用update()方法無效。

2):持久狀態(Persistent)

  對象與session有關聯,且數據庫中有對應id的數據。

  使用get()、load()等方法獲得的是持久對象。

  對瞬時對象使用save()方法便使之成為持久對象。

  對遊離對象使用update()方法便使之成為持久對象。

  對持久對象使用delete()方法使使之成為瞬時對象。

3):遊離狀態(Detached)

  對象與sessions沒有關聯,但數據庫中有對應id的數據。

  對瞬時對象使用setId()方法,且數據庫中有對應id的數據時,該對象便成為遊離對象。

  當對象為持久狀態時,對session執行close()、clear()、evict()等方法後,該持久對象變為遊離對象。

  對遊離對象使用delete()方法便使之成為瞬時對象。

  對遊離對象使用update()方法便使之成為持久對象。

  由於數據庫中已經存在對應id的數據,所以對遊離對象使用save()方法無效。

hibernate涉及的臟檢查:

  當事務提交時(commit),hibernate會檢查session中處在持久狀態的對象, 判斷與數據庫是否一致,不一致則會將緩存裏面的數據更新掉數據庫裏面的數據!

那麽session什麽時候刷新緩存:

  1、執行commit方法時 //執行臟檢查

  2、session.flush(); //不會提交事務執行臟檢查

更新數據的方法:

update(對象):

saveOrUpdate(對象):

 1、通過id查詢主鍵,存在就更新,不存在就新增!

 2、當mapping配置文件的generator節點的class屬性不為assigned時,造成只有update沒select時,更改class為assigned可以解決!

 3、不會發起查詢,直接更新 merge(對象):合並,先查詢,與緩存裏面的數據比較一樣時不做任何操作,不一樣時,再更新或者插入!效率更高!

saveOrUpdate(對象)與merge(對象)方法:

1、主鍵生成策略:

  assigned 操作一樣!

2、SQL語句不同:

  sequence,動態更新(dynamic-update="true")策略

  saveOrUpdate(對象)只更新

  merge(對象)先發起一條查詢語句,在發起更新或者插入語句

分享知識-快樂自己:Hibernate對象的三種狀態