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

Hibernate中po對象的三種狀態分析

2013-11-23 20:09:14  來源: Java開源技術 

  Hibernate的狀態

  hibernate的各種保存方式的區(savepersistupdatesaveOrUpdtemergeflushlock)及 對象的三種狀態

  hibernate的保存

  hibernate對於對象的保存提供了太多的方法他們之間有很多不同這裡細說一下以便區別

  預備知識

  在所有之前說明一下對於hibernate它的對象有三種狀態transientpersistentdetached

  下邊是常見的翻譯辦法

  transient瞬態或者自由態

  (new DeptPo(行政部行政相關)該po的實例和session沒有關聯該po的實例處於transient)

  persistent持久化狀態

  (和數據庫中記錄想影射的Po實例它的狀態是persistent 通過get和load等得到的對象都是persistent)

  detached脫管狀態或者游離態

  ()當通過get或load方法得到的po對象它們都處於persistent但如果執行delete(po)時(但不能執行事務)該po狀態就處於detached (表示和session脫離關聯)因delete而變成游離態可以通過save或saveOrUpdate()變成持久態

  ()當把session關閉時session緩存中的persistent的po對象也變成detached

  因關閉session而變成游離態的可以通過locksaveupdate變成持久態

  持久態實例可以通過調用 delete()變成脫管狀態

  通過get()或load()方法得到的實例都是持久化狀態的

  脫管狀態的實例可以通過調用lock()或者replicate()進行持久化

  save()和persist()將會引發SQL的INSERTdelete()會引發SQLDELETE

  而update()或merge()會引發SQL UPDATE對持久化(persistent)實例的修改在刷新提交的時候會被檢測到它也會引起SQL UPDATE

  saveOrUpdate()或者replicate()會引發SQLINSERT或者UPDATE

  save 和update區別

  把這一對放在第一位的原因是因為這一對是最常用的

  save的作用是把一個新的對象保存

  update是把一個脫管狀態的對象或自由態對象(一定要和一個記錄對應)更新到數據庫

  update 和saveOrUpdate區別

  這個是比較好理解的顧名思義saveOrUpdate基本上就是合成了save和update而update只是update;引用hibernate reference中的一段話來解釋他們的使用場合和區別

  通常下面的場景會使用update()或saveOrUpdate()

  程序在第一個session中加載對象接著把session關閉

  該對象被傳遞到表現層

  對象發生了一些改動

  該對象被返回到業務邏輯層最終到持久層

  程序創建第二session調用第二個session的update()方法持久這些改動

  saveOrUpdate(po)做下面的事:

  如果該po對象已經在本session中持久化了在本session中執行saveOrUpdate不做任何事

  如果savaOrUpdate(新po)與另一個與本session關聯的po對象擁有相同的持久化標識(identifier)拋出一個異常

  orghibernateNonUniqueObjectException: a different object with the same identifier value was already associated with the session: [futurewwwpoXtyhb#]

  saveOrUpdate如果對象沒有持久化標識(identifier)屬性對其調用save() 否則update() 這個對象

  persist和save區別

  這個是最迷離的一對表面上看起來使用哪個都行在hibernate reference文檔中也沒有明確的區分他們

  這裡給出一個明確的區分(可以跟進src看一下雖然實現步驟類似但是還是有細微的差別)

  主要內容區別

  persist把一個瞬態的實例持久化但是並不保證標識符(identifier主鍵對應的屬性)被立刻填入到持久化實例中標識符的填入可能被推遲到flush的時候

  save 把一個瞬態的實例持久化標識符及時的產生它要返回標識符所以它會立即執行Sql insert

  saveOrUpdatemerge和update區別

  比較update和merge

  update的作用上邊說了這裡說一下merge的

  如果session中存在相同持久化標識(identifier)的實例用用戶給出的對象覆蓋session已有的持久實例

  ()當我們使用update的時候執行完成後會拋出異常

  ()但當我們使用merge的時候把處理自由態的po對象A的屬性copy到session當中處於持久態的po的屬性中執行完成後原來是持久狀態還是持久態而我們提供的A還是自由態

  flush和update區別

  這兩個的區別好理解

  update操作的是在自由態或脫管狀態(因session的關閉而處於脫管狀態)的對象//updateSQL

  而flush是操作的在持久狀態的對象

  默認情況下一個持久狀態的對象的改動(包含set容器)是不需要update的只要你更改了對象的值等待hibernate flush就自動更新或保存到數據庫了hibernate flush發生在以下幾種情況中

   調用某些查詢的和手動flush()session的關閉SessionFactory關閉結合

  get()一個對象把對象的屬性進行改變把資源關閉

  transaction commit的時候(包含了flush)

  lock和update區別

  update是把一個已經更改過的脫管狀態的對象變成持久狀態

  lock是把一個沒有更改過的脫管狀態的對象變成持久狀態(針對的是因Session的關閉而處於脫管狀態的po對象()不能針對因delete而處於脫管狀態的po對象)

  對應更改一個記錄的內容兩個的操作不同

  update的操作步驟是

  ()屬性改動後的脫管的對象的修改>調用update

  lock的操作步驟是

  ()調用lock把未修改的對象從脫管狀態變成持久狀態>更改持久狀態的對象的內容>等待flush或者手動flush

  clear和evcit的區別

  clear完整的清除session緩存

  evcit(obj)把某個持久化對象從session的緩存中清空

  sessionlock(xtyhbLockModeNONE);//表示直接到緩存中去找變成持久態的對象

  sessionlock(xtyhbLockModeREAD);//先通過ID讀數據庫該記錄的ID看是否有該記錄如果有接著到緩存中去找變成持久態的對象


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28018.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.