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

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

圖解:

 

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(物件)先發起一條查詢語句,在發起更新或者插入語句