Hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究_第1頁
Hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究_第2頁
Hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究_第3頁
Hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究_第4頁
Hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 hibernate框架在電子商務(wù)網(wǎng)站中的應(yīng)用研究摘要在如今的軟件開發(fā)領(lǐng)域,面向?qū)ο蠹夹g(shù)、數(shù)據(jù)庫技術(shù)以及組件復(fù)用技術(shù)以及被廣泛應(yīng)用。面向?qū)ο蠹夹g(shù)作為接機(jī)真實(shí)客觀世界的開發(fā)概念,使程序代碼更易讀,設(shè)計(jì)更合理。軟件體系架構(gòu)的目的是為了實(shí)現(xiàn)軟件復(fù)用。軟件復(fù)用的思想是將軟件看成是由不同功能部件組成的有機(jī)體,每一個(gè)組件可以被設(shè)計(jì)成能夠完成同類工作的通用工具。一個(gè)合理的體系架構(gòu)可以大大提高系統(tǒng)的可擴(kuò)充性、可維護(hù)性,同時(shí)也便于任務(wù)的劃分。另外這種穩(wěn)定的體系架構(gòu)還可以移植到其他的系統(tǒng)中。在實(shí)際的系統(tǒng)開發(fā)中面向?qū)ο蠹夹g(shù)與關(guān)系數(shù)據(jù)庫技術(shù)是主要技術(shù),開發(fā)人員通常把這兩種技術(shù)的結(jié)合應(yīng)用作為首選,可是面向?qū)ο蠹夹g(shù)是基于

2、對象的相關(guān)理論而關(guān)系數(shù)據(jù)庫技術(shù)是基于關(guān)系理論尤其是代數(shù)中的集合論,理論基礎(chǔ)的不同直接導(dǎo)致了兩種技術(shù)的不匹配。需要一種解決不匹配的策略,于是對象關(guān)系映射(object relation mapping-orm)應(yīng)運(yùn)而生。hibernate是目前開發(fā)人員普遍推崇的orm工具,這是一個(gè)基于java開放源代碼的orm框架,對jdbc進(jìn)行了輕量級的對象封裝,使java程序員可以隨心所欲的使用面向?qū)ο缶幊趟季S來思維操縱數(shù)據(jù)庫。本文介紹了面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫技術(shù)的基礎(chǔ),介紹了通常的數(shù)據(jù)訪問模式,介紹了目前比較流行的orm中間件,然后詳細(xì)闡述了hibernate框架的體系結(jié)構(gòu)和基本原理,最后通過應(yīng)用str

3、uts和hibernate框架技術(shù)開發(fā)網(wǎng)上購物系統(tǒng),研究和分析了hibernate技術(shù)在實(shí)際開發(fā)中的應(yīng)用。關(guān)鍵詞:對象關(guān)系映射;orm;hibernate;mvc;j2eethe reserch and application of eletronic commerece website based on struts frameworkabstractnowadays in the software development field, object-oriented technology, database technology and component technology are a

4、lready widely used。object-oriented technology as the development concept of closing to real objective world, the code more readable, design more reasonable 。thinking of software reuse is to consider software as a complex of different components, and each of components can be designed as a common too

5、l to realize the similar function. a rational framework can improve expansion, maintainability and easiness of task partition, object-oriented technology and database technology play an important part in many systems, and developers are keen on the union of them. object-oriented technology is based

6、on theories of object, but relation database technology is based on theories of relation especially theories of set. diversity of base theory has led to mismatch of the two technologies. therefore a strategy to resolve mismatch is required urgently, and the object relation mapping arises at the same

7、 time. the mapping of object and relation is a kind of job of consuming time. hibernate is the orm tool which is generally regarded by many programmer at present. it is the orm tool of an opening source java code. it carries on the object encapsulations of lightweight to jdbc. it makes java programm

8、er handle the database freely by using object-oriented programming thinking.the usual mode of data access, the object-oriented technology and relational database technology based, the popular orm middleware, all those are introduce in this article .and then introduce the architecture and basic princ

9、iples of hibernate framework .and then through the application of struts and hibernate framework technology develope the online shopping systems.research and analysis the application of hibernate technology in the practice developmentkey words:orm; hibernate; mvc; j2ee目錄1緒論11.1研究背景11.2研究現(xiàn)狀12.對象持久化的論

10、述32.1面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫技術(shù)的基本理論32.1.1面向?qū)ο蠹夹g(shù)的基本理論32.1.2 關(guān)系數(shù)據(jù)庫的基本理論32.2 數(shù)據(jù)訪問模式42.2.1 業(yè)務(wù)邏輯與數(shù)據(jù)邏輯耦合模式42.2.2 主動(dòng)域?qū)ο竽J?2.2.3 orm模式42.3 持久層的概念52.4 常用的持久層中間件62.5 本章小結(jié)73 hibernate實(shí)現(xiàn)對象持久化的原理83.1 hibernate的運(yùn)行機(jī)制93.2 hibernate映射策略113.2.1 實(shí)體映射的策略113.2.2實(shí)體關(guān)聯(lián)關(guān)系映射的策略143.3 hibernate的緩存性能優(yōu)化163.3.1 持久層的緩存技術(shù)163.3.2持久層的緩存范圍163.3.

11、3 hibernate的二級緩存183.4 本章小結(jié):204.網(wǎng)上數(shù)碼港系統(tǒng)的實(shí)現(xiàn)214.1網(wǎng)站的需求分析214.2網(wǎng)站的開發(fā)環(huán)境和開發(fā)技術(shù)214.3 網(wǎng)站的總體設(shè)計(jì)214.3.1模塊設(shè)計(jì)214.3.2 數(shù)據(jù)庫設(shè)計(jì)254.3.3 系統(tǒng)架構(gòu)設(shè)計(jì)264.4 基于hibernate的網(wǎng)站持久層的設(shè)計(jì)274.5 網(wǎng)上數(shù)碼港網(wǎng)站購物模塊的實(shí)現(xiàn)314.6本章小結(jié)335總結(jié)和展望34參考文獻(xiàn)35致謝36附錄a:購物模塊持久層的hibernate實(shí)現(xiàn)代碼371緒論1.1研究背景在如今的企業(yè)級應(yīng)用開發(fā)環(huán)境中,面向?qū)ο蟮拈_發(fā)方式已成為主流。作為接近真實(shí)客觀世界的開發(fā)概念,面向?qū)ο笫钩绦虼a更易讀、設(shè)計(jì)更合理。一方

12、面,面向?qū)ο蠹夹g(shù)的理想存儲(chǔ)機(jī)制一面向?qū)ο髷?shù)據(jù)庫還不成熟;另一方面,關(guān)系數(shù)據(jù)庫是目前使用最廣泛的數(shù)據(jù)庫,因此,在開發(fā)過程中通常會(huì)采用面向?qū)ο蟮膽?yīng)用和關(guān)系數(shù)據(jù)庫相結(jié)合的方式。面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)理論基于不同的理論基礎(chǔ),前者基于耦合、內(nèi)聚和封裝等軟件工程概念,后者基于數(shù)學(xué)理論,特別是集合論,使得二者在協(xié)同工作時(shí)出現(xiàn)不匹配現(xiàn)象。例如:關(guān)系模型沒有現(xiàn)成的表達(dá)對象繼承的概念;如果查詢完全用sql編寫,則無法明確它們與對象的關(guān)系;關(guān)系模型支持的數(shù)據(jù)類型過于簡單,如整型,實(shí)型,等等,不能描述事物的復(fù)雜屬性。通過直接內(nèi)嵌sql或者數(shù)據(jù)訪問類的方法可以解決面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫不匹配的問題。前者是通過直接在類

