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