熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate對象的三種狀態

2013-11-23 20:33:21  來源: Java開源技術 

  對象三種狀態

  瞬時(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
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.