快速了解Hibernate中的Session
Hibernate中的Session是一級緩存,可以理解為進程級(是線程吧)的緩存,在進程(是線程吧)運行期間一直存在。
session可以理解為一個可以操作數(shù)據(jù)庫的對象,該對象中有操作數(shù)據(jù)庫的方法。
在Java里面,緩存通常是指Java對象的屬性占用的內(nèi)存空間,通常是一些集合類型的屬性。在Session接口的實現(xiàn)類SessionImpl中定義了一系列的Java集合,這些Java集合就構(gòu)成了Session的緩存。
總的來說(我對Session的理解):Session是Hibernate和DB的中間人(一個對象),Session中有兩塊東西或者說是功能
(1)操作數(shù)據(jù)庫的方法
(2)Session中有一些屬性(集合之類的東西),通過這些屬性來存儲要發(fā)送給DB的sql語言、緩存從DB中已經(jīng)查出來的數(shù)據(jù)等
Session緩存
session緩存是由一系列的Java集合構(gòu)成的。當(dāng)一個對象被加入到Session緩存中,這個對象的引用就加入到了java的集合中,以后即使應(yīng)用程序中的引用變量不再引用該對象,只要Session緩存不被清空,這個對象一直處于生命周期中。
Session緩存的作用:
1)減少訪問數(shù)據(jù)庫的頻率。
2)保證緩存中的對象與數(shù)據(jù)庫中的相關(guān)記錄保持同步。
Session清理緩存的時機:
1)當(dāng)調(diào)用Transaction的commit()方法時,commit()方法先清理緩存(前提是FlushMode.COMMIT/AUTO),然后再向數(shù)據(jù)庫提交事務(wù)。
2)當(dāng)應(yīng)用程序調(diào)用Session的find()或者iterate()時,如果緩存中的持久化對象的屬性發(fā)生了變化,就會先清理緩存,以保證查詢結(jié)果能反映持久化對象的最新狀態(tài)。
3)當(dāng)應(yīng)用程序顯示調(diào)用Session的flush()方法的時候。
Session清理模式執(zhí)行清理緩存操作的時間點:
Session接口
Session接口是Hibernate向應(yīng)用程序提供的操縱數(shù)據(jù)庫的最主要的接口,它提供了基本的保存,更新,刪除和查詢的方法。
1.save():把一個臨時對象加入到緩存中,是它變成持久化對象
-->選用映射文件指定的主鍵生成器為持久化對象分配唯一的OID
-->計劃一條insert語句,把參數(shù)對象當(dāng)前的屬性值組裝到insert語句中,但是save()方法并不立即執(zhí)行SQLinsert語句,只有當(dāng)Session清理緩存時候才會執(zhí)行。
-->如果在save()方法之后,又修改了持久化對象的屬性,會使得Session在清理緩存的時候額外執(zhí)行SQLupdate語句。
注意:save()方法是用來持久化一個臨時對象的!
如果將一個持久化對象傳給save()方法將不會執(zhí)行任何操作,多余的步驟
如果將一個游離態(tài)對象傳給save()方法,session會將它當(dāng)作臨時對象來處理,再次向數(shù)據(jù)庫中插入一條記錄,不符合業(yè)務(wù)需求!
2.update():把Customer對象重新加入到Session緩存中,使之變?yōu)槌志没瘜ο蟆?/p>
--->計劃一條update語句,只有在清理緩存的時候才會執(zhí)行,并且在執(zhí)行的時候才會把參數(shù)對象中的屬性值組裝到update語句中。
注意:update()是將一個游離對象轉(zhuǎn)變?yōu)槌志没瘜ο蟮摹?/p>
只要通過update()方法使游離對象被一個session關(guān)聯(lián),即使沒有修改參數(shù)對象的任何屬性,Session在清理緩存的時候也會執(zhí)行由update方法計劃的Update語句。
3.saveOrUpdate():同時包含了save()與update()方法的功能,如果傳入的參數(shù)是臨時對象,調(diào)用save方法,如果參入?yún)?shù)是游離對象,調(diào)用update()方法,如果傳入的是持久化對象,直接返回。
4.load()/get():都會根據(jù)給定的OID從數(shù)據(jù)庫中加載一個持久化對象,區(qū)別在于,當(dāng)數(shù)據(jù)庫中不存在與OID對應(yīng)的記錄時,load()方法會拋出ObjectNotFoundException異常,而get()方法返回null.
5.delete():用于從數(shù)據(jù)庫中刪除與參數(shù)對象對應(yīng)的記錄,如果傳入的參數(shù)是持久化對象,Session就計劃執(zhí)行一個delete語句,如果傳入的參數(shù)是游離對象,先使游離對象被Session關(guān)聯(lián),使它變?yōu)槌志没瘜ο螅缓笥媱澮粋€delete語句,在清理緩存的時候執(zhí)行。
6.evict():從緩存中清除參數(shù)指定的持久化對象。
適用場合:不希望Session繼續(xù)按照該對象的狀態(tài)改變來同步更新數(shù)據(jù)庫。
在批量更新或批量刪除的場合,當(dāng)更新或者刪除一個對象后,及時釋放該對象占用的內(nèi)存。當(dāng)然批量操作優(yōu)先考慮JDBC.
7.clear():清空緩存中所有持久化對象。
總結(jié)
以上就是快速了解Hibernate中的Session的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java?ObjectMapper的使用和使用過程中遇到的問題
在Java開發(fā)中,ObjectMapper是Jackson庫的核心類,用于將Java對象序列化為JSON字符串,或者將JSON字符串反序列化為Java對象,這篇文章主要介紹了Java?ObjectMapper的使用和使用過程中遇到的問題,需要的朋友可以參考下2024-07-07解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system
今天小編就為大家分享一篇關(guān)于解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system的異常問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12