分享知識-快樂自己: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(對象)先發起一條查詢語句,在發起更新或者插入語句
分享知識-快樂自己:Hibernate對象的三種狀態