13、的源代碼中嵌入sql語句來實(shí)現(xiàn)對象到關(guān)系數(shù)據(jù)庫的映射和存儲(chǔ),這種方法比較簡單,易于實(shí)現(xiàn)。但是它造成了應(yīng)用程序和數(shù)據(jù)庫結(jié)構(gòu)的直接耦合,違反了軟件工程的原則。后者是把所有的sql語句封裝起來,封裝在一個(gè)或多個(gè)“數(shù)據(jù)處理類”中,較之第一種方法有所改進(jìn),仍然沒有完全消除應(yīng)用程序和關(guān)系數(shù)據(jù)庫的耦合。一個(gè)更好的解決方案是在應(yīng)用程序的業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間構(gòu)建一個(gè)持久層,由持久層來提供對象一關(guān)系映射服務(wù),封裝數(shù)據(jù)訪問細(xì)節(jié)。采用持久層的方法可以從根本上消除應(yīng)用程序和關(guān)系數(shù)據(jù)庫的耦合,使得數(shù)據(jù)訪問對于應(yīng)用程序的源代碼是透明的,如果數(shù)據(jù)庫的庫表結(jié)構(gòu)發(fā)生改動(dòng),只需要對持久層的配置文件做適當(dāng)修改,不會(huì)對應(yīng)用程序造成

14、影響。1.2研究現(xiàn)狀在軟件系統(tǒng)開發(fā)過程中,數(shù)據(jù)和過程幾乎都是不可或缺的基本要素。數(shù)據(jù)是靜態(tài)的因素,而過程是動(dòng)態(tài)的因素,是對數(shù)據(jù)的處理流程。在傳統(tǒng)的系統(tǒng)開發(fā)方法中,由于過程與數(shù)據(jù)的分離,隨著專門針對過程處理的高級程序設(shè)計(jì)語言的出現(xiàn),相應(yīng)地也出現(xiàn)了專門針對數(shù)據(jù)持久的文件系統(tǒng)和數(shù)據(jù)庫管理系統(tǒng)等技術(shù)。但是隨著數(shù)據(jù)和過程在細(xì)粒度上緊耦合成對象,那么最理想的狀態(tài)就是把專門針對過程處理的高級程序設(shè)計(jì)語言和專門針對數(shù)據(jù)持久的數(shù)據(jù)庫管理系統(tǒng)技術(shù)在細(xì)粒度上也耦合起來,從而發(fā)展出一種新的具有持久化功能的對象。無疑這一意義上的對象具備了對象持久的先天優(yōu)勢,但這勢必要求拋棄舊有技術(shù)而發(fā)展出一種新的對象技術(shù),而這又是人們

15、的思想一時(shí)不能接受的。因而現(xiàn)階段在實(shí)現(xiàn)對象持久化上并沒有采用這種徹底的面向?qū)ο蠹夹g(shù),而是保留了現(xiàn)有數(shù)據(jù)持久化技術(shù),以通過保留對象狀態(tài)再還原的方式來變相實(shí)現(xiàn)對象持久化。目前軟件系統(tǒng)通常采用了多種不同機(jī)制來實(shí)現(xiàn)對象持久存儲(chǔ),而這些機(jī)制中又以支持事務(wù)處理、技術(shù)相對成熟的關(guān)系數(shù)據(jù)庫存儲(chǔ)機(jī)制尤為普遍。在j2ee平臺(tái)下,提供了多種數(shù)據(jù)持久化的實(shí)現(xiàn)機(jī)制,如jdbc,ejb,hibernate等。這些技術(shù)在整個(gè)市場中都占有一定的份額。jdbc是java數(shù)據(jù)訪問最原始、最直接、效率最高的方法,在目前許多中小型項(xiàng)目中仍然采用這種方式。ejb曾經(jīng)是j2ee領(lǐng)域的核心,目前也有許多項(xiàng)目是基于ejb的。但是實(shí)現(xiàn)起來的復(fù)

16、雜性往往使人望而卻步。hibernate是近年來數(shù)據(jù)持久化的熱門技術(shù),它有效地解決了對象和關(guān)系之間的阻抗不匹配問題,通過底層封裝了數(shù)據(jù)持久的代碼,為開發(fā)人員提供了真正的面向?qū)ο蟮拈_發(fā)方法。在數(shù)據(jù)訪問處理方面,目前業(yè)界比較慣用的有三種模式業(yè)務(wù)邏輯與數(shù)據(jù)訪問細(xì)節(jié)耦合的模式、基于主動(dòng)域?qū)ο蟮哪J健⒒趯ο箨P(guān)系映射的模式。這三種模式的區(qū)別主要在于數(shù)據(jù)訪問細(xì)節(jié)的封裝上?;趯ο箨P(guān)系映射的模式是目前數(shù)據(jù)訪問處理方面比較新穎的模式,也是越來越受青睞的模式。在多層體系結(jié)構(gòu)的數(shù)據(jù)層的設(shè)計(jì)上,為了獲取較高的穩(wěn)定性、較好的可擴(kuò)充性,開發(fā)人員常常會(huì)借用設(shè)計(jì)模式這把利器來獲得較好的設(shè)計(jì)效果。軟件的分層體系結(jié)構(gòu)已由最初的

17、兩層結(jié)構(gòu)發(fā)展到了三層甚至四層或更多層結(jié)構(gòu),層次結(jié)構(gòu)的劃分,使系統(tǒng)的易開發(fā)性,可維護(hù)性,可移植性,可擴(kuò)展性,都得到了很大的提升。2.對象持久化的論述2.1面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫技術(shù)的基本理論2.1.1面向?qū)ο蠹夹g(shù)的基本理論面向?qū)ο蠹夹g(shù)代表了一種全新的程序設(shè)計(jì)思路和觀察、表述、處理問題的方法,與傳統(tǒng)的面向過程的開發(fā)方法不同,它力求符合人們?nèi)粘W匀坏乃季S習(xí)慣,降低、分解問題的復(fù)雜性,提高整個(gè)求解過程的可控性、可監(jiān)測性和可維護(hù)性,從而達(dá)到以較小的代價(jià)和較高的效率獲得較滿意效果的目的。面向?qū)ο蠹夹g(shù)最初是從面向?qū)ο蟮某绦蛟O(shè)計(jì)開始的,隨著面向?qū)ο蟪绦蛟O(shè)計(jì)語言的發(fā)展,產(chǎn)生了面向?qū)ο蟮能浖こ虒W(xué),面向?qū)ο蟮拈_

