首頁  >  文章  >  Java  >  Java中Hibernate的二級快取與多表查詢的介紹

Java中Hibernate的二級快取與多表查詢的介紹

不言
不言轉載
2018-12-13 10:01:561442瀏覽

這篇文章帶給大家的內容是關於Java中Hibernate的二級快取與多表格查詢的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

我們來看兩個關於Java框架之Hibernate的面試題,這是關於Hibernate的常考知識點。

1、請介紹Hibernate的二級快取

解題依照以下想法來回答:

(1)先說清楚什麼是緩存;

(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,為什麼還要有二級緩存;

(3)最後再說如何配置Hibernate的二級快取。

快取就是把以前從資料庫中查詢出來和使用過的物件保存在記憶體中(一個資料結構中),這個資料結構通常是或類似Hashmap,當以後要使用某個物件時,先查詢快取中是否有這個對象,如果有則使用快取中的對象,如果沒有則去查詢資料庫,並將查詢出來的對象保存在快取中,以便下次使用。下面是快取的偽代碼:

引出hibernate的第二層緩存,用下面的偽代碼分析了Cache的實作原理。

Dao
{
hashmap map = new map();
User getUser(integer id)
{
User user = map.get(id)
if(user == null)
{
user = session.get(id);
map.put(id,user);
}
return user;
}
}
Dao
{
Cache cache = null
setCache(Cache cache)
{
this.cache = cache
}
User getUser(int id)
{
if(cache!=null)
{
User user = cache.get(id);
if(user ==null)
{
user = session.get(id);
cache.put(id,user);
}
return user;
}
return session.get(id);
}
}

Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當想使用session從資料庫中查詢出一個物件時,Session也是先從自己內部查看是否存在這個對象,存在則直接傳回,不存在才去存取資料庫,並將查詢的結果保存在自己內部。由於Session代表一次會話過程,一個Session與一個資料庫連線相關連,所以Session最好不要長時間保持打開,通常只用於一個事務當中,在事務結束時就應關閉。而Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全域意義上的快取才是真正的快取應用,才有較大的快取價值,因此,Hibernate的Session這一級快取的快取作用並不明顯,應用價值不大。 Hibernate的二級快取就是要為Hibernate配置一種全域緩存,讓多個執行緒和多個事務都可以共享這個快取。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果。

二級快取是獨立於Hibernate的軟體元件,屬於第三方的產品,多個廠商和組織都提供有快取產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置中配置使用哪個廠家的緩存產品,接著需要配置該緩存產品自己的配置文件,最後要配置Hibernate中的哪些實體對像要納入到二級快取的管理中。明白了二級快取原理和有了這個想法後,很容易配置起Hibernate的二級快取。

擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能負責緩存一個資料庫中的數據,當使用Hibernate 的二級緩存後,注意不要有其他的應用程式或SessionFactory來更改目前資料庫中的數據,這樣快取的數據就會與資料庫中的實際數據不一致。

2、Hibernate進行多表查詢每個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決?
解決方案一,依照Object[]資料取出數據,然後自己組bean

解決方案二,對每個表的bean寫建構函數,例如表一要查出field1,field2兩個字段,那麼有一個建構函數就是Bean(type1 filed1,type2,field2) ,然後在hql裡面就可以直接產生這個bean了。

以上是Java中Hibernate的二級快取與多表查詢的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除