詳述Hibernate架構(gòu)(Architecture)
要學(xué)好Hibernate,首先要了解Hibernate架構(gòu),可能大家對(duì)Hibernate架構(gòu)還不太明白,沒(méi)有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你。
1. 架構(gòu)概況(Overview)
一個(gè)非常簡(jiǎn)要的Hibernate架構(gòu)的概要圖:
從這個(gè)圖可以看出,Hibernater使用數(shù)據(jù)庫(kù)和配置信息來(lái)為應(yīng)用程序提供持久化服務(wù)(以及持久的對(duì)象)。
我們來(lái)更詳細(xì)地看一下運(yùn)行時(shí)Hibernate架構(gòu)。由于Hibernate非常靈活,且支持?jǐn)?shù)種應(yīng)用方案,所以我們這只描述一下兩種極端的情況?!拜p型”的架構(gòu)方案,要求應(yīng)用程序提供自己的JDBC 連接并管理自己的事務(wù)。這種方案使用了Hibernate API的最小子集:
“全面解決”的架構(gòu)方案,將應(yīng)用層從底層的JDBC/JTA API中抽象出來(lái),而讓Hibernate來(lái)處理這些細(xì)節(jié)。
Heres some definitions of the objects in the diagrams: 圖中各個(gè)對(duì)象的定義如下:
SessionFactory (org.hibernate.SessionFactory)
針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,它也是線程安全的(不可變)。 它是生成Session的工廠,本身要用到ConnectionProvider。 該對(duì)象可以在進(jìn)程或集群的級(jí)別上,為那些事務(wù)之間可以重用的數(shù)據(jù)提供可選的二級(jí)緩存。
Session (org.hibernate.Session)
表示應(yīng)用程序與持久儲(chǔ)存層之間交互操作的一個(gè)單線程對(duì)象,此對(duì)象生存期很短。 其隱藏了JDBC連接,也是Transaction的工廠。 其會(huì)持有一個(gè)針對(duì)持久化對(duì)象的必選(第一級(jí))緩存,在遍歷對(duì)象圖或者根據(jù)持久化標(biāo)識(shí)查找對(duì)象時(shí)會(huì)用到。
持久的對(duì)象及其集合
帶有持久化狀態(tài)的、具有業(yè)務(wù)功能的單線程對(duì)象,此對(duì)象生存期很短。 這些對(duì)象可以是普通的JavaBeans/POJO,唯一特殊的是他們正與(僅僅一個(gè))Session相關(guān)聯(lián)。 這個(gè)Session被關(guān)閉的同時(shí),這些對(duì)象也會(huì)脫離持久化狀態(tài),可以被應(yīng)用程序的任何層自由使用。 (例如,用作跟表示層打交道的數(shù)據(jù)傳輸對(duì)象data transfer object。)
瞬態(tài)(transient)以及脫管(detached)的對(duì)象及其集合
持久類的沒(méi)有與Session相關(guān)聯(lián)的實(shí)例。 他們可能是在被應(yīng)用程序?qū)嵗?,尚未進(jìn)行持久化的對(duì)象。 也可能是因?yàn)閷?shí)例化他們的Session已經(jīng)被關(guān)閉而脫離持久化的對(duì)象。
事務(wù)Transaction (org.hibernate.Transaction)
(可選的)應(yīng)用程序用來(lái)指定原子操作單元范圍的對(duì)象,它是單線程的,生存期很短。 它通過(guò)抽象將應(yīng)用從底層具體的JDBC、JTA以及CORBA事務(wù)隔離開。 某些情況下,一個(gè)Session之內(nèi)可能包含多個(gè)Transaction對(duì)象。 盡管是否使用該對(duì)象是可選的,但是事務(wù)邊界的開啟與關(guān)閉(無(wú)論是使用底層的API還是使用Transaction對(duì)象)是必不可少的。
ConnectionProvider (org.hibernate.connection.ConnectionProvider)
(可選的)生成JDBC連接的工廠(同時(shí)也起到連接池的作用)。 它通過(guò)抽象將應(yīng)用從底層的Datasource或DriverManager隔離開。 僅供開發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
TransactionFactory (org.hibernate.TransactionFactory)
(可選的)生成Transaction對(duì)象實(shí)例的工廠。 僅供開發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
擴(kuò)展接口
Hibernate提供了很多可選的擴(kuò)展接口,你可以通過(guò)實(shí)現(xiàn)它們來(lái)定制你的持久層的行為。 具體請(qǐng)參考API文檔。
在一個(gè)“輕型”的架構(gòu)中,應(yīng)用程序可能繞過(guò) Transaction/TransactionFactory 以及 ConnectionProvider 等API直接跟JTA或JDBC打交道。
2. 實(shí)例狀態(tài)
一個(gè)持久化類的實(shí)例可能處于三種不同狀態(tài)中的某一種。 這三種狀態(tài)的定義則與所謂的持久化上下文(persistence context)有關(guān)。Hibernate的Session對(duì)象就是這個(gè)所謂的持久化上下文:
◆瞬態(tài)(transient)該實(shí)例從未與任何持久化上下文關(guān)聯(lián)過(guò)。它沒(méi)有持久化標(biāo)識(shí)(相當(dāng)于主鍵)。
◆持久(persistent) 實(shí)例目前與某個(gè)持久化上下文有關(guān)聯(lián)。 它擁有持久化標(biāo)識(shí)(相當(dāng)于主鍵),并且可能在數(shù)據(jù)庫(kù)中有一個(gè)對(duì)應(yīng)的行。 對(duì)于某一個(gè)特定的持久化上下文,Hibernate保證持久化標(biāo)識(shí)與Java標(biāo)識(shí)(其值代表對(duì)象在內(nèi)存中的位置)等價(jià)。
◆脫管(detached) 實(shí)例曾經(jīng)與某個(gè)持久化上下文發(fā)生過(guò)關(guān)聯(lián),不過(guò)那個(gè)上下文被關(guān)閉了, 或者這個(gè)實(shí)例是被序列化(serialize)到這個(gè)進(jìn)程來(lái)的。 它擁有持久化標(biāo)識(shí),并且在數(shù)據(jù)庫(kù)中可能存在一個(gè)對(duì)應(yīng)的行。 對(duì)于脫管狀態(tài)的實(shí)例,Hibernate不保證任何持久化標(biāo)識(shí)和Java標(biāo)識(shí)的關(guān)系。
3. JMX整合
JMX是管理Java組件(Java components)的J2EE規(guī)范。 Hibernate 可以通過(guò)一個(gè)JMX標(biāo)準(zhǔn)服務(wù)來(lái)管理。 在這個(gè)發(fā)行版本中,我們提供了一個(gè)MBean接口的實(shí)現(xiàn),即 org.hibernate.jmx.HibernateService。
想要看如何在JBoss應(yīng)用服務(wù)器上將Hibernate部署為一個(gè)JMX服務(wù)的例子,您可以參考JBoss用戶指南。 我們現(xiàn)在說(shuō)一下在Jboss應(yīng)用服務(wù)器上,使用JMX來(lái)部署Hibernate的好處:
Session管理: Hibernate的Session對(duì)象的生命周期可以 自動(dòng)跟一個(gè)JTA事務(wù)邊界綁定。這意味著你無(wú)需手工開關(guān)Session了, 這項(xiàng) 工作會(huì)由JBoss EJB 攔截器來(lái)完成。你再也不用擔(dān)心你的代碼中的事務(wù)邊界了(除非你想利用Hibernate提供 的Transaction API來(lái)自己寫一個(gè)便于移植的的持久層)。 你現(xiàn)在要通過(guò) HibernateContext來(lái)操作Session了。
HAR 部署: 通常情況下,你會(huì)使用JBoss的服務(wù)部署描述符(在EAR或/和SAR文件中)來(lái)部署Hibernate JMX服務(wù)。 這種部署方式支持所有常見(jiàn)的Hibernate SessionFactory的配置選項(xiàng)。 不過(guò),你需在部署描述符中,列出你所有的映射文件的名字。如果你使用HAR部署方式, JBoss 會(huì)自動(dòng)探測(cè)出你的HAR文件中所有的映射文件。
這些選項(xiàng)更多的描述,請(qǐng)參考JBoss 應(yīng)用程序用戶指南。
將Hibernate以部署為JMX服務(wù)的另一個(gè)好處,是可以查看Hibernate的運(yùn)行時(shí)統(tǒng)計(jì)信息?!?Hibernate的統(tǒng)計(jì)(statistics)機(jī)制 ”.
4. 對(duì)JCA的支持
Hibernate也可以被配置為一個(gè)JCA連接器(JCA connector)。更多信息請(qǐng)參看網(wǎng)站。請(qǐng)注意,Hibernate對(duì)JCA的支持,仍處于實(shí)驗(yàn)性質(zhì)。
【編輯推薦】