18、發(fā)已成為當(dāng)今軟件開發(fā)的主流方法。面向?qū)ο髷?shù)據(jù)模型是由類來構(gòu)成的層次結(jié)構(gòu),層次結(jié)構(gòu)是指類與類之間的繼承關(guān)系。面向?qū)ο蟮臄?shù)據(jù)模型是用面向?qū)ο蟮挠^點(diǎn)來描述現(xiàn)實(shí)世界實(shí)體的邏輯組織、對象間限制、聯(lián)系等的模型。它將現(xiàn)實(shí)世界的所有實(shí)體都作為對象來處理,對象的屬性表示了對象的狀態(tài)和特征,而對象的操作表示了對象的行為方式。操作包括接口說明和實(shí)現(xiàn)兩部分,接口說明聲明了該操作的名稱、參數(shù)列表、返回類型等實(shí)現(xiàn)是通過某種具體語言編寫的代碼完成具體操作。外界只能通過消息與對象進(jìn)行通信,消息按照對象中的方法說明規(guī)定的形式傳給對象,對象接收此消息后調(diào)用相應(yīng)的操作,操作完成后再以消息的形式返回操作結(jié)果。面向?qū)ο蟮臄?shù)據(jù)模型能方便

19、自然地模擬現(xiàn)實(shí)世界,對象內(nèi)部數(shù)據(jù)及方法實(shí)現(xiàn)方式的變化不影響對象外界的使用,提高了數(shù)據(jù)的獨(dú)立性。方法的訪問與實(shí)現(xiàn)部分分離有利于保證數(shù)據(jù)的完整性和安全性,外界不能直接訪問修改對象內(nèi)部數(shù)據(jù)。2.1.2 關(guān)系數(shù)據(jù)庫的基本理論關(guān)系是基于數(shù)學(xué)原理,特別是基于集合論的原理。關(guān)系模型是目前數(shù)據(jù)庫系統(tǒng)中應(yīng)用最為廣泛的數(shù)據(jù)模型。相對于網(wǎng)狀模型和層次模型,關(guān)系模型有其自身的優(yōu)勢,關(guān)系模型有嚴(yán)格的數(shù)學(xué)基礎(chǔ)、概念簡單清晰、非過程化程度高、數(shù)據(jù)具有獨(dú)立性、更有利于數(shù)據(jù)管理和數(shù)據(jù)檢索。關(guān)系模型由關(guān)系數(shù)據(jù)結(jié)構(gòu)、關(guān)系操作集合和關(guān)系完整性約束三部分組成。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)非常單一,現(xiàn)實(shí)世界的實(shí)體以及實(shí)體之間的各種聯(lián)系均用關(guān)系來表

20、示。關(guān)系模式是關(guān)系的描述,關(guān)系是關(guān)系模式在某一時(shí)刻的狀態(tài)或內(nèi)容。關(guān)系模式是靜態(tài)的、穩(wěn)定的,而關(guān)系是動(dòng)態(tài)的、隨時(shí)間不斷變化的,因?yàn)殛P(guān)系操作在不斷地更新著數(shù)據(jù)庫中的數(shù)據(jù)。在用戶看來,關(guān)系模型中數(shù)據(jù)的邏輯結(jié)構(gòu)就是一張二維表。2.2 數(shù)據(jù)訪問模式目前大多數(shù)的應(yīng)用系統(tǒng)采用數(shù)據(jù)庫作為數(shù)據(jù)存儲(chǔ)的工具,而數(shù)據(jù)的處理則是通過應(yīng)用程序來實(shí)現(xiàn)的。該部分?jǐn)?shù)據(jù)訪問模式的研究是基于關(guān)系數(shù)據(jù)庫的。根據(jù)數(shù)據(jù)訪問在程序中所處的位置,可以將數(shù)據(jù)訪問模式分為三種:業(yè)務(wù)邏輯與數(shù)據(jù)訪問耦合模式,主動(dòng)域?qū)ο竽J?,對象關(guān)系映射模式。2.2.1 業(yè)務(wù)邏輯與數(shù)據(jù)邏輯耦合模式由于業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯的代碼都寫在一個(gè)類中,因此這種模式稱為業(yè)務(wù)邏

21、輯與數(shù)據(jù)邏輯耦合模式。這種模式的優(yōu)點(diǎn)是直接、訪問效率高。在多層體系結(jié)構(gòu)中,層次與效率是不可兼得的兩方面,層次越多效率越低。由于這種方式直接跟數(shù)據(jù)庫打交道,避免了中間的訪問環(huán)節(jié),因此效率上是比較高的。缺點(diǎn)是可維護(hù)性差、可重用性差。業(yè)務(wù)邏輯與數(shù)據(jù)訪問邏輯代碼混合在一起,一是使得程序的可讀性差、維護(hù)起來困難,二是存在大量的重復(fù)代碼而無法重用。2.2.2 主動(dòng)域?qū)ο竽J皆谠撃J街?,?shù)據(jù)訪問的細(xì)節(jié)位于實(shí)體域?qū)ο笾小T趯?shí)現(xiàn)中封裝了關(guān)系數(shù)據(jù)模型和數(shù)據(jù)的訪問細(xì)節(jié),由實(shí)體域?qū)ο筘?fù)責(zé)自身的數(shù)據(jù)訪問細(xì)節(jié),這種實(shí)體域?qū)ο笠脖环Q為主動(dòng)域?qū)ο蟆_^程域?qū)ο笾话瑯I(yè)務(wù)邏輯,通過對主動(dòng)域的引用完成數(shù)據(jù)訪問操作。這種模式的優(yōu)點(diǎn)是

22、解耦應(yīng)用程序代碼和數(shù)據(jù)模型、可維護(hù)性較好。由于過程域?qū)ο笾兄挥袠I(yè)務(wù)處理邏輯代碼,而沒有包含任何的數(shù)據(jù)訪問代碼,關(guān)于數(shù)據(jù)模型的操作是由主動(dòng)域自身完成的,因此數(shù)據(jù)模型的改變不會(huì)影響到業(yè)務(wù)邏輯。缺點(diǎn)是數(shù)據(jù)訪問分布在多個(gè)域?qū)ο笾?,限制了?yīng)用程序?qū)?shù)據(jù)訪問的控制。每個(gè)主動(dòng)域?qū)ο蠖钾?fù)責(zé)數(shù)據(jù)訪問實(shí)現(xiàn),這就意味著采用全局性的數(shù)據(jù)訪問策略需要在每個(gè)主動(dòng)域?qū)ο笾兄貜?fù)相似的代碼。2.2.3 orm模式在這種模式中,數(shù)據(jù)訪問細(xì)節(jié)被封裝在一個(gè)被稱為持久層的層次中,而實(shí)體域?qū)ο笾话瑯I(yè)務(wù)數(shù)據(jù),過程域?qū)ο笾话瑯I(yè)務(wù)邏輯。在這種模式中實(shí)現(xiàn)數(shù)據(jù)的訪問需要借助第三方的對象關(guān)系映射工具來完成。這種模式的優(yōu)點(diǎn)是應(yīng)用程序代碼清晰,與包

