Hibernate流行架構(gòu)淺析
http://developer.51cto.com/art/200909/152886.htm
這里介紹Hibernate架構(gòu)就允許Java中的對(duì)象-關(guān)系的持久性和查詢服務(wù)。Hibernate 對(duì)已經(jīng)熟悉了SQL 和JDBC API 的Java開(kāi)發(fā)者來(lái)或具有中度的學(xué)習(xí)曲線。
AD:
本文向大家介紹Hibernate架構(gòu),可能好多人還不了解Hibernate架構(gòu),沒(méi)有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。
用java來(lái)建立一個(gè)很有價(jià)值的web 應(yīng)用不是一個(gè)簡(jiǎn)單的任務(wù)。在架構(gòu)這個(gè)應(yīng)用時(shí)要考慮很多的因素和問(wèn)題。從更高的層次來(lái)看,開(kāi)發(fā)人員面臨著關(guān)于如何構(gòu)建用戶接口,何處駐留業(yè)務(wù)邏輯,以及如何 實(shí)現(xiàn)數(shù)據(jù)持久性這些問(wèn)題。這3層都有各自的問(wèn)題需要回答。而每一層又需要實(shí)現(xiàn)那些技術(shù)?應(yīng)用如何設(shè)計(jì)來(lái)進(jìn)行松散耦合并能進(jìn)行靈活變更?應(yīng)用架構(gòu)是否允許某 一層變更而不影響到其它的層次?應(yīng)用應(yīng)該如何處理容器一級(jí)的服務(wù)比如事務(wù)?
在為你的應(yīng)用創(chuàng)建一個(gè)架構(gòu)之前有許多問(wèn)題需要澄清。幸運(yùn)的是,有很多開(kāi)發(fā)者都意識(shí)到這個(gè)問(wèn)題,并建立了很多框架來(lái)解決這些問(wèn)題。一個(gè)良好的框架可以 讓開(kāi)發(fā)人員減輕重新建立解決復(fù)雜問(wèn)題方案的負(fù)擔(dān)和精力;它可以被擴(kuò)展以進(jìn)行內(nèi)部的定制化;并且有強(qiáng)大的用戶社區(qū)來(lái)支持它。框架通常能很好的解決一個(gè)問(wèn)題。 然而,你的應(yīng)用是分層的,可能每一個(gè)層都需要各自的框架。僅僅解決UI問(wèn)題并不意味著你能夠很好的將業(yè)務(wù)邏輯和持久性邏輯和UI 組件很好的耦合。例如,你不應(yīng)該使具有JDBC代碼的業(yè)務(wù)邏輯放入控制器之中,這不是控制器應(yīng)該提供的功能。一個(gè)UI 控制器應(yīng)該是輕量化的組件,由它代表對(duì)UI范圍之外的其它應(yīng)用層的服務(wù)調(diào)用。良好的框架自然地形成代碼分離的原則。更為重要的是,框架減輕了開(kāi)發(fā)人員從頭 構(gòu)建持久層代碼的精力,從而集中精力來(lái)應(yīng)用邏輯上,這對(duì)客戶端來(lái)說(shuō)更為重要。
本文討論了如何結(jié)合幾個(gè)著名的框架來(lái)達(dá)到松散耦合,如何設(shè)計(jì)你的架構(gòu),以及如何達(dá)到各個(gè)層次的一致性設(shè)計(jì)。面臨的挑戰(zhàn)是,將框架整合起來(lái),以使每一 層都向另外的層次以一種松散的方式來(lái)暴露接口,而不管底層功能使用的是什么技術(shù)。本文還討論整合3種著名開(kāi)源框架的一種策略。對(duì)表現(xiàn)層,我們使用 Struts;業(yè)務(wù)層使用Spring;對(duì)于持久層我們使用的是Hibernate架構(gòu)。你盡可以取代這里的某個(gè)框架而使用你喜歡的框架已達(dá)到同樣的效 果。
應(yīng)用層
許多設(shè)計(jì)良好的web 應(yīng)用,可以被按職責(zé)分為四層。這些層次是表現(xiàn)層、持久層、業(yè)務(wù)層、和領(lǐng)域模型層。每一個(gè)層次都有其獨(dú)特的職責(zé),不能把各自的功能與其它層次相混合。每一個(gè) 應(yīng)用層都應(yīng)該和其它層隔離開(kāi)來(lái),但允許使用接口在層間進(jìn)行通信。我們開(kāi)始來(lái)看看每個(gè)層,并討論一下它們各自都應(yīng)該提供什么和不應(yīng)該提供什么。
表現(xiàn)層
一個(gè)典型的web 應(yīng)用的末端是表現(xiàn)層。許多Java 開(kāi)發(fā)者都知道Struts 提供了什么東西。然而,太多時(shí)候,耦合代碼比如業(yè)務(wù)邏輯被放進(jìn)org.apache.struts.Action中。所以,我們先總結(jié)一下Struts 之類的框架應(yīng)該提供什么。下面就是Struts 的職責(zé)所在:
◆管理用戶的請(qǐng)求和響應(yīng)
◆提供一個(gè)控制起來(lái)將調(diào)用委托到業(yè)務(wù)邏輯和其他上游處理
◆將來(lái)自于拋出例外的其他層的例外處理到Struts Action 中
◆組裝可以在視圖中表現(xiàn)的模型對(duì)象
◆執(zhí)行UI 校驗(yàn)
下面是一些經(jīng)常可以使用Struts進(jìn)行編碼但是不應(yīng)該和表現(xiàn)層關(guān)聯(lián)的事情:
◆直接和數(shù)據(jù)庫(kù)交互,比如JDBC 調(diào)用
◆與應(yīng)用相關(guān)的業(yè)務(wù)邏輯和校驗(yàn)
◆事務(wù)管理
◆在表現(xiàn)層中引入這些類型的代碼將導(dǎo)致類型耦合和維護(hù)負(fù)擔(dān)。
持久層
一個(gè)典型Web應(yīng)用的另一端是持久層。這也是應(yīng)用中最容易很快失控的地方。開(kāi)發(fā)者通常低估了自己構(gòu)建自己的持久層框架的挑戰(zhàn)。一個(gè)定制的,內(nèi)部開(kāi)發(fā) 的持久層不僅需要大量的開(kāi)發(fā)時(shí)間,并且通常缺乏功能和難以管理。目前有許多解決這些問(wèn)題的開(kāi)源對(duì)象關(guān)系映射 (ORM) 框架。特別地,Hibernate架構(gòu)就允許Java中的對(duì)象-關(guān)系的持久性和查詢服務(wù)。Hibernate 對(duì)已經(jīng)熟悉了SQL 和JDBC API 的Java開(kāi)發(fā)者來(lái)或具有中度的學(xué)習(xí)曲線。Hibernate 的持久對(duì)象基于POJO和Java 群集(collections)。此外,使用Hibernate 不和你的IDE接口。下面列出了你需要在持久性框架中編寫的代碼類型:
存儲(chǔ)、更新和刪除存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息
高級(jí)的對(duì)象關(guān)系映射框架比如Hibernate支持大部分主流SQL數(shù)據(jù)庫(kù),它們支持父/子關(guān)系,事務(wù),繼承和多態(tài)。
下面是應(yīng)該在持久層避免的一些事情:
◆業(yè)務(wù)邏輯應(yīng)該置于應(yīng)用的更高層中。這里只允許數(shù)據(jù)訪問(wèn)方法。
◆不應(yīng)該使持久邏輯和表現(xiàn)邏輯耦 合。避免表現(xiàn)組件如JSP或者基于servlet的類中的邏輯直接和數(shù)據(jù)訪問(wèn)進(jìn)行通信。通過(guò)將持久性邏輯隔離在其自己的層中,應(yīng)用將具有更加靈活的修改性 而不影響到其他層的代碼。例如, Hibernate 可以使用其他持久框架和API代替,而不需要修改其它層中的代碼。
業(yè)務(wù)層
典型的Web應(yīng)用的中間組件一般是業(yè)務(wù)層和服務(wù)層。從編程的角度來(lái)說(shuō),service layer經(jīng)常被忽略。這種類型的代碼散布于UI表現(xiàn)層和持久層并不是不多見(jiàn)。這些都不是正確的地方因?yàn)樗鼘?dǎo)致了緊密耦合的應(yīng)用和難以維護(hù)的代碼。幸運(yùn)的 是,大多數(shù)框架都解決了這個(gè)問(wèn)題。這個(gè)空間內(nèi)最流行的兩個(gè)框架是Spring 和PicoContainer。它們都被視為是具有非常小的足跡(footprint)并且決定如何將你的對(duì)象整合在一起的微容器 (microcontainer)。這些框架都建立在一種叫做依賴性注入(dependency injection) (也稱控制反轉(zhuǎn)(inversion of control:IOC))的簡(jiǎn)單概念之上。我們將關(guān)注Spring中通過(guò)針對(duì)命名配置參數(shù)的bean屬性的setter 注入的使用。Spring 也允許一種更加高級(jí)的構(gòu)造器注入(constructor injection)形式作為setter injection 的可選替代。對(duì)象通過(guò)簡(jiǎn)單的XML 文件進(jìn)行連接,該配置文件包含對(duì)各種對(duì)象的引用,比如事務(wù)管理處理器(transaction management handler),對(duì)象工廠,包含業(yè)務(wù)邏輯的服務(wù)對(duì)象,以及數(shù)據(jù)訪問(wèn)對(duì)象(DAO)。我們隨后會(huì)用一些例子來(lái)澄清Spring中使用這些改變的方式。業(yè)務(wù) 層應(yīng)該負(fù)責(zé)下面的問(wèn)題:
◆處理應(yīng)用的業(yè)務(wù)邏輯和業(yè)務(wù)校驗(yàn)
◆管理事務(wù)
◆允許與其他層進(jìn)行交互的接口
◆管理業(yè)務(wù)級(jí)對(duì)象之間的依賴性
◆加入了表現(xiàn)和持久層之間的靈活性,以便它們不需要彼此進(jìn)行直接通信
◆從表現(xiàn)層暴露上下文給業(yè)務(wù)層以獲得業(yè)務(wù)服務(wù)
◆管理從業(yè)務(wù)層到表現(xiàn)層的實(shí)現(xiàn)
領(lǐng)域模型層
最后,因?yàn)槲覀円鉀Q實(shí)際的問(wèn)題的web應(yīng)用,我們需要一套在不同的層間移動(dòng)的對(duì)象。領(lǐng)域模型層包含的是表達(dá)實(shí)際業(yè)務(wù)對(duì)象的對(duì)象,比如Order, OrderLineItem, Product 等等。這一層允許能讓開(kāi)發(fā)者不再構(gòu)建和維護(hù)不必要的數(shù)據(jù)傳輸對(duì)象DTO來(lái)匹配其領(lǐng)域?qū)ο蟆@纾? Hibernate允許你讀取數(shù)據(jù)庫(kù)信息到一個(gè)領(lǐng)域?qū)ο蟮膶?duì)象圖中,以便你可以在離線的情況下將其表現(xiàn)在UI層中。這些對(duì)象可以被更新并跨過(guò)表現(xiàn)層發(fā)送回 去,然后進(jìn)行數(shù)據(jù)庫(kù)更新。另外,你不再需要將對(duì)象轉(zhuǎn)變成DTO,因?yàn)樗鼈冊(cè)诓煌膶娱g移動(dòng)時(shí)可能會(huì)丟失事務(wù)。這種模型允許Java 開(kāi)發(fā)者能夠以O(shè)O風(fēng)格的方式很自然的處理對(duì)象,而不用編寫額外的代碼。以上介紹Hibernate架構(gòu)