《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于Hibernate框架的數(shù)據(jù)持久層架構(gòu)設(shè)計及應(yīng)用
基于Hibernate框架的數(shù)據(jù)持久層架構(gòu)設(shè)計及應(yīng)用
來源:微型機與應(yīng)用2011年第15期
劉德山,楊彬彬
(遼寧師范大學(xué) 計算機與信息技術(shù)學(xué)院,,遼寧 大連 116029)
摘要: 數(shù)據(jù)持久層在Web應(yīng)用系統(tǒng)開發(fā)中,,主要應(yīng)用于業(yè)務(wù)邏輯和數(shù)據(jù)邏輯的松散耦合,,提高軟件可重用性。分析了Hibernate框架及DAO設(shè)計模式的工作原理,,設(shè)計了基于Hibernate框架采用DAO設(shè)計模式的數(shù)據(jù)持久層架構(gòu)體系,,并通過具體Web應(yīng)用,闡述了數(shù)據(jù)持久層架構(gòu)的具體實現(xiàn)過程,。
Abstract:
Key words :

摘  要: 數(shù)據(jù)持久層在Web應(yīng)用系統(tǒng)開發(fā)中,,主要應(yīng)用于業(yè)務(wù)邏輯和數(shù)據(jù)邏輯的松散耦合,提高軟件可重用性,。分析了Hibernate框架及DAO設(shè)計模式的工作原理,,設(shè)計了基于Hibernate框架采用DAO設(shè)計模式的數(shù)據(jù)持久層架構(gòu)體系,并通過具體Web應(yīng)用,,闡述了數(shù)據(jù)持久層架構(gòu)的具體實現(xiàn)過程,。
關(guān)鍵詞: 數(shù)據(jù)持久化;Hibernate框架,;DAO模式;O/R映射

 在Web應(yīng)用系統(tǒng)中,,Web服務(wù)器作為連接客戶端和數(shù)據(jù)庫服務(wù)器的一個中間層,,既要對客戶端提出的請求進(jìn)行業(yè)務(wù)分析和處理,又要訪問數(shù)據(jù)庫并與數(shù)據(jù)庫進(jìn)行交互,。當(dāng)業(yè)務(wù)邏輯代碼中包含數(shù)據(jù)訪問代碼時,,將給系統(tǒng)的修改和維護(hù)帶來很大困難,同時也不利于以后在開發(fā)類似系統(tǒng)中進(jìn)行大粒度的軟件重用,。因此有必要把功能層劃分為業(yè)務(wù)邏輯層和持久層,。業(yè)務(wù)邏輯層專注于業(yè)務(wù)邏輯的分析和處理,持久層專注于與數(shù)據(jù)庫交互進(jìn)行數(shù)據(jù)的持久化工作,,并提供一個標(biāo)準(zhǔn)的接口供業(yè)務(wù)邏輯層調(diào)用,。通過這樣一個層次的劃分,實現(xiàn)了高效,、清晰的專業(yè)分工和職責(zé)劃分,,既實現(xiàn)了功能層中業(yè)務(wù)邏輯和數(shù)據(jù)邏輯之間的松耦合關(guān)系,又利于系統(tǒng)的修改,、維護(hù)和軟件重用[1],。
 目前的J2EE應(yīng)用系統(tǒng)開發(fā)中已經(jīng)存在不少框架。在系統(tǒng)架構(gòu)分析時,如何應(yīng)用已有框架為應(yīng)用系統(tǒng)量身定做一個合適的架構(gòu),,對J2EE設(shè)計開發(fā)者提出了挑戰(zhàn),。本文基于Hibernate框架采用DAO設(shè)計模式,設(shè)計了數(shù)據(jù)持久層架構(gòu),。并將其應(yīng)用于問卷調(diào)查系統(tǒng),,實現(xiàn)了業(yè)務(wù)邏輯和數(shù)據(jù)邏輯的松散耦合,提高了系統(tǒng)的開發(fā)效率和軟件重用性,。