23、含數(shù)據(jù)模型和數(shù)據(jù)訪問細(xì)節(jié)的代碼相比,單純處理域?qū)ο蟮膽?yīng)用程序代碼更加清晰,也更容易開發(fā)和維護(hù)。對象關(guān)系映射機(jī)制隔離了可配置的映射元數(shù)據(jù),可以在不影響應(yīng)用程序代碼的情況下修改元數(shù)據(jù)。許多對象關(guān)系映射產(chǎn)品在運(yùn)行時(shí)保存和解釋映射元數(shù)據(jù),元數(shù)據(jù)的變化不需要重新編譯任何代碼。缺點(diǎn)是限制了應(yīng)用程序?qū)?shù)據(jù)訪問的控制,應(yīng)用程序只能通過持久化管理類來調(diào)用定義的接口,難以調(diào)整物理數(shù)據(jù)庫操作和資源管理以優(yōu)化特定應(yīng)用程序的數(shù)據(jù)訪問功能。orm中間件能在任何一個(gè)java應(yīng)用的業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間充當(dāng)橋梁(參見圖2-1).圖2-1 orm充當(dāng)業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間的橋梁2.3 持久層的概念什么是持久層呢?在定義持久

24、層之前,我們先來了解下“持久”的含義。這里的持久是保持很久的意思。具體點(diǎn)就是:把應(yīng)用程序中的對象的屬性和狀態(tài)保存到數(shù)據(jù)庫或文件系統(tǒng)中,讓對象的屬性和狀態(tài)在對象的生命周期結(jié)束后任然可以保持很久,以便將來可以根據(jù)數(shù)據(jù)庫中的數(shù)據(jù)來恢復(fù)對象,再次使用。而持久層就是實(shí)現(xiàn)對象持久化的一個(gè)邏輯層次。這個(gè)層次的程序代碼專門負(fù)責(zé)實(shí)現(xiàn)對象持久化的功能,所以的對象持久化代碼都在這個(gè)層次實(shí)現(xiàn),這個(gè)層次的程序代碼出來對象持久化的功能之外沒有其他功能。現(xiàn)在的軟件架構(gòu)一般都分為三個(gè)層次:表示層,業(yè)務(wù)邏輯層,數(shù)據(jù)邏輯層(即持久層)。就像前面所說的三種數(shù)據(jù)訪問模式,第一種是把業(yè)務(wù)邏輯代碼和數(shù)據(jù)訪問邏輯代碼混合在一起,根本不能分

25、出數(shù)據(jù)訪問的層次來。所以這種模式雖然有持久功能,但卻沒有形成持久層。第二中主動(dòng)域模式把業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯初步分開來了,初步形成了持久層,就是主動(dòng)域?qū)?。第三種orm映射模式形成了比較完善的持久層,這個(gè)持久層通常叫數(shù)據(jù)訪問對象層。采用持久層的方法(如圖2-2)可以從根本上消除應(yīng)用程序和關(guān)系數(shù)據(jù)庫的耦合。它使得數(shù)據(jù)對于應(yīng)用程序的源代碼是透明的,如果修改數(shù)據(jù)庫的庫表結(jié)構(gòu),不會(huì)對應(yīng)用程序造成影響,也不用改動(dòng)持久層的代碼。它還有一個(gè)優(yōu)點(diǎn)就是將程序員從sql語言中解放出來,程序員無需了解數(shù)據(jù)庫的結(jié)構(gòu)。這種方法適合用于大規(guī)模的工程項(xiàng)目,因?yàn)樗删S護(hù)性高,可移植性好。其缺點(diǎn)是對應(yīng)用系統(tǒng)的性能上有所影響。如果

26、持久層設(shè)計(jì)的比較合理,這種影響會(huì)很小。圖2-2 持久層的使用2.4 常用的持久層中間件當(dāng)一個(gè)軟件架構(gòu)有清晰的持久層時(shí),他的可維護(hù)性,可擴(kuò)展性,可移植性都大大增強(qiáng)。又由于現(xiàn)在軟件編程中面向?qū)ο蠹夹g(shù)和關(guān)系型數(shù)據(jù)庫的廣泛應(yīng)用,具有orm能力的持久層就變得非常實(shí)用,對于企業(yè)應(yīng)用的系統(tǒng)開發(fā)人員,花費(fèi)大量的時(shí)間自行開發(fā)持久層不是很可行。目前,在持久層領(lǐng)域,已經(jīng)出現(xiàn)了許多持久化中間件可以幫助人們完成持久層的開發(fā)工作,用戶可以根據(jù)自己的需求進(jìn)行選擇,并進(jìn)行二次開發(fā)。這里介紹常用的持久化中間件。 1. toplinktoplink是一個(gè)較早期的持久化中間件產(chǎn)品,最初面向c+,后來實(shí)現(xiàn)了java的映射。topli

27、nk性能優(yōu)異,功能強(qiáng)大,并且提供了獨(dú)特的查詢過濾器機(jī)制,對關(guān)系的處理和查詢都非常有效,于是,toplink逐漸從商用。o/r mapping產(chǎn)品中勝出,成為市場上的最出色的映射產(chǎn)品。toplink雖然強(qiáng)大,但它價(jià)格高昂,讓很多用戶望而卻步。 2. castor castor是exolab組織開發(fā)的面向java的持久化工具,它最大的特色就是實(shí)現(xiàn)了大部分的odmg oql規(guī)范,在查詢上,可以像使用對象數(shù)據(jù)庫一樣對類圖進(jìn)行查詢。它的原理是通過java反射api去實(shí)現(xiàn)屬性的設(shè)置和讀取。不過由于各種原因,castor后來的版本更新越來越慢,至今未出到1.0正式版。3. apache torqueapac

28、he torque是一個(gè)使用關(guān)系數(shù)據(jù)庫作為存儲(chǔ)手段的java應(yīng)用程序持久化工具,是apache的公開源代碼項(xiàng)目。torque是一個(gè)開源項(xiàng)目,由web應(yīng)用程序框架jakarta apache turbine發(fā)展而來,但現(xiàn)在已完全獨(dú)立于turbine. torque主要包含兩部分:一部分是generator,它可以產(chǎn)生應(yīng)用程序需要的所有數(shù)據(jù)庫資源,包括sql和java文件;另外一部分是runtime,提供使用這些代碼訪問數(shù)據(jù)庫的運(yùn)行環(huán)境。目前torque支持的數(shù)據(jù)庫包括db2, sql server, oracle, postgresql等。 4. jaxorjaxor是一個(gè)簡單但功能強(qiáng)大的創(chuàng)建關(guān)

29、系映像層的工具。jaxor允許開發(fā)者輕松地在表中插入、更新、刪除行,但也可被擴(kuò)展為創(chuàng)建一個(gè)可擴(kuò)展的映像層,這個(gè)層可創(chuàng)建一個(gè)完全的域模型,透明地映射到數(shù)據(jù)庫表。 5. hibernatehibernate是一個(gè)基于java的開放源代碼的持久化中間件,采用java反射api來持久化java對象。hibernate不需要任何容器,提供簡單易用并符合odmg3-st貝e的api。作為一個(gè)良好的orm中間件,它有如下特點(diǎn):(1)透明地提供對象與關(guān)系數(shù)據(jù)庫的映射,以統(tǒng)一的接口方式支持多種數(shù)據(jù)庫。(2)緩存機(jī)制,復(fù)雜的緩存機(jī)制和鎖定策略,使針對數(shù)據(jù)庫操作大大減少。(3)開源免費(fèi)的license,可以在需要的

