Hibernate的系統 學習
一、Hibernate的介紹
首先,hibernate是數據持久層的一個輕量級框架。數據持久層的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等。
並且Hibernate是一個開源的orm(object relations mapping)框架,提供了查詢獲取數據的方法,用面向對象的思想來操作數據庫,節省了我們開發處理數據的時間。
2.那使用Hibernate的優點呢?
1.使用簡介的hql語句(Hibernate query language)。可以不使用傳統的insert,update等sql語句。比如insert一個對象,原來的做法是:insert into 表名稱 alue(值1,值2,值3,……),而現在的做法是:save(對象)。
2.使用or映射。對象到關系數據庫之間的映射。是從對象的角度操作數據庫,再次體現了面向對象思想。原來的實體抽取方法:首先有了表,然后表映射實體對象。而現在Hibernate做法是:直接由對象映射到表。
3.沒有侵入性,移植性比較好。什么是沒有侵入性?就是Hibernate采用了pojo對象。所謂的pojo對象就是沒有繼承Hibernate類或實現Hibernate接口。這樣的話,此類就是一個普通的Java類,所以移植性比較好。
4.支持透明持久化。透明是針對上層而言的。三層架構的理念是上層對下層的依賴,只是依賴接口不依賴具體實現。而Hibernate中的透明是指對業務邏輯層提供了一個接口session,而其他的都封裝隱藏。持久化是指把內存中的數據存放到磁盤上的文件中。
3.當然一個事物,不可能十全十美,即使如此優秀的Hibernate也有自己的弱點。比如:若是大量數據批量操作。則不適合使用Hibernate。並且一個持久化對象不能映射到多張表中。
4.Hibernate中核心5個接口
1.Configuration接口:負責配置及啟動Hibernate,用來創建sessionFactory
2.SessionFactory接口:一個SessionFactory對應一個數據源存儲,也就是一個數據庫對應一個SessionFactory。SessionFactory用來創建Session對象。並且SessionFactory是線程安全的,可以由多個線程訪問SessionFactory共享。
3.Session接口:這個接口是Hibernate中常用的接口,主要用於對數據的操作(增刪改查)。而這個Session對象不是線程安全的。不能共享。
4.Query接口:用於數據庫的查詢對象。
5.Transaction接口:Hibernate事務接口。它封裝了底層的事務操作,比如JTA(;Java transcation architecture)所有的數據操作,比如增刪改查都寫在事務中。
基本的概念以及核心接口已經介紹,那Hibernate又是如何應用的呢?下篇博客將會介紹如何使用Hibernate?
看一下hibernate中整體的內容:
我們一一介紹其中的內容。
- Hibernate出現的原因上篇博客已經介紹,可以參考《Hibernate介紹》
- Hibernate中的核心五大接口,在上篇博客中也已經介紹,可以參考《Hibernate介紹》
- 如何搭建Hibernate,請參考《八步詳解Hibernate的搭建及使用》
- 持久化對象的三種狀態。
分別為:瞬時狀態(Transient),持久化狀態(Persistent),離線狀態(Detached)。三種狀態下的對象的生命周期如下:
三種狀態的區別是:瞬時狀態的對象:沒有被session管理,在數據庫沒有;持久化狀態的對象:被session管理,在數據庫存在,當屬性發生改變,在清理緩存時,會自動和數據庫同步;離線狀態:沒有被session管理,但是在數據庫中存在。
5.測試工具Juit。
測試類需要繼承TestCase,編寫單元測試方法,方法名稱必須為test開頭,方法沒有參數沒有返回值,采用public修飾。其中在測試中,查詢對象時,使用get或者load兩種方法進行加載,這種方法的區別:get不支持延遲加載,而load默認情況下是支持延遲加載。並且get查詢對象不存在時,返回null;而load查詢對象不存在時,則拋出ObjectNotFoundException異常。
6.悲觀鎖和樂觀鎖解釋。
悲觀鎖為了解決並發性,跟操作系統中的進程中添加鎖的概念一樣。就是在整個過程中在事務提交之前或回滾之前,其他的進程是無法訪問這個資源的。悲觀鎖的實現方式有兩種:一種使用數據庫中的獨占鎖;另一種是在數據庫添加一個鎖的字段。hibernate中聲明鎖如下:
Account account = (Account)session.get(Account.class, 1, LockMode.UPGRADE);而net.sf.hibernate.LockMode類表示鎖模式,當取值LockMode.UPGRADE時,則表示使用悲觀鎖for update;而樂觀鎖是為了解決版本沖突的問題。就是在數據庫中添加version字段,每次更新時,則把自己的version與數據庫中的version進行比較,若是版本相比較低,則不允許進行修改更新。
7.H ibernate中的緩存機制。
緩存是什么呢?緩存是應用程序和數據庫之間的內存的一片區域。主要的目的是:為了減少對數據庫讀取的時間。當查詢數據時,首先在緩存中查詢,若存在,則直接取出,若不存在,然后再向數據庫中查詢。所以應該把經常訪問數據庫的數據放到緩存中,至於緩存中的數據如何不斷的置換,這也需要涉及一種淘汰數據的算法。
談到這個hibernate中的緩存,你想到了什么呢?剛才敘述緩存時,是否感覺很熟悉,感覺從哪也聽過似的。嗯呢,是呢,是很熟悉,寫着寫着就很熟悉,這個剛才的緩存以及緩存的置換算法就和計算機組成中的cache類似。
好吧,來回到我們hibernate中的緩存。
hibernate中的緩存可以分為兩種:一級緩存,也稱session緩存;二級緩存,是由sessionFactory管理。
那一級緩存和二級緩存有什么區別呢?區別的關鍵關於:緩存的生命周期,也就是緩存的范圍不同。
那首先介紹一下緩存的生命周期,也就是緩存的范圍。
1.事務緩存,每個事務都有自己的緩存,當事務結束,則緩存的生命周期同樣結束,正如上篇博客中我們提到,對數據庫的操作,增刪改查都是放到事務中的,和事務保持同步,若是事務提交完畢,一般是不允許是再次對數據庫進行操作。所以session是屬於事務緩存的。
2.應用緩存,一個應用程序中的緩存,也就是應用程序中的所有事務的緩存。只有當應用程序結束時,此時的緩存的額生命周期結束。二級緩存就是應用緩存。
3.集群緩存,被一台機器或多台機器的進程共享。
這下明白了一級緩存和二級緩存的區別了吧。那一級緩存和二級緩存的共同點是:都是緩存實體屬性,
二級緩存一般情況都是由第三方插件實現的。第三方插件如:
EHCache,JbossCache(是由Jboss開源組織提供的),osCache(open symphony),swarmCache。前三種對hibernate中的查詢緩存是支持的,后一種是不支持hibernate查詢緩存。
那什么是hibernate查詢緩存呢?
查詢緩存是用來緩存普通屬性的,對於實體對象而言,是緩存實體對象的id。