1 Hibernate技術(shù)
1.1 Hibernate框架

 Hibernate是采用ORM映射機制進(jìn)行持久層數(shù)據(jù)開發(fā)的工具,,它是Java應(yīng)用程序和關(guān)系數(shù)據(jù)庫中間的橋梁,負(fù)責(zé)對Java對象和關(guān)系型數(shù)據(jù)之間映射[2],。其架構(gòu)體系如圖1所示,。

 Hibernate內(nèi)部封裝JDBC進(jìn)行訪問數(shù)據(jù)庫操作,其向上層應(yīng)用對象提供面向?qū)ο蟮臄?shù)據(jù)庫訪問API,,使開發(fā)者能充分運用面向?qū)ο蟮木幊趟季S操作數(shù)據(jù)庫,,而無需關(guān)心底層數(shù)據(jù)庫操作。Hibernate自身通過hibernate.cfg.xml和類的映射文件將類和數(shù)據(jù)庫相映射,,應(yīng)用程序通過Hibernate及持久化對象類直接訪問底層數(shù)據(jù)庫,。
1.2 Hibernate核心接口
 利用Hibernate進(jìn)行數(shù)據(jù)持久化操作,至少會用到下列核心接口:Configuration接口負(fù)責(zé)配置啟動Hibernate并創(chuàng)建SessionFactory對象,;SessionFactory接口產(chǎn)生Session實例的工廠類,,負(fù)責(zé)初始化Hibernate并創(chuàng)建Session對象;Session接口是Hibernate進(jìn)行持久化操作的基礎(chǔ),,相當(dāng)于JDBC中的Connection對象所起的作用,。Session提供了一系列的持久化操作方法,如保存,、更新,、刪除、查詢等,;Transaction接口負(fù)責(zé)管理事務(wù),;Query和 Criteria接口負(fù)責(zé)執(zhí)行數(shù)據(jù)庫查詢[3]。
2 DAO設(shè)計模式
 DAO(Data Access Object)模式稱為數(shù)據(jù)訪問對象模式,,是Java EE核心模式之一,,其主要的功能是在業(yè)務(wù)核心方法和具體數(shù)據(jù)源之間再增加一層DAO接口及其實現(xiàn)類。該模式的本質(zhì)是向外部提供一個訪問數(shù)據(jù)源的統(tǒng)一接口,,對外隱藏操作數(shù)據(jù)源的實現(xiàn)細(xì)節(jié),,以此實現(xiàn)業(yè)務(wù)邏輯層與DB的解耦[4]。這是因為在實際的應(yīng)用過程中,,應(yīng)用程序所面對的數(shù)據(jù)源往往是多種多樣的,,不同數(shù)據(jù)源的連接方式,、數(shù)據(jù)訪問方式會有明顯差異,導(dǎo)致了需要訪問數(shù)據(jù)源的組件的代碼實現(xiàn)方式與數(shù)據(jù)源的類型有著密切的關(guān)系,,組件和數(shù)據(jù)源之間的這種緊耦合關(guān)系也就導(dǎo)致了整個應(yīng)用系統(tǒng)難以在不同數(shù)據(jù)源之間進(jìn)行遷移,。使用了DAO模式后,即使系統(tǒng)需要進(jìn)行數(shù)據(jù)源的遷移,,也只需在DAO模式內(nèi)部進(jìn)行數(shù)據(jù)源訪問代碼的修改,,而不會涉及上層調(diào)用代碼,從而提高了軟件可維護(hù)性,。