30、時(shí)候研究源代碼,改寫源代碼,進(jìn)行功能的定制。(4)輕量級封裝,避免引入過多復(fù)雜的問題,容易調(diào)試,減輕程序員的負(fù)擔(dān)。(5)具有可擴(kuò)展性,api開放,當(dāng)自身功能不夠用的時(shí)候,可以自行編碼擴(kuò)展。(6)開發(fā)者活躍,產(chǎn)品有穩(wěn)定的發(fā)展保障。 6. ibatis使用ibatis提供的orm機(jī)制,對業(yè)務(wù)邏輯實(shí)現(xiàn)人員而言,面對的是純粹的java對象,這一層與通過hibernate實(shí)現(xiàn)orm而言基本一致,而對于具體的數(shù)據(jù)操作,hibernate會(huì)自動(dòng)生成sql語句,而ibatis則要求開發(fā)者編寫具體的sql語句。相對hibernate等“全自動(dòng)”orm機(jī)制而言,ibatis以sql開發(fā)的工作量和數(shù)據(jù)庫移植性上的讓

31、步,為系統(tǒng)設(shè)計(jì)提供了更大的自由空間。作為“全自動(dòng)”orm實(shí)現(xiàn)的一種有益補(bǔ)充,ibatis的出現(xiàn)顯得別具意義。此外還有speedo,xorm,cayenne等,在這里就不介紹了。2.5 本章小結(jié)本章通過介紹面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫技術(shù)的基本理論,軟件架構(gòu)中持久層的應(yīng)用,引導(dǎo)到持久層的orm的應(yīng)用,并且介紹了多種常用的持久層中間件,為詳細(xì)了解下一章的hibernate框架做好準(zhǔn)備。3 hibernate實(shí)現(xiàn)對象持久化的原理hibernatehibernate2hibernate3相關(guān)工具實(shí)際應(yīng)用理論思想tanghan eclipse pluginjertroller weblogger眾多金融/e

32、rp等應(yīng)用terac board/miracle每月下載量200萬,幾乎是事實(shí)上的orm標(biāo)準(zhǔn)實(shí)現(xiàn)andromdamiddlegenxdoclet hibernate tagshibernate consolehibernate synchronizer一個(gè)類跨越多個(gè)表支持手寫sql屬性延遲加載映射到xml文檔jmx支持通過query大批量更新/刪除虛擬條件脫離session的criterriaapi更靈活的類與表的映射關(guān)系,幾乎沒有限制一張表容納多個(gè)類、每個(gè)表一個(gè)類的映射選擇一對多、多對多關(guān)聯(lián)集合的透明映射直接sql查詢組件(component)的支持兩級緩存自動(dòng)主鍵管理持久層概念orm資源管

33、理模式設(shè)計(jì)模式具體版本圖3-1 hibernate的體系結(jié)構(gòu)圖3.1 hibernate的運(yùn)行機(jī)制hibernate是一個(gè)基于java的開放源代碼的持久化中間件,它對jdbc做了輕量級封裝,不僅提供orm映射功能,還提供數(shù)據(jù)緩存和數(shù)據(jù)查詢功能,java開發(fā)人員可以方便的通過hibernate api來操縱數(shù)據(jù)庫。圖3-2闡述了hibernate的運(yùn)行機(jī)制圖3-2 hibernate的運(yùn)行機(jī)制hibernate從其配置文件中讀取和數(shù)據(jù)庫連接有關(guān)的信息,這個(gè)配置文件應(yīng)該位于應(yīng)用的classpath中。hibernate的配置文件有兩種形式:一種是xml格式的文件(hibernate.cfg.xml

34、 );還有一種是java屬性文件(hibernate. properties),采用“健二值”的形式。hibernate的基礎(chǔ)代碼包括持久化類和hibernate映射文件以及ddl。持久化類是指其實(shí)例需要被hibernate持久化到數(shù)據(jù)庫中的類。持久化類通常都是域模型中的實(shí)體域類。持久化類符合javabean的規(guī)范,包含一些屬性,以及與之對應(yīng)的getxxx()和setxxx()方法。hibeinate采用xml格式的映射文件來指定對象和關(guān)系數(shù)據(jù)庫之間的映射(默認(rèn)為.hbm.xml后綴)。該文件描述了如何把類映射到數(shù)據(jù)庫具體的表中,并述了類與其他類的關(guān)系。在運(yùn)行時(shí),hibernate將根據(jù)它生成

35、各種sql語句。ddl即數(shù)據(jù)庫定義文件。hibernate對于這三種文件的生成具有強(qiáng)大的靈活性,只要知道任何一種文件,都可以通過hibernate提供的代碼自動(dòng)生成工具得到另外兩種文件。如:1)只有映射文件:mapping file -hbm2java-java-schema export- ddl2)只有ddl: ddl-middlegen-hbm- hbm2java-java3)只有java: java-xdoclet-hbm- schema export - ddl如上圖所示,如果事先設(shè)計(jì)好了ddl,就可以利用middlegen自動(dòng)生成*.hbm.xml文件。如果先完成了映射文件,就可以

36、先實(shí)例化configuration類,然后利用addclass()映射*.hbm.xml。再在a處調(diào)用configuration. getproperties,檢查所使用的數(shù)據(jù)庫,表的關(guān)聯(lián)性,外鍵約束性,和一對多關(guān)系的設(shè)置。最后在b處利用schemaexport類在數(shù)據(jù)庫中創(chuàng)建相應(yīng)的表結(jié)構(gòu)。在圖中還可以看到hibernate的初始化過程,包括如下步驟:1)創(chuàng)建一個(gè)configuration類的實(shí)例: configuration config = new configuration();該方法會(huì)調(diào)用environment類的getproperties方法,從而把默認(rèn)文件路徑下的hibernate

37、.properties(或hibernate.cfg.xml )配置文件中的配置信息讀入到內(nèi)存。 2)調(diào)用configuration類的addclass()方法: config.addclass(class persistentclass);該方法把默認(rèn)文件路徑下的persistentclass映射文件中的映射信息讀入到內(nèi)存中 3)如c處所示,調(diào)用configuration類的buildsessionfactory()方法:sessionfactory = config.buildsessionfactory();該方法使用數(shù)據(jù)庫的jdbc的驅(qū)動(dòng)連接數(shù)據(jù)庫,查看所用數(shù)據(jù)庫連接池,同時(shí)檢驗(yàn)jnd

38、i等的配置情況,最后創(chuàng)建一個(gè)sessionfactory實(shí)例,并把configuration對象包含的所有配置信息拷貝到sessionfactory對象的緩存中。由于java語言是純面向?qū)ο蟮恼Z言,因此不可能像c語言那樣直接操縱內(nèi)存例如聲明一段可用的內(nèi)存空間。這里的緩存其實(shí)指的是java對象的屬性(通常是一些集合類型的屬性)占用的內(nèi)存空間。例如,sessionfactory的實(shí)現(xiàn)類中定義了許多集合類型的屬性,這些屬性用于存放hibernate配置信息、映射元數(shù)據(jù)信息等。hibernate在初始化階段,會(huì)根據(jù)映射文件的映射信息,為所有的持久化類預(yù)定義以下sql語句:1) insert語句:ins

