java 高级编程进阶_JAVA高级编程之hibernate进阶学习
二級緩存
hibernate的session緩存
在事務(wù)級別進行持久化數(shù)據(jù)的緩存操作。 當然,也有可能分別為每個類(或集合),配置集群、或 JVM 級別(SessionFactory 級別)的緩存。你甚至可以為之插入一個集群的緩存。注意,緩存永遠不知道其他應(yīng)用程序?qū)Τ志没瘋}庫(數(shù)據(jù)庫)可能進行的修改 (即使可以將緩存數(shù)據(jù)設(shè)定為定期失效)。
session緩存 :
session緩存是由一系列的Java集合構(gòu)成的。當一個對象被加入到Session緩存中,這個對象的引用就加入到了java的集合中,以后即使應(yīng)用程序中的引用變量不再引用該對象,只要Session緩存不被清空,這個對象一直處于生命周期中。
session作用:
1)減少訪問數(shù)據(jù)庫的頻率。
2)保證緩存中的對象與數(shù)據(jù)庫中的相關(guān)記錄保持同步。
Session清理緩存的時機:
1)當調(diào)用Transaction的commit()方法時,commit()方法先清理緩存(前提是FlushMode.COMMIT/AUTO),然后再向數(shù)據(jù)庫提交事務(wù)。
2)當應(yīng)用程序調(diào)用Session的find()或者iterate()時,如果緩存中的持久化對象
的屬性發(fā)生了變化,就會先清理緩存,以保證查詢結(jié)果能反映持久化對象的最新
狀態(tài)。
3)當應(yīng)用程序顯示調(diào)用Session的flush()方法的時候。
Hibernate對象的狀態(tài)
1)瞬時態(tài)Transient:
含義:由new操作符創(chuàng)建,且尚未與Hibernate Session關(guān)聯(lián)的對象。處于瞬時態(tài)的java對象成為臨時對象。
特點:不處于Session的緩存中,即不被任何一個Session實例關(guān)聯(lián)。
在數(shù)據(jù)庫中沒有對應(yīng)的記錄。
2)持久態(tài)Persistent
含義:已經(jīng)被持久化,加入到Session的緩存中,處于持久化狀態(tài)的java對象被稱為持久化對象。
特點:位于一個Session實例的緩存中。
持久化對象在數(shù)據(jù)庫中有相應(yīng)的記錄,Session在清理緩存時,會根據(jù)持久化對象的屬性變化來同步更新數(shù)據(jù)庫。
當一個持久化對象關(guān)聯(lián)一個臨時對象,在允許級聯(lián)保存的情況下,Session在清理緩存的時候會把這個臨時對象也轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/p>
3)脫管態(tài)Detached
含義:已經(jīng)被持久化,但不再處于Session的緩存中,處于脫管狀態(tài)的java對象稱為游離對象。
特點:不再位于Session的緩存中,即不被Session關(guān)聯(lián)。
游離對象是由持久化對象轉(zhuǎn)變過來的,因此在數(shù)據(jù)庫存在與之對應(yīng)的記錄(前提是沒有其他程序刪除了這條記錄)。
hibernate對象狀態(tài)裝換圖如下圖所示:
Session API :
Session接口是Hibernate向應(yīng)用程序提供的操縱數(shù)據(jù)庫的最主要的接口,它提供了基本的保存,更新,刪除和查詢的方法。
save():把一個臨時對象加入到緩存中,使它變成持久化對象
如果在save()方法之后,又修改了持久化對象的屬性,會使得Session在清理緩存的時候額外執(zhí)行SQL update語句。
注意:save()方法是用來持久化一個臨時對象的!
update():把Object對象重新加入到Session緩存中,使之變?yōu)槌志没瘜ο蟆?/p>
計劃一條update語句,只有在清理緩存的時候才會執(zhí)行,并且在執(zhí)行的時候才會把參數(shù)對象中的屬性值組裝到update語句中。
注意:update()是將一個游離對象轉(zhuǎn)變?yōu)槌志没瘜ο蟮摹?/p>
saveOrUpdate():同時包含了save()與update()方法的功能,如果傳入的參數(shù)是臨時對象,調(diào)用save方法,如果參入?yún)?shù)是游離對象,調(diào)用update()方法,如果傳入的是持久化對象,直接返回。
load()/get():都會根據(jù)給定的OID從數(shù)據(jù)庫中加載一個持久化對象,區(qū)別在于,當數(shù)據(jù)庫中不存在與OID對應(yīng)的記錄時,load()方法會拋出ObjectNotFoundException異常,而get()方法返回null。
delete():于從數(shù)據(jù)庫中刪除與參數(shù)對象對應(yīng)的記錄,如果傳入的參數(shù)是持久化對象,Session就計劃執(zhí)行一個delete語句,如果傳入的參數(shù)是游離對象,先使游離對象被Session關(guān)聯(lián),使它變?yōu)槌志没瘜ο?#xff0c;然后計劃一個delete語句,在清理緩存的時候執(zhí)行。
evict():從緩存中清除參數(shù)指定的持久化對象。
clear():清空緩存中所有持久化對象。
總結(jié)
以上是生活随笔為你收集整理的java 高级编程进阶_JAVA高级编程之hibernate进阶学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中把输出结果写到一个文件中_
- 下一篇: 人脸识别门禁_小区人脸识别门禁或取代传统