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源碼中幾個包的作用簡要介紹
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_r.*
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數據綁定
緩存管理
1.Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載。 Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。
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) 選擇合適的緩存插件,然後編輯該插件的配置文件。