39、ert into表名(字段1,字段2,)values(?,?,.)2) update語句:update表名set字段1=?,字段2=?,where id=?3) delete語句:delete from表名where id=?4)根據(jù)oid來檢索持久化類實(shí)例的select語句:select字段1,字段2,.from表名where id=?以上sql語句中的問號代表jdbc preparedstatement中的參數(shù)。這些sql語句都存放在sessionfactory的緩存中,當(dāng)執(zhí)行session的save(), update(),deleteq, load()方法時(shí),將從緩存中找到相應(yīng)的預(yù)定義

40、sql語句,再把具體的參數(shù)值綁定到該sql語句中。初始化過程結(jié)束后,調(diào)用sessionfactory實(shí)例的opensession()方法來獲得session實(shí)例,然后通過它執(zhí)行訪問數(shù)據(jù)庫的操作。session接口提供了操縱數(shù)據(jù)庫的各種方法,如:1) save()方法:把java對象保存數(shù)據(jù)庫中。2) update()方法:更新數(shù)據(jù)庫中的java對象。3) delete()方法:把java對象從數(shù)據(jù)庫中刪除。4) load()方法:從數(shù)據(jù)庫中加載java對象。5) createquery()方法:從數(shù)據(jù)庫中查詢java對象。session是一個(gè)輕量級對象。通常將每一個(gè)session實(shí)例和一個(gè)數(shù)據(jù)

41、庫事務(wù)綁定,也就是說,每執(zhí)行一個(gè)數(shù)據(jù)庫事務(wù),都要先創(chuàng)建一個(gè)新的session實(shí)例。如果事務(wù)執(zhí)行中出現(xiàn)異常,應(yīng)該撤銷事務(wù)。不論事務(wù)執(zhí)行成功與否,最后都調(diào)用session的close()方法,從而釋放session實(shí)例占用的資源。至此,已對hibernate的運(yùn)行機(jī)制有了大概的了解,下面將具體分析hibernate如何實(shí)現(xiàn)對象關(guān)系映射orm。3.2 hibernate映射策略 o/r映射技術(shù)是orm中間件中最為關(guān)鍵的組成部分,也是開發(fā)過程中必須時(shí)刻關(guān)注的內(nèi)容。下面,討論hibernate中o/r映射技術(shù)的實(shí)現(xiàn)策略。3.2.1 實(shí)體映射的策略實(shí)體映射技術(shù)作為類與表之間的聯(lián)系紐帶,在orm實(shí)現(xiàn)中起著至

42、關(guān)重要的作用。hibernate中,實(shí)體映射主要包括以下3部分內(nèi)容:1.類一表映射在簡單的情況下,一個(gè)類映射成一張表。所謂簡單情況,就是說這個(gè)類不與其它的類存在繼承關(guān)系。在這里主要討論如何在關(guān)系數(shù)據(jù)庫中實(shí)現(xiàn)類的繼承。繼承關(guān)系是關(guān)系型數(shù)據(jù)與面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)之間的主要差異之一。如何在關(guān)系型數(shù)據(jù)庫基礎(chǔ)之上,通過繼承關(guān)系得到清晰合理的層次劃分是hibernate實(shí)體層次設(shè)計(jì)中的一個(gè)關(guān)鍵問題。hibernate中支持3種類型的繼承形式:1)繼承關(guān)系樹的根類對應(yīng)一個(gè)表(table-per-class-hierarchy):如圖3-3所示,父類和所有的子類公用一個(gè)表,該表需要有一個(gè)簡單列充當(dāng)類型判斷的角色。

43、用類型鑒別器(discriminator)來判斷表中的每條記錄是什么類型,映射成對應(yīng)的子類。優(yōu)點(diǎn):查詢簡單。缺點(diǎn):多個(gè)子類公用一個(gè)表,造成表結(jié)構(gòu)復(fù)雜,且很多字段置空。圖3-3 table-per-class-hierarchy2)繼承關(guān)系樹的每個(gè)具體類對應(yīng)一個(gè)表(table-per-subclass ):如圖3-4所示,在具體類對應(yīng)的表中,不僅包含和具體類的屬性對應(yīng)的字段,還包含和具體類的父類的屬性對應(yīng)的字段。即父類的公共屬性出現(xiàn)在每一個(gè)子類表中。需要注意的是,實(shí)現(xiàn)時(shí)在每個(gè)子類的xml文件中都要映射從父類繼承的關(guān)聯(lián)關(guān)系。優(yōu)點(diǎn):沒有數(shù)據(jù)冗余:如果只是查詢某個(gè)子類,那么是簡單且高效的。缺點(diǎn):不能很

44、好的支持多態(tài)關(guān)聯(lián),每個(gè)子類都是獨(dú)立的,查詢所有內(nèi)容時(shí),要分別從各個(gè)子類表中查詢,然后將查詢結(jié)果合并到一起,這對性能有壞的影響。圖3-4 table-per-subclass3)繼承關(guān)系樹的每個(gè)類對應(yīng)一個(gè)表(table-per-concret-class ):如圖3-5所示,在關(guān)系數(shù)據(jù)模型中用外鍵參照關(guān)系來表示繼承關(guān)系。首先為公用字段創(chuàng)建一個(gè)表,每個(gè)subclass特有的屬性分別創(chuàng)建一個(gè)表。這樣一個(gè)完整的subclass就是公用表+子類表。優(yōu)點(diǎn):最符合面向?qū)ο蟮母拍?類映射到數(shù)據(jù)庫中的表的創(chuàng)建工作是所有實(shí)現(xiàn)中最簡單的,表中只需包含自己的所有屬性即可;對多態(tài)的支持最好,對于對象所可能充當(dāng)?shù)慕巧珒H需

45、要在相應(yīng)的表中保存記錄;父類和子類之間的耦合度大大降低,易于修改父類和增加新的類。數(shù)據(jù)庫的空間被有效利用,不存在大量的數(shù)據(jù)冗余。缺點(diǎn):每次取一個(gè)對象都要通過關(guān)聯(lián)查詢進(jìn)行,性能較差。圖3-5 table-per-concret-class 如果不需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),可以采用“table-per-subclass”的映射方式,如果需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),并且子類包含的屬性不多,可以采用“table-per-class-hierarchy”的映射方式,如果需要支持多態(tài)查詢和多態(tài)關(guān)聯(lián),并且子類包含的屬性很多,可以采用“table-per-concret-class”的映射方式。如果繼承關(guān)系

46、樹中包含接口,可以把它當(dāng)作抽象類來處理。2.映射oidjava語言按內(nèi)存地址來標(biāo)識(shí)或區(qū)別同一個(gè)類的不同對象,而關(guān)系數(shù)據(jù)庫按主鍵值來標(biāo)識(shí)或區(qū)別同一個(gè)表的不同記錄。hibernate使用oid來統(tǒng)一兩者之間的矛盾,oid是關(guān)系數(shù)據(jù)庫中的主鍵(通常為代理主鍵)在java對象模型中的等價(jià)物。在運(yùn)行時(shí),hibernate根據(jù)oid來維持java對象和數(shù)據(jù)庫表中記錄的對應(yīng)關(guān)系。為了保證持久化對象的oid的唯一性和不可變性,通常由hibernate或底層數(shù)據(jù)庫來給oid賦值。因此,可以把oid的setid()方法設(shè)為private類型,以禁止java應(yīng)用程序隨便修改oid。而把getid()方法設(shè)為publ

