新聞中心
在開發(fā)中,通常是通過兩種方式來執(zhí)行對數(shù)據(jù)庫的查詢操作的。一種方式是通過ID來獲得單獨的Java對象,另一種方式是通過HQL語句來執(zhí)行對數(shù)據(jù)庫的查詢操作。下面就分別結(jié)合這兩種Hibernate查詢方法來說明一下緩存的作用。

成都創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為西市企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè),西市網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
通過ID來獲得Java對象可以直接使用Session對象的load()或者get()方法,這兩種方式的區(qū)別就在于對緩存的使用上。 下面我們來具體看看Hibernate查詢方法的實現(xiàn)。
load()方法
在使用了二級緩存的情況下,使用load()方法會在二級緩存中查找指定的對象是否存在。
在執(zhí)行l(wèi)oad()方法時,Hibernate首先從當前Session的一級緩存中獲取ID對應的值,在獲取不到的情況下,將根據(jù)該對象是否配置了二級緩存來做相應的處理。
如配置了二級緩存,則從二級緩存中獲取ID對應的值,如仍然獲取不到則還需要根據(jù)是否配置了延遲加載來決定如何執(zhí)行,如未配置延遲加載則從數(shù)據(jù)庫中直接獲 取。在從數(shù)據(jù)庫獲取到數(shù)據(jù)的情況下,Hibernate會相應地填充一級緩存和二級緩存,如配置了延遲加載則直接返回一個代理類,只有在觸發(fā)代理類的調(diào)用 時才進行數(shù)據(jù)庫的查詢操作。
在Session一直打開的情況下,并在該對象具有單向關(guān)聯(lián)維護的時候,需要使用類似Session.clear(),Session.evict()的方法來強制刷新一級緩存。
get()方法
get()方法與load()方法的區(qū)別就在于不會查找二級緩存。在當前Session的一級緩存中獲取不到指定的對象時,會直接執(zhí)行查詢語句從數(shù)據(jù)庫中獲得所需要的數(shù)據(jù)。
在Hibernate查詢方法中,可以通過HQL來執(zhí)行對數(shù)據(jù)庫的查詢操作。具體的查詢是由Query對象的list()和iterator()方法來執(zhí)行的。這兩個方法在執(zhí)行查詢時的處理方法存在著一定的差別,在開發(fā)中應該依據(jù)具體的情況來選擇合適的方法。
list()方法
在執(zhí)行Query的list()方法時,Hibernate查詢方法是首先檢查是否配置了查詢緩存,如配置了則從查詢緩存中尋找是否已經(jīng)對該查詢進行了緩 存,如獲取不到則從數(shù)據(jù)庫中進行獲取。從數(shù)據(jù)庫中獲取到后,Hibernate將會相應地填充一級、二級和查詢緩存。如獲取到的為直接的結(jié)果集,則直接返 回,如獲取到的為一些ID的值,則再根據(jù)ID獲取相應的值(Session.load()),最后形成結(jié)果集返回??梢钥吹剑谶@樣的情況下,list ()方法也是有可能造成N次查詢的。
查詢緩存在數(shù)據(jù)發(fā)生任何變化的情況下都會被自動清空。
iterator()方法
Query的iterator()方法處理查詢的方式與list()方法是不同的,它首先會使用查詢語句得到ID值的列表,然后再使用Session的load()方法得到所需要的對象的值。
在獲取數(shù)據(jù)的時候,應該依據(jù)這4種獲取數(shù)據(jù)方式的特點來選擇合適的方法。在開發(fā)中可以通過設(shè)置show_sql選項來輸出Hibernate所執(zhí)行的SQL語句,以此來了解Hibernate查詢方法是如何操作數(shù)據(jù)庫的。
網(wǎng)頁標題:Hibernate查詢方法與緩存的關(guān)系
分享地址:http://m.fisionsoft.com.cn/article/coipejd.html


咨詢
建站咨詢
