分享知識-快樂自己: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(物件)先發起一條查詢語句,在發起更新或者插入語句