47、ic類型,這使得java應(yīng)用程序可以讀取持久化對象的oid。hibernate提供了標(biāo)識(shí)符生成器接口identitygenerator接口,并且提供了多種內(nèi)置的實(shí)現(xiàn),例如:increment, identity, sequence等。3.屬性一字段映射屬性一字段映射將映射類屬性與庫表字段相關(guān)聯(lián)。下面將類屬性分成三種情況進(jìn)行討論。 1)屬性類型可以直接映射到某個(gè)hibernate映射類型: 只要在xml文件中指定pojo的屬性名、庫表字段名以及數(shù)據(jù)類型,hibernate就可以透明地實(shí)現(xiàn)對應(yīng)的映射。 2)屬性是java集合類型: 按照集合的數(shù)據(jù)結(jié)構(gòu)劃分,java集合可分為三類:set, list

48、和map o hibernate允許把以上三種java集合都映射到數(shù)據(jù)庫中,在映射文件中,與映射java集合相關(guān)的元素包括, , 和。需要指出的是在java集合api中并沒有提供bag接口,hibernate允許在持久化類中用list來模擬bag的行為。對于每一種集合接口,hibernate都提供了內(nèi)置的實(shí)現(xiàn)類,這些實(shí)現(xiàn)類都在collection包里。當(dāng)session從數(shù)據(jù)庫中加載java集合時(shí),會(huì)創(chuàng)建內(nèi)置集合類的實(shí)例。3)屬性本身也是一個(gè)類:hibernate在映射類屬性時(shí)區(qū)別對待值類型類和實(shí)體類型類。值類型和實(shí)體類型的最重要的區(qū)別是前者沒有oid,不能被單獨(dú)持久化,它的生命周期依賴于所屬的

49、持久化類的對象的生命周期;而實(shí)體類型有oid,可以被單獨(dú)持久化。如果屬性類是值類型,即聚集(組成)關(guān)系映射。在創(chuàng)建映射文件時(shí),不能使用元素來映射屬性,而要使用元素。如:a的某屬性b是值類型的類,則a在數(shù)據(jù)庫中對應(yīng)的表的字段會(huì)包含b的所有屬性,b的屬性直接映射到a的映射表的相應(yīng)字段。 如果屬性類是實(shí)體類型的,即多對一關(guān)聯(lián)關(guān)系的映射,下面會(huì)有詳細(xì)介紹。3.2.2實(shí)體關(guān)聯(lián)關(guān)系映射的策略 在前面的內(nèi)容中,討論了基于hibernate的實(shí)體映射技術(shù)的基礎(chǔ)知識(shí)。對于orm而言,另外一個(gè)非常關(guān)鍵的特性,就是對實(shí)體之間關(guān)聯(lián)關(guān)系的管理。下面就一對一、一對多以及多對多的關(guān)聯(lián)關(guān)系分別進(jìn)行討論。 1.一對一關(guān)聯(lián) hi

50、bernate提供了兩種映射一對一關(guān)聯(lián)關(guān)系的方法:按主鍵映射和按外鍵映射。1)按主鍵映射:這種映射方式就是兩張關(guān)聯(lián)表通過共享主鍵形成一對一映射關(guān)系。只需為一張表設(shè)定主鍵生成器,而另一張表的主鍵與之共享相同的主鍵值。hibernate通過。ne-to-one節(jié)點(diǎn)進(jìn)行聲明。但如果某兩個(gè)類之間有多個(gè)一對一關(guān)聯(lián),這種方法就不適用了,此時(shí)可以采用按外鍵映射的方法。 2)按外鍵映射:這種映射方式就是將一張表的主鍵作為另一張表的外鍵。hibernate通過many-to-one節(jié)點(diǎn)進(jìn)行聲明。因?yàn)槲ㄒ煌怄I關(guān)聯(lián)的一對一關(guān)系只是多對一關(guān)系的一個(gè)特例。2.一對多關(guān)聯(lián)一對多關(guān)聯(lián)在系統(tǒng)實(shí)現(xiàn)中非常常見。一對多關(guān)系分為單向

51、一對多關(guān)系和雙向一對多關(guān)系。單向一對多關(guān)系只需在“一”方進(jìn)行配置,雙向一對多關(guān)系需要在關(guān)聯(lián)雙方均加以配置。對于單向一對多關(guān)聯(lián)關(guān)系,hibernate提供了集合屬性的映射支持。實(shí)現(xiàn)相對比較簡單。但是存在一個(gè)問題,由于是單向關(guān)聯(lián),為了保持關(guān)聯(lián)關(guān)系,只能通過主控方對被動(dòng)方進(jìn)行級聯(lián)更新。如果被關(guān)聯(lián)方的關(guān)聯(lián)字段為“not null”,當(dāng)hibernate創(chuàng)建或者更新關(guān)聯(lián)關(guān)系時(shí),可能出現(xiàn)約束違例。此外,由于hibernate實(shí)現(xiàn)機(jī)制中,采用了兩條sql語句進(jìn)行一次數(shù)據(jù)插入操作,相對單條insert操作,幾乎是雙倍的性能開銷,效率較低,因此,對于性能敏感的系統(tǒng)而言,這樣的解決方案所帶來的開銷可能難以承受。雙

52、向一對多關(guān)聯(lián)的出現(xiàn)則解決了上面單向關(guān)聯(lián)的問題。它除了避免約束違例和提高性能的好處之外,還帶來另外一個(gè)優(yōu)點(diǎn),由于建立了雙向關(guān)聯(lián),可以在關(guān)聯(lián)雙方中任意一方,訪問關(guān)聯(lián)的另一方,這提供了更豐富靈活的控制手段。雙向一對多關(guān)聯(lián),實(shí)際上是“一對多”與“多對一”關(guān)聯(lián)的組合。也就是說必須在主控方配置單向一對多的基礎(chǔ)上。在被控制方配置與其對應(yīng)的多對一關(guān)系。需要注意的是,此時(shí)hibernate通過把集合元素的inverse設(shè)置為true,將關(guān)聯(lián)關(guān)系的維護(hù)工作交給“多方”,而“一方”的關(guān)聯(lián)只是“多方”的鏡像。hibernate僅按照“多方”的對象狀態(tài)的變化來同步數(shù)據(jù)庫更新。3.多對多關(guān)聯(lián)hibernate關(guān)聯(lián)關(guān)系中相

