Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序使用,也能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。 Hibernate的核心接口一共有5個,分別爲:Session、SessionFactory、Transaction、Query和 Configuration。這5個核心接口在任何開發中都會用到。經過這些接口,不只能夠對持久化對象進行存取,還可以進行事務控制。下面對這五的核心接口分別加以介紹。 ·Session接口:Session 接口負責執行被持久化對象的CRUD操做(CRUD的任務是完成與數據庫的交流,包含了不少常見的SQL語句。)。但須要注意的是Session對象是非線程安全的。同時,Hibernate的session不一樣於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是 Hibernate中的session,而之後會將HttpSesion對象稱爲用戶session。 ·SessionFactory接口:SessionFactroy 接口負責初始化Hibernate。它充當數據存儲源的代理,並負責建立Session對象。這裏用到了工廠模式。須要注意的是 SessionFactory並非輕量級的,由於通常狀況下,一個項目一般只須要一個SessionFactory就夠,當須要操做多個數據庫時,能夠爲每一個數據庫指定一個SessionFactory。 ·Configuration接口:Configuration接口負責配置並啓動Hibernate,建立SessionFactory對象。在Hibernate的啓動的過程當中,Configuration類的實例首先定位映射文檔位置、讀取配置,而後建立SessionFactory對象。 ·Transaction接口:Transaction接口負責事務相關的操做。它是可選的,開發人員也能夠設計編寫本身的底層事務處理代碼。 ·Query和Criteria接口:Query和Criteria接口負責執行各類數據庫查詢。它可使用HQL語言或SQL語句兩種表達方式。 Hibernate主鍵介紹 Assigned Assigned方式由程序生成主鍵值,而且要在save()以前指定不然會拋出異常 特色:主鍵的生成值徹底由用戶決定,與底層數據庫無關。用戶須要維護主鍵值,在調用session.save()以前要指定主鍵值。 Hilo Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,而後把算法獲得的兩個值拼接起來做爲數據庫中的惟一主鍵。Hilo方式須要額外的數據庫表和字段提供高位值來源。默認請況下使用的表是 hibernate_unique_key,默認字段叫做next_hi。next_hi必須有一條記錄不然會出現錯誤。 特色:須要額外的數據庫表的支持,能保證同一個數據庫中主鍵的惟一性,但不能保證多個數據庫之間主鍵的惟一性。Hilo主鍵生成方式由 Hibernate 維護,因此Hilo方式與底層數據庫無關,但不該該手動修改hi/lo算法使用的表的值,不然會引發主鍵重複的異常。 Increment Increment方式對主鍵值採起自動增加的方式生成新的主鍵值,但要求底層數據庫的支持Sequence。如Oracle,DB2等。須要在映射文件xxx.hbm.xml中加入Increment標誌符的設置。 特色:由Hibernate自己維護,適用於全部的數據庫,不適合多進程併發更新數據庫,適合單一進程訪問數據庫。不能用於羣集環境。 Identity Identity當時根據底層數據庫,來支持自動增加,不一樣的數據庫用不一樣的主鍵增加方式。 特色:與底層數據庫有關,要求數據庫支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的數據庫有MySql、SQL Server、DB二、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,使用較爲方便,但不便於在不一樣的數據庫之間移植程序。 Sequence Sequence須要底層數據庫支持Sequence方式,例如Oracle數據庫等 特色:須要底層數據庫的支持序列,支持序列的數據庫有DB二、PostgreSql、Qracle、SAPDb等在不一樣數據庫之間移植程序,特別從支持序列的數據庫移植到不支持序列的數據庫須要修改配置文件 Native Native主鍵生成方式會根據不一樣的底層數據庫自動選擇Identity、Sequence、Hilo主鍵生成方式 特色:根據不一樣的底層數據庫採用不一樣的主鍵生成方式。因爲Hibernate會根據底層數據庫採用不一樣的映射方式,所以便於程序移植,項目中若是用到多個數據庫時,可使用這種方式。 UUID UUID使用128位UUID算法生成主鍵,可以保證網絡環境下的主鍵惟一性,也就可以保證在不一樣數據庫及不一樣服務器下主鍵的惟一性。 特色;可以保證數據庫中的主鍵惟一性,生成的主鍵佔用比較多的存貯空間 Foreign GUID Foreign用於一對一關係中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的惟一性,支持SQL Server和MySQL Hibernate源碼中幾個包的做用簡要介紹 net.sf.hibernate.* 該包的類基本上都是接口類和異常類 net.sf.hibernate.cache.* JCS的實現類 net.sf.hibernate.cfg.* 配置文件讀取類 net.sf.hibernate.collection.* Hibernate集合接口實現類,例如List,Set,Bag等等,Hibernate之因此要自行編寫集合接口實現類是爲了支持lazy loading net.sf.hibernate.connection.* 幾個數據庫鏈接池的Provider net.sf.hibernate.dialect.* 支持多種數據庫特性,每一個Dialect實現類表明一種數據庫,描述了該數據庫支持的數據類型和其它特色,例如是否有AutoIncrement,是否有Sequence,是否有分頁sql等等 net.sf.hibernate.eg.* Hibernate文檔中用到的例子 net.sf.hibernate.engine.* 這個包的類做用比較散 net.sf.hibernate.expression.* HQL支持的表達式 net.sf.hibernate.hq.* HQL實現 net.sf.hibernate.id.* ID生成器 net.sf.hibernate.impl.* 最核心的包,一些重要接口的實現類,若是Session,SessionFactory,Query等 net.sf.hibernate.jca.* JCA支持,把Session包裝爲支持JCA的接口實現類 net.sf.hibernate.jmx.* 我不懂JMX,只知道JMX是用來編寫App Server的管理程序的,大概是JMX部分接口的實現,使得App Server能夠經過JMX接口管理Hibernate net.sf.hibernate.loader.* 也是很核心的包,主要是生成sql語句的 net.sf.hibernate.lob.* Blob和Clob支持 net.sf.hibernate.mapping.* hbm文件的屬性實現 net.sf.hibernate.metadata.* PO的Meta實現 net.sf.hibernate.odmg.* ODMG是一個ORM標準,這個包是ODMG標準的實現類 net.sf.hibernate.persister.* 核心包,實現持久對象和表之間的映射 net.sf.hibernate.proxy.* Proxy和Lazy Loading支持 net.sf.hibernate.ps.* 該包是PreparedStatment Cache net.sf.hibernate.sql.* 生成JDBC sql語句的包 net.sf.hibernate.test.* 測試類,你能夠用junit來測試Hibernate net.sf.hibernate.tool.hbm2ddl.* 用hbm配置文件生成DDL net.sf.hibernate.transaction.* Hibernate Transaction實現類 net.sf.hibernate.type.* Hibernate中定義的持久對象的屬性的數據類型 net.sf.hibernate.util.* 一些工具類,做用比較散 net.sf.hibernate.xml.* XML數據綁定 緩存管理 Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,通常狀況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存能夠進行配置和更改,而且能夠動態加載和卸載。 Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。 1. 一級緩存和二級緩存的比較:第一級緩存 第二級緩存 存放數據的形式 相互關聯的持久化對象 對象的散裝數據 緩存的範圍事務範圍,每一個事務都有單獨的第一級緩存進程範圍或集羣範圍,緩存被同一個進程或集羣範圍內的全部事務共享併發訪問策略因爲每一個事務都擁有單獨的第一級緩存,不會出現併發問題,無需提供併發訪問策略因爲多個事務會同時訪問第二級緩存中相同數據,所以必須提供適當的併發訪問策略,來保證特定的事務隔離級別數據過時策略沒有提供數據過時策略。處於一級緩存中的對象永遠不會過時,除非應用程序顯式清空緩存或者清除特定的對象必須提供數據過時策略,如基於內存的緩存中的對象的最大數目,容許對象處於緩存中的最長時間,以及容許對象處於緩存中的最長空閒時間物理存儲介質內存內存和硬盤。對象的散裝數據首先存放在基於內在的緩存中,當內存中對象的數目達到數據過時策略中指定上限時,就會把其他的對象寫入基於硬盤的緩存中。緩存的軟件實如今Hibernate的Session的實現中包含了緩存的實現由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用於把特定的緩存插件集成到Hibernate中。啓用緩存的方式只要應用程序經過Session接口來執行保存、更新、刪除、加載和查詢數據庫數據的操做,Hibernate就會啓用第一級緩存,把數據庫中的數據以對象的形式拷貝到緩存中,對於批量更新和批量刪除操做,若是不但願啓用第一級緩存,能夠繞過Hibernate API,直接經過JDBC API來執行指操做。用戶能夠在單個類或類的單個集合的粒度上配置第二級緩存。若是類的實例被常常讀但不多被修改,就能夠考慮使用第二級緩存。只有爲某個類或集合配置了第二級緩存,Hibernate在運行時纔會把它的實例加入到第二級緩存中。用戶管理緩存的方式第一級緩存的物理介質爲內存,因爲內存容量有限,必須經過恰當的檢索策略和檢索方式來限制加載對象的數目。Session的 evit()方法能夠顯式清空緩存中特定對象,但這種方法不值得推薦。第二級緩存的物理介質能夠是內存和硬盤,所以第二級緩存能夠存放大量的數據,數據過時策略的maxElementsInMemory屬性值能夠控制內存中的對象數目。管理第二級緩存主要包括兩個方面:選擇須要使用第二級緩存的持久類,設置合適的併發訪問策略:選擇緩存適配器,設置合適的數據過時策略。 2. 一級緩存的管理:當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,若是在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。 Session爲應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中全部持久化對象。 3. 二級緩存的管理: 3.1. Hibernate的二級緩存策略的通常過程以下: 1) 條件查詢的時候,老是發出一條select * from table_name where …. (選擇全部字段)這樣的SQL語句查詢數據庫,一次得到全部的數據對象。 2) 把得到的全部數據對象根據ID放入到第二級緩存中。 3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,若是配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。 4) 刪除、更新、增長數據的時候,同時更新緩存。 Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無做用。爲此,Hibernate提供了針對條件查詢的Query Cache。 3.2. 什麼樣的數據適合存放到第二級緩存中? 1 不多被修改的數據 2 不是很重要的數據,容許出現偶爾併發的數據 3 不會被併發訪問的數據 4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其餘類的實例引用,實例極少或者歷來不會被修改。 3.3. 不適合存放到第二級緩存的數據? 1 常常被修改的數據 2 財務數據,絕對不容許出現併發 3 與其餘應用共享的數據。 3.4. 經常使用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種經常使用的緩存插件: l EhCache:可做爲進程範圍的緩存,存放數據的物理介質能夠是內存或硬盤,對Hibernate的查詢緩存提供了支持。 l OSCache:可做爲進程範圍的緩存,存放數據的物理介質能夠是內存或硬盤,提供了豐富的緩存數據過時策略,對Hibernate的查詢緩存提供了支持。 l SwarmCache:可做爲羣集範圍內的緩存,但不支持Hibernate的查詢緩存。 l JBossCache:可做爲羣集範圍內的緩存,支持事務型併發訪問策略,對Hibernate的查詢緩存提供了支持。 3.5. 配置二級緩存的主要步驟: 1) 選擇須要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。這是最值得認真考慮的步驟。 2) 選擇合適的緩存插件,而後編輯該插件的配置文件。