Hibernate學習總結 7

2021-06-16 21:01:55 字數 3123 閱讀 8880

9.1hibernate提供了下列方法從資料庫中獲取物件:

1、通過get()或load()方法按照id獲取物件。

2、從乙個已經載入的物件開始,通過系列的get方法訪問被關聯的物件。

3、hql查詢獲取單個或系列物件。

4、criteria查詢獲取單個或系列物件。

5、原生sql查詢獲取單個或系列物件。

我們要關注的是主物件及其關聯物件的載入計畫和載入策略,即資料何時被載入以及資料被怎樣載入的問題。

(1)涉及到載入計畫(何時載入)的關注點有以下幾個:

1、主物件的關聯物件何時被載入

2、主物件的關聯集合何時被載入

3、主物件本身何時被載入

4、主物件的屬性何時被載入

(2)預設載入計畫

1、關聯物件和關聯集合的預設載入計畫是:延遲載入,即載入主物件時它們不會被立即載入,而是直到使用這些物件和集合時才傳送sql語句、獲取資料、初始化物件和集合。

2、主物件本身是否延遲載入取決於使用的是load()方法還是其它方法,load()方法是延遲的,而get()方法或其它方法是立即的。

3、主物件的屬性預設是被立即載入的。

(3)改變預設載入計畫

可以通過修改對應類的實體對映檔案,改變預設的載入計畫。

但不建議這樣做,因為這樣配置之後,不管是否需要關聯資料,hibernate都會載入,這樣會造成大量的記憶體浪費。最好是採用程式設計方式在特定情況下進行立即載入(也稱熱載入),比如我們之前提到的hql fetch join或者在criteria查詢中設定fetchmode。

(4)get()與load()的對比

load()是延遲載入的。

get和load方式是根據id取得乙個記錄;

1.從返回結果上對比: load方式檢索不到的話會丟擲org.hibernate.objectnotfoundexception異常 get方法檢索不到的話會返回null

2.從檢索執行機制上對比: get方法和find方法都是直接從資料庫中檢索 而load方法的執行則比較複雜首先查詢session的persistent context中是否有快取,如果有則直接返回 如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常 如果是lazy則需要建立**物件,物件的initialized屬性為false,target屬性為null 在訪問獲得的**物件的屬性時,檢索資料庫,如果找到記錄則把該記錄的物件複製到**物件的target上,並將initialized=true,如果 找不到就丟擲異常。

參考:(6)屬性的載入計畫

需要注意的是,普通屬性的預設載入計畫是立即載入,這一點我們也可以改變。

hibernate3開始增加了property節點的lazy屬性,為特定的屬性指定延遲載入計畫,以避免主物件整體載入可能帶來的效能浪費,尤其是針對大資料量的屬性。

hibernate一級快取的生命週期跟session的生命週期一樣,所以也可以將hibernate一級快取稱為session快取。hibernate一級快取是乙個強制的快取記憶體。

它是屬於事務範圍的快取。這一級別的快取由hibernate管理的,一般情況下無需進行干預。

(1)get()方法會去一級快取中查詢獲取資料(又稱命中資料),並且將查詢結果放置在一級快取中。load()也一樣。

(2)list()方法會將查詢結果放置在一級快取中,但是它不會去一級快取中查詢獲取資料,原因是list()方法不是通過id載入的。

(3)iterate方法

iteratoriter = session.createquery(「from **").iterate(); 

該語句只把id的值放到迭代器中,當遍歷的時候,會根據id的值再去資料庫中查。並且該語句會產生n+1次查詢。

iterate查詢針對實體(不是針對屬性查詢)的時候會採用n+1的方式,載入實體物件前會做一級快取命中(如果iterate之前已經做過查詢,iterate作快取命中,就不需要有n+1查詢),並且將實體快取起來。

(4)session.clear()方法一次性清除一級快取中的所有資料。

(5)session.evict(object object)方法是清楚一級快取中指定物件。

(6)flush()和clear()

在資料量比較大的情況下,管理一級快取的做法一般都是在一定數量的更新或者儲存等操作之後,使用flush()和clear()方法將資料同步到資料庫並清除一級快取,從而避免一次性大量實體資料的快取導致記憶體溢位。

session session = getsession();

session.begintransaction();

for(int i=0;i<10000;i++)

} session.gettransaction().commit();

session.close();

二級快取是乙個可選的快取外掛程式,它由sessionfactory負責管理,所以也常將二級快取稱為sessionfactory快取。

由於sessionfactory物件的生命週期和應用程式的整個過程對應,因此二級快取是程序範圍的快取,可以被執行緒共享,所以可能存在併發問題,因此需要採用適當的併發訪問策略。

二級快取對實體類是可選的,可以在每個類或每個集合的粒度上配置二級快取。hibernate的二級快取策略,是針對於id查詢的快取策略,對於條件查詢則毫無作用。

(1)適用於:

1、 很少被修改的資料;

2、 不是很重要的資料;

3、 不會被併發訪問的資料。

(2)不適用於:

1、 經常被修改的資料;

2、 財務資料;

3、 與其他應用共享的資料。

(3) 常用的快取外掛程式

hibernater 的二級快取是乙個外掛程式,下面是幾種常用的快取外掛程式:

l ehcache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對hibernate的查詢快取提供了支援。

l oscache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對hibernate的查詢快取提供了支援。

l swarmcache:可作為群集範圍內的快取,但不支援hibernate的查詢快取。

l jbosscache:可作為群集範圍內的快取,支援事務型併發訪問策略,對hibernate的查詢快取提供了支援。

Hibernate學習總結

經過乙個星期的hibernate學習,我自己也有一些體會。沒有接觸hibernate之前,對於jdbc是深惡痛絕的。jdbc無法直接物件導向,開發效率低,冗餘,重複性工作太多等等。程式設計也是講效率的,過多的冗餘 太多的重複性工作使其效率低下。然而,hibernate卻不一樣,它是一種開放源 的關係...

Hibernate學習總結

提高我們的開發效率.可以理解成是乙個半成品專案.dao層框架 運算元據庫.以物件導向的方式運算元據庫.orm 思想.物件關係對映.通過對映檔案配置物件與資料庫中表的關係.1 導包 required 驅動包 2 準備實體類 以及 orm元資料 3 建立主配置檔案 4 書寫 測試 hibernate.c...

linux學習總結7

1.raid 磁碟陣列。raid 0 n個磁碟等量訪問。讀寫效能最佳,但資料不安全 raid 1 讓同一份檔案,完整的存放在n個磁碟上。資料備份安全。raid 5 至少三顆磁碟,每個磁碟加入同為檢查資料。有一顆磁碟壞掉可以恢復資料。讀寫效能也較佳。2.read 從鍵盤讀入變數。用在shell scr...