53、對比較特殊的就是多對多關(guān)聯(lián)。多對多關(guān)聯(lián)與一對一和一對多關(guān)聯(lián)不同,他需要借助中間表完成多對多映射信息的保存。關(guān)聯(lián)表包含關(guān)系中涉及到多張表的主鍵,也就是每個(gè)表中某個(gè)對象的oid,每條記錄即這些oid的組合,表示哪些對象之間是存在關(guān)系。通過將這些表的主鍵關(guān)聯(lián)起來,實(shí)現(xiàn)兩個(gè)或者多個(gè)表之間的多對多關(guān)系。關(guān)聯(lián)表的實(shí)現(xiàn)有兩種方法:一種是關(guān)聯(lián)表的屬性包含關(guān)系中涉及表的主鍵,并且關(guān)聯(lián)表的主鍵是這些屬性的組合:第二種方法是將關(guān)聯(lián)表視為普通表,使用自己的主鍵,然后通過將屬性設(shè)置成外鍵和別的表關(guān)聯(lián)起來。3.3 hibernate的緩存性能優(yōu)化緩存是提升系統(tǒng)性能的關(guān)鍵因素。它的主要作用是減少1/o和計(jì)算,提高系統(tǒng)性能,

54、通過緩存查詢結(jié)果來提高數(shù)據(jù)庫系統(tǒng)的整體性能在數(shù)據(jù)庫領(lǐng)域得到了廣泛應(yīng)用。相對于內(nèi)存操作而言,數(shù)據(jù)庫調(diào)用是一個(gè)代價(jià)高昂的過程,對于典型企業(yè)級應(yīng)用結(jié)構(gòu):數(shù)據(jù)庫往往與應(yīng)用服務(wù)器位于不同的物理服務(wù)器,這也就意味著每次數(shù)據(jù)庫訪問都是一次遠(yuǎn)程調(diào)用,socket的創(chuàng)建與銷毀,數(shù)據(jù)的打包拆包,數(shù)據(jù)庫執(zhí)行查詢指令、網(wǎng)絡(luò)傳輸上的延時(shí),這些消耗都給系統(tǒng)整體性能造成了嚴(yán)重影響。此時(shí),緩存的存在價(jià)值就凸顯出來了。特別是對于查詢操作繁復(fù)的系統(tǒng)而言,良好的緩存管理機(jī)制以及合理的緩存應(yīng)用模式往往是性能提升的關(guān)鍵。緩存技術(shù)從應(yīng)用結(jié)構(gòu)上可以劃分為三類:數(shù)據(jù)庫服務(wù)器的緩存、客戶端的緩存技術(shù)、中間層的緩存。在數(shù)據(jù)庫應(yīng)用系統(tǒng)中這三類技術(shù)

55、是可以結(jié)合使用的。關(guān)于數(shù)據(jù)庫服務(wù)器的緩存和客戶端的緩存在這里就不進(jìn)行介紹了,這里主要介紹下中間層的緩存機(jī)制。3.3.1 持久層的緩存技術(shù)上個(gè)世紀(jì)九十年代出現(xiàn)的三層結(jié)構(gòu)克服了兩層結(jié)構(gòu)的局限性,將應(yīng)用的表現(xiàn)邏輯、業(yè)務(wù)邏輯和數(shù)據(jù)處理相互分離。第三層位于客戶端和服務(wù)器方數(shù)據(jù)管理組件之間,負(fù)責(zé)管理執(zhí)行業(yè)務(wù)邏輯,又稱為中間層或應(yīng)用服務(wù)器。相對于兩層結(jié)構(gòu)而言,三層結(jié)構(gòu)既保留了原來c/s模式的優(yōu)點(diǎn),又提高了應(yīng)用的可維護(hù)性、可擴(kuò)展性和可重用性。但是三層結(jié)構(gòu)中將數(shù)據(jù)管理與應(yīng)用邏輯相分離又造成了用戶訪問數(shù)據(jù)的性能下降,妨礙了系統(tǒng)的可伸縮性。因此人們提出了在三層結(jié)構(gòu)的中間層緩存數(shù)據(jù)的優(yōu)化方案。它跟客戶端緩存有一定的相

56、似性,但是由于中間層的緩存數(shù)據(jù)可以由多個(gè)客戶共享訪問,緩存數(shù)據(jù)重用和訪問緩存沖突的機(jī)會(huì)更大。因此中間層的緩存技術(shù)跟客戶端的緩存技術(shù)有一定的區(qū)別。3.3.2持久層的緩存范圍持久層的緩存一般都是作為應(yīng)用服務(wù)器的組件存在。其工作過程如下:客戶端向應(yīng)用服務(wù)器提出查詢請求;應(yīng)用服務(wù)器將查詢請求提交給持久層緩存處理。如果持久層緩存能夠滿足查詢,則它從緩存中提取查詢結(jié)果并返回給客戶端。否則,持久層緩存將查詢或通過分析變換查詢生成的子查詢交給數(shù)據(jù)庫服務(wù)器處理。在接收到查詢請求之后,數(shù)據(jù)庫服務(wù)器將查詢結(jié)果返回給持久層緩存。如果數(shù)據(jù)庫服務(wù)器處理的是子查詢,持久層緩存將本地查詢結(jié)果和數(shù)據(jù)庫服務(wù)器的返回結(jié)果合并,得到

57、最終結(jié)果。持久層緩存通過應(yīng)用服務(wù)器將最終查詢結(jié)果返回客戶端。持久層的緩存范圍決定了緩存的生命周期以及可以被誰訪問。緩存的范圍可以分為三類:1.事務(wù)范圍:緩存只能被當(dāng)前事務(wù)訪問。緩存的生命周期依賴于事務(wù)的生命周期,當(dāng)事務(wù)結(jié)束時(shí),緩存也就結(jié)束了生命周期。緩存的物理介質(zhì)為內(nèi)存。每個(gè)事務(wù)都有獨(dú)自的緩存,緩存內(nèi)的數(shù)據(jù)通常采用相互關(guān)聯(lián)的對象形式。在同一事務(wù)的緩存中,持久化類的每個(gè)對象具有唯一的oid。2.進(jìn)程范圍:緩存被進(jìn)程范圍內(nèi)的所有事務(wù)共享。這些事務(wù)有可能并發(fā)訪問緩存,因此必須對緩存采取必要的事務(wù)隔離機(jī)制。緩存的生命周期依賴于進(jìn)程的生命周期,當(dāng)進(jìn)程結(jié)束,緩存也就結(jié)束生命周期。進(jìn)程范圍內(nèi)的緩存可能會(huì)存放大量數(shù)據(jù),它的物理介質(zhì)可以是內(nèi)存或硬盤。緩存內(nèi)的數(shù)據(jù)既可以采用相互關(guān)聯(lián)的對象形式,也可以采用對象的散裝數(shù)據(jù)形式。對象的散裝數(shù)據(jù)類似于對象的序列化數(shù)據(jù),但是把對象分解為散裝數(shù)據(jù)的算法通常較之對象的序列化算法更快。在進(jìn)程范圍的緩存中,如果數(shù)據(jù)按照相互關(guān)聯(lián)的對象形式存放,那么持久化類的每個(gè)對象都具有唯一的oid。這種數(shù)據(jù)存放形式的優(yōu)點(diǎn)是節(jié)省內(nèi)存。但是在并發(fā)環(huán)境中,當(dāng)執(zhí)行不同事務(wù)的各個(gè)線程同時(shí)長時(shí)間操縱同一個(gè)對象時(shí),必須對這些線程進(jìn)行同步,而同步會(huì)影響并發(fā)性能,并且很容易導(dǎo)致死鎖,所以在進(jìn)程范圍內(nèi)不提倡這種數(shù)據(jù)存放形式。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論