3 數(shù)據(jù)持久層架構(gòu)設(shè)計及實現(xiàn)
3.1 數(shù)據(jù)持久層框架設(shè)計

 在應(yīng)用程序和數(shù)據(jù)庫之間構(gòu)建數(shù)據(jù)持久層,,可降低J2EE應(yīng)用與數(shù)據(jù)庫的耦合度,并簡化程序開發(fā),?;贖ibernate框架采用DAO模式設(shè)計的數(shù)據(jù)持久層整體架構(gòu)如圖2所示。

 

 

 業(yè)務(wù)邏輯是整個框架的業(yè)務(wù)處理的核心部分,,由業(yè)務(wù)邏輯接口,、接口實現(xiàn)類和配置文件等組成。它接收控制層的各類調(diào)用請求,,控制著系統(tǒng)邏輯的實現(xiàn)和處理,,并通過調(diào)用數(shù)據(jù)持久層的DAO接口完成數(shù)據(jù)的存取操作。業(yè)務(wù)邏輯接口向控制層或其他業(yè)務(wù)邏輯接口實現(xiàn)類提供各種業(yè)務(wù)邏輯接口方法,,接口實現(xiàn)類則對這些己定義的接口進(jìn)行具體實現(xiàn),。
 數(shù)據(jù)持久層使用DAO來抽象和封裝所有對數(shù)據(jù)源的訪問,DAO管理著數(shù)據(jù)源的連接以便檢索和存儲數(shù)據(jù),,DAO通過DAO工廠管理,,DAO工廠負(fù)責(zé)生成DAO組件實例,并維護(hù)DAO實例,;業(yè)務(wù)邏輯組件不與DAO組件的實現(xiàn)類耦合,只與DAO組件的接口耦合,;DAO實現(xiàn)類中封裝Hibernate API來完成與持久化類相關(guān)的業(yè)務(wù)邏輯操作,。
 Hibernate配置文件的主要工作是進(jìn)行SessionFactory配置、關(guān)系型數(shù)據(jù)庫“方言”與加載持久化類對應(yīng)的映射文件等,。映射文件用來聲明Hibernate中持久化類的屬性與數(shù)據(jù)庫對應(yīng)表之間字段的映射關(guān)系,。
 數(shù)據(jù)持久化層架構(gòu)的操作流程為:業(yè)務(wù)邏輯模塊調(diào)用DAOFactory,DAOFactory生成相應(yīng)的DAO接口及實現(xiàn)類,,DAO實現(xiàn)類中封裝Hibernate API來訪問持久化類,,通過O/R映射文件聲明持久化類與關(guān)系數(shù)據(jù)庫的映射,最終實現(xiàn)對數(shù)據(jù)庫的操作,。
3.2 數(shù)據(jù)持久層框架的應(yīng)用——解決方案及實現(xiàn)
 本設(shè)計的數(shù)據(jù)持久層架構(gòu),,作為數(shù)據(jù)持久層解決方案應(yīng)用于問卷調(diào)查系統(tǒng),最大限度地降低了系統(tǒng)內(nèi)部各模塊、子系統(tǒng)之間的耦合性,,保證了持久層的業(yè)務(wù)邏輯層相對穩(wěn)定,,基本不需要持久層的調(diào)整改變而進(jìn)行邏輯層的變動。問卷調(diào)查系統(tǒng)由問題管理,、問卷管理,、統(tǒng)計管理、用戶管理,、學(xué)生信息管理等模塊構(gòu)成,,其數(shù)據(jù)持久層的具體組織結(jié)構(gòu)如圖3所示[5]。

4 數(shù)據(jù)持久層的實現(xiàn)
4.1 持久化類及對象/關(guān)系映射文件
4.1.1 持久化類

 持久化類的對象PO(Persistenct Object)是一個簡單 Java對象(POJO),,一個PO代表了與數(shù)據(jù)庫表中某條記錄相對應(yīng)的Hibernate實體,,PO的變化在事務(wù)提交時反映到實際的數(shù)據(jù)庫表中。Hibernate中的持久化類符合JavaBean的規(guī)范,,包括一些屬性和對屬性的訪問方法,。圖4是問卷調(diào)查系統(tǒng)中Question實體類的模型圖[6]??梢钥闯?,除了無意義的主屬性只能被獲取以外,每一個屬性都有被外部對象獲取(get)和設(shè)置(set)兩種方法,,通過它們可以獲得對象的屬性值并實現(xiàn)對象之間的導(dǎo)航,。


4.1.2 對象/關(guān)系映射文件
 映射文件用一個XML格式的映射描述文檔來聲明Hibernate中持久化類的屬性與數(shù)據(jù)庫對應(yīng)表之間字段的映射關(guān)系,該文件中聲明的屬性名稱要與對應(yīng)數(shù)據(jù)表中的字段名稱相同,,同時也要與持久化類中所包含的屬性名稱相同,。
