Hibernate4之session核心方法

在學習session的核心方法之前,我們先了解下hibernate中幾種對象的狀態:

臨時狀態:這種狀態就好像咱們公司請的臨時員工一樣,他在公司裏沒有相關的資料和id。

    特點:在使用代理主鍵的情況下, OID 通常爲 null
        不處於 Session 的緩存中
        在數據庫中沒有對應的記錄   

持久化狀態:我們可以理解成我們公司的正式在崗職工。

     特點:OID 不爲 null
 位於 Session 緩存中
若在數據庫中已經有和其對應的記錄, 持久化對象和數據庫中的相關記錄對應
Session 在 flush 緩存時, 會根據持久化對象的屬性變化, 來同步更新數據庫
在同一個 Session 實例的緩存中, 數據庫表中的每條記錄只對應唯一的持久化對象

遊離狀態:這種就類似我們公司在職休假的員工,有其相關的在崗資料。

    特點:OID 不爲 null
不再處於 Session 緩存中
一般情況需下, 遊離對象是由持久化對象轉變過來的, 因此在數據庫中可能還存在與它對應的記錄

刪除狀態:這種就類似我們的已經離職的員工

    特點:在數據庫中沒有和其 OID 對應的記錄
不再處於 Session 緩存中
一般情況下, 應用程序不該再使用被刪除的對象

session的save方法

save方法可以使一個臨時對象轉化爲一個持久對象。

1、把要save的對象加入到session中,使它進入持久化狀態

2、選用映射文件指定的標識符生成器, 爲持久化對象分配唯一的 OID. 在 使用代理主鍵的情況下, setId() 方法爲 News 對象設置 OID 使無效的.
3、計劃執行一條 insert 語句:在 flush 緩存的時候
4、Hibernate 通過持久化對象的 OID 來維持它和數據庫相關記錄的對應關係. 當 News 對象處於持久化狀態時, 不允許程序隨意修改它的 ID
5、persist() 和 save() 區別:
當對一個 OID 不爲 Null 的對象執行 save() 方法時, 會把該對象以一個新的 oid 保存到數據庫中;  但執行 persist() 方法時會拋出一個異常.

session的get方法和load方法

相同點:都可以根據跟定的 OID 從數據庫中加載一個持久化對象
不同點:
當數據庫中不存在與 OID 對應的記錄時, load() 方法拋出 ObjectNotFoundException 異常, 而 get() 方法返回 null
兩者採用不同的延遲檢索策略:load 方法支持延遲加載策略。而 get 不支持。

session的update方法

1、Session 的 update() 方法使一個遊離對象轉變爲持久化對象, 並且計劃執行一條 update 語句.
2、若希望 Session 僅當修改了 News 對象的屬性時, 才執行 update() 語句, 可以把映射文件中 <class> 元素的 select-before-update 設爲 true. 該屬性的默認值爲 false
3、當 update() 方法關聯一個遊離對象時, 如果在 Session 的緩存中已經存在相同 OID 的持久化對象, 會拋出異常
4、當 update() 方法關聯一個遊離對象時, 如果在數據庫中不存在相應的記錄, 也會拋出異常. 

session的saveOrUpdate方法

1、Session 的 saveOrUpdate() 方法同時包含了 save() 與 update() 方法的功能

2、該方法使用的情況:

判定對象爲臨時對象的標準
Java 對象的 OID 爲 null
映射文件中爲 <id> 設置了 unsaved-value  屬性, 並且 Java 對象的 OID 取值與這個 unsaved-value 屬性值匹配

session的delete方法

1、Session 的 delete() 方法既可以刪除一個遊離對象, 也可以刪除一個持久化對象
2、Session 的 delete() 方法處理過程
計劃執行一條 delete 語句
把對象從 Session 緩存中刪除, 該對象進入刪除狀態.
3、Hibernate 的 cfg.xml 配置文件中有一個 hibernate.use_identifier_rollback 屬性, 其默認值爲 false, 若把它設爲 true, 將改變 delete() 方法的運行行爲: delete() 方法會把持久化對象或遊離對象的 OID 設置爲 null, 使它們變爲臨時對象


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章