Hibernate的Session介绍[转 adoocoke]
Session
Session是Hibernate向應用程序提供操作數據的主要接口, 他提供了保存、更新、刪除、加載Java對象的方法。
Session的緩存
Session有一個緩存,用來緩存Java對象。一般的數據庫操作,都要從先從Session的緩存中獲取,如果緩存中獲取不到,hibernate才會去數據庫中獲取。
緩存的作用
緩存的作用不言而喻。1、減少數據訪問的頻率。2、保持保證數據相關記錄與緩存中的同步。
清理緩存
Session的save、update、delete方法,只有在清理緩存的時候才向數據庫中執行一條Sql語句。所以,Session清理緩存的時間點,是個關鍵概念。
Session會在一下幾個時間點清理緩存,并執行相關語句:
a、當應用程序調用org.hibernate.Transaction的commit()方法的時候,commit()方法先清理緩存,然后再向數據庫提交事務。 b、當應用程序通過Hibernate的Query查詢接口等執行查詢操作時,如果緩存中持久化對象的屬性發生了變化,就會先清理緩存,以保證查詢結果能反映持久化對象的最新狀態。 c、當應用程序顯式調用Session的flush()方法的時候。?Java對象在Hibernate中的狀態
介紹緩存的方法之前,先介紹一下java對象在緩存中的幾種狀態,以便更好的立即緩存對對象的操作。
臨時狀態:通過new方法新創建的對象,還沒有持久化到數據庫中,也不在Session的緩存中, 此時的對象處于臨時狀態。對象也成為臨時對象。
持久化狀態:對象被持久化,同時已經加入到緩存中。此時的對象也被稱為持久化對象。
刪除狀態:對象不在Session緩存中,Session也計劃將其從數據庫中刪除。此時的對象也被稱為刪除對象。
游離狀態:已經被持久化,但沒有加載到Session緩存中,稱為游離狀態,此時的對象也被稱為游離對象。
Session接口中的方法
1、save()和persist()
????? save方法將一個臨時對象變為一個持久化對象。并為對象生成OID主鍵。同時,執行一條insert語句就,將對象存儲在數據庫中。(save并不立即執行Sql insert語句,而是在Session清理緩存的時候才執行)
????? save和persist都是將java對象持久化到數據庫中的方法。他們的區別在于,persist方法不保證立即為持久化對象生成OID主鍵,而是在Session清理緩存的時候才為OID生成。
2、get()和load()
????? get()和load()都是根據OID從數據庫中獲取一個Java對象。
????? 區別:a、數據庫中沒有OID對應的對象時,get返回null,load拋出ObjectNotFoundException。
?????????????? b、load默認使用“延遲檢索策略”,而get使用“立即加載策略”。關于這兩個策略的介紹請看《Hibernate的檢索策略》
3、update()
???? update方法更新java對象的某些屬性,并能夠使一個游離對象轉變為一個持久化對象。同樣,update也不是立即執行,也是在清理緩存的時候執行,并且在執行前才組裝update語句, 也就是說,它只會組裝最后一次設置的對象的屬性值。
4、saveOrUpdate()
????? saveOrUpdate方法,兼有save和update的功能,它會判斷傳入的對象狀態,如果是臨時對象, 就執行save;如果是游離對象,就執行update。判斷方法有:OID是否為null、
????? 是否具有version版本控制屬性并為null,id和version的unsaved-value屬性是否與對應的值相等、是否設置了攔截器邏輯的isUnsaved返回true。
5、delete()
????? delete方法可以刪除持久化對象,也可以刪除游離對象。它先將游離對象與session相關聯,然后準備一條sql語句,然后對象從session中刪除,最后等待Session在清理緩存的時候才執行sql語句。
6 、flush()
????? flush會使Session立即清理緩存,并指向相關數據庫Sql語句,但不會提交事務。
7、commit()
????? commit方法會調用flush清理緩存,執行Sql,并并提交事務。
8、merge()
????? 處于游離狀態的對象是不能夠執行update語句的,否則hibernate會拋出NotUniqueObjectException異常,如何能夠將游離狀態的對象在恢復到持久化狀態呢。使用merge方法就可以辦到。merge方法能夠將一個游離對象的屬性復制到持久化對象中。
下面是對象的狀態轉換圖(來自網絡),從這個圖中我們可以看到狀態轉換和Session中方法的調用關系。
轉載于:https://www.cnblogs.com/wukong0214/archive/2013/01/23/2874030.html
總結
以上是生活随笔為你收集整理的Hibernate的Session介绍[转 adoocoke]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第19章 归档模式下的数据库恢复
- 下一篇: 趁热打铁-一次.Net WebServi