4.2 Hibernate配置
 為了用Hibernate進(jìn)行持久化實現(xiàn),還需要在應(yīng)用程序的包里放置一個配置文件,,以便Hibernate能正確地完成數(shù)據(jù)庫連接等各種配置和初始化,。由于映射文件可以在XML格式的配置文件中進(jìn)行聲明,在程序中不必調(diào)用Configuration類的addClass方法來加載映射文件,,因此這種格式的配置文件可以提高應(yīng)用程序的可維護(hù)性,。
4.3 數(shù)據(jù)持久層的DAO接口及實現(xiàn)類
 數(shù)據(jù)持久化層采用Hibernate作為中間件,使用DAO設(shè)計模式實現(xiàn)對數(shù)據(jù)庫的訪問,。DAO模式的實現(xiàn)包括DAO接口和DAO實現(xiàn)類兩部分,。DAO接口負(fù)責(zé)定義訪問特定持久化類所對應(yīng)的抽象業(yè)務(wù)邏輯方法;DAO實現(xiàn)類負(fù)責(zé)利用Hibernate API實現(xiàn)DAO接口所定義的抽象方法的具體實現(xiàn),。
 問卷調(diào)查系統(tǒng)在實現(xiàn)DAO模式時,,首先創(chuàng)建了HibernateBasicDao,該類繼承Spring框架提供的HibernateDaoSupport類,,HibernateBasicDao類封裝了對數(shù)據(jù)庫持久化的操作,,任何它的子類只要使用它的方法就可以實現(xiàn)對數(shù)據(jù)庫的持久化操作,。最后使每個DAO實現(xiàn)類都繼承HibernateBasicDao類實現(xiàn)數(shù)據(jù)庫的持久化操作。
 圖5描述了問題DAO接口及其實現(xiàn)類,,它封裝了對問題的基本操作,。其中,delete方法刪除問題信息,,getQuestionById方法通過question的Id獲得,,getQuestionInCurPape方法通過當(dāng)前頁數(shù)獲得question的具體類,query方法更新問題信息等,。限于篇幅,,其他DAO接口及實現(xiàn)類的設(shè)計不一一給出。

 在基于J2EE的應(yīng)用中,,系統(tǒng)的數(shù)據(jù)持久層代表著某個系統(tǒng)中一個相對獨立界限明確的邏輯層次,,在這個層次中,將數(shù)據(jù)的使用者和數(shù)據(jù)實體相關(guān)聯(lián),,負(fù)責(zé)對數(shù)據(jù)庫存儲數(shù)據(jù),,同時也負(fù)責(zé)數(shù)據(jù)的檢索、更新和刪除,,實現(xiàn)數(shù)據(jù)的讀取和持久化操作,。本文運用Hibernate框架技術(shù)設(shè)計了一套數(shù)據(jù)持久層架構(gòu)體系,并將其作為數(shù)據(jù)持久層解決方案應(yīng)用于問卷調(diào)查系統(tǒng),。實踐結(jié)果表明,,數(shù)據(jù)持久層架構(gòu)的應(yīng)用,降低了數(shù)據(jù)持久邏輯與業(yè)務(wù)邏輯的耦合度,,簡化了開發(fā)過程,,優(yōu)化了數(shù)據(jù)訪問操作,增強了系統(tǒng)擴(kuò)展性和可維護(hù)性,。
參考文獻(xiàn)
[1] 郭善飛.基于J2EE的數(shù)據(jù)持久層組件的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),,2009.
[2] 張飛,張建.基于Spring與Hibernate的數(shù)據(jù)庫訪問技術(shù)研究[J].計算機工程與設(shè)計,,2009,,30(7):1669.
[3] 汪萌,曲俊華.基于Hibernate技術(shù)的持久層解決方案及實現(xiàn)[J].計算機系統(tǒng)應(yīng)用,,2010,19(3):155.
[4] 歐陽宏基.一種基于DAO設(shè)計模式與Hibernate框架的數(shù)據(jù)持久化層模型[J].微計算機應(yīng)用,,2009,,30(3):36-37.
[5] 嚴(yán)海.基于Struts+Spring+Hibernate框架構(gòu)建WEB應(yīng)用的設(shè)計與實現(xiàn)[D].西安:西安電子科技大學(xué).2010.
[6] 吳京慧.基于Hibernate對象持久化Web應(yīng)用的研究[J].計算機應(yīng)用與軟件,2009,,26(2):90-91.
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。