對象三種狀態
瞬時(transient)數據庫中沒有數據與之對應超過作用域會被JVM垃圾回收器回收一般是new出來且與session沒有關聯的對象
持久(persistent)數據庫中可能有數據與之對應(save)當前與session有關聯並且相關聯的session沒有關閉事務沒有提交持久對象狀態發生改變在事務提交時會影響到數據庫(hibernate能檢測到)
脫管(detached)數據庫中可能有數據與之對應但當前沒有session與之關聯但是有oid;托管對象狀態發生改變hibernate不能檢測到
怎麼樣判斷
是否與session有關數據庫是否有記錄
三種狀態的轉換
瞬時狀態
通過new語句剛創建了一個java對象他處於臨時狀態此時不和數據庫中的任何記錄對應
持久狀態
session的save()方法瞬時對象>轉變為持久化對象
session的load()方法和get()方法返回的對象總是處於持久化狀態
session的update()saveOrUpdate()lock()游離對象>持久化對象
當一個持久化對象關聯一個臨時對象在允許級聯保存的情況下session在清理緩存時會把這個臨時對象轉變為持久化對象
游離狀態
當調用session的close()方法時session的緩存被清空緩存中的所有持久化對象變為游離對象如果在應用程序中沒有引用變量引用這些游離對象他們就會結束生命周期
session的evict()方法能夠從緩存中刪除一個持久化對象使他變為游離狀態
圖像說明三者關系
save
瞬時狀態
>持久狀態
update
游離狀態
>持久狀態
saveOrRpdate
無法判斷是瞬時還是游離
可調用此方法變為持久狀態
會自動判斷是瞬時還是游離
游離狀態有可能會出現數據庫沒有信息了
但是仍舊有oid
會出現刪除狀態
如何判斷對象狀態
操縱持久化對象
save()
Session 的 save() 方法使一個臨時對象轉變為持久化對象
Session 的 save() 方法完成以下操作:
把 News 對象加入到 Session 緩存中
使它進入持久化狀態
選用映射文件指定的標識符生成器
為持久化對象分配唯一的 OID
在使用代理主鍵的情況下
setId() 方法為 News 對象設置 OID 使無效的
(一般自動生成)
Hibernate 通過持久化對象的 OID 來維持它和數據庫相關記錄的對應關系
當 News 對象處於持久化狀態時
不允許程序隨意修改它的 ID(如何插入表中的對應關系)
計劃執行一條 insert 語句
把Customer對象當前的屬性值組裝到insert語句中
只有當session清理緩存時
才會執行SQL insert語句
如果在save()方法之後
修改了持久化對象的屬性值
session清理緩存時會額外執行SQL update語句(如下例)
在
行下添加修改姓名的代碼
判斷真正插入到數據庫裡的是什麼
結果如下
【原理解釋】
new出來的對象變成持久化狀態
user與session關聯
user發生的任何變化hibernate都知道
save出來的user還沒有插入到數據庫中
表中最終保存下來的是abc
update()
Session 的 update() 方法使一個游離對象轉變為持久化對象
並且計劃執行一條 update 語句
saveOrupdate()
該方法同時包含save和update方法
如果參數是臨時對象就用save方法
如果是游離對象就用update方法
如果是持久化對象就直接返回
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28664.html