Hibernate框架在電子商務網站中的應用研究_第1頁
Hibernate框架在電子商務網站中的應用研究_第2頁
Hibernate框架在電子商務網站中的應用研究_第3頁
Hibernate框架在電子商務網站中的應用研究_第4頁
Hibernate框架在電子商務網站中的應用研究_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、hibernate框架在電子商務網站中的應用研究 hibernate框架在電子商務網站中的應用研究摘要在如今的軟件開發領域,面向對象技術、數據庫技術以及組件復用技術以及被廣泛應用。面向對象技術作為接機真實客觀世界的開發概念,使程序代碼更易讀,設計更合理。軟件體系架構的目的是為了實現軟件復用。軟件復用的思想是將軟件看成是由不同功能部件組成的有機體,每一個組件可以被設計成能夠完成同類工作的通用工具。一個合理的體系架構可以大大提高系統的可擴充性、可維護性,同時也便于任務的劃分。另外這種穩定的體系架構還可以移植到其他的系統中。在實際的系統開發中面向對象技術與關系數據庫技術是主要技術,開發人員通常把這兩

2、種技術的結合應用作為首選,可是面向對象技術是基于對象的相關理論而關系數據庫技術是基于關系理論尤其是代數中的集合論,理論基礎的不同直接導致了兩種技術的不匹配。需要一種解決不匹配的策略,于是對象關系映射(object relation mapping-orm)應運而生。hibernate是目前開發人員普遍推崇的orm工具,這是一個基于java開放源代碼的orm框架,對jdbc進行了輕量級的對象封裝,使java程序員可以隨心所欲的使用面向對象編程思維來思維操縱數據庫。本文介紹了面向對象技術和關系數據庫技術的基礎,介紹了通常的數據訪問模式,介紹了目前比較流行的orm中間件,然后詳細闡述了hiberna

3、te框架的體系結構和基本原理,最后通過應用struts和hibernate框架技術開發網上購物系統,研究和分析了hibernate技術在實際開發中的應用。關鍵詞:對象關系映射;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 co

4、mponent technology are already 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

5、designed as a common tool 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-orien

6、ted technology is based 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 ma

7、pping arises at the same 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

8、. it makes java programmer 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 arch

9、itecture and basic principles 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; j2ee53目錄1緒論

10、11.1研究背景11.2研究現狀12.對象持久化的論述32.1面向對象技術和關系數據庫技術的基本理論32.1.1面向對象技術的基本理論32.1.2 關系數據庫的基本理論32.2 數據訪問模式42.2.1 業務邏輯與數據邏輯耦合模式42.2.2 主動域對象模式42.2.3 orm模式42.3 持久層的概念52.4 常用的持久層中間件62.5 本章小結73 hibernate實現對象持久化的原理83.1 hibernate的運行機制93.2 hibernate映射策略113.2.1 實體映射的策略113.2.2實體關聯關系映射的策略143.3 hibernate的緩存性能優化163.3.1 持久層

11、的緩存技術163.3.2持久層的緩存范圍163.3.3 hibernate的二級緩存183.4 本章小結:204.網上數碼港系統的實現214.1網站的需求分析214.2網站的開發環境和開發技術214.3 網站的總體設計214.3.1模塊設計214.3.2 數據庫設計254.3.3 系統架構設計264.4 基于hibernate的網站持久層的設計274.5 網上數碼港網站購物模塊的實現314.6本章小結335總結和展望34參考文獻35致謝36附錄a:購物模塊持久層的hibernate實現代碼371緒論1.1研究背景在如今的企業級應用開發環境中,面向對象的開發方式已成為主流。作為接近真實客觀世界的

12、開發概念,面向對象使程序代碼更易讀、設計更合理。一方面,面向對象技術的理想存儲機制一面向對象數據庫還不成熟;另一方面,關系數據庫是目前使用最廣泛的數據庫,因此,在開發過程中通常會采用面向對象的應用和關系數據庫相結合的方式。面向對象技術和關系數據理論基于不同的理論基礎,前者基于耦合、內聚和封裝等軟件工程概念,后者基于數學理論,特別是集合論,使得二者在協同工作時出現不匹配現象。例如:關系模型沒有現成的表達對象繼承的概念;如果查詢完全用sql編寫,則無法明確它們與對象的關系;關系模型支持的數據類型過于簡單,如整型,實型,等等,不能描述事物的復雜屬性。通過直接內嵌sql或者數據訪問類的方法可以解決面向

13、對象技術和關系數據庫不匹配的問題。前者是通過直接在類的源代碼中嵌入sql語句來實現對象到關系數據庫的映射和存儲,這種方法比較簡單,易于實現。但是它造成了應用程序和數據庫結構的直接耦合,違反了軟件工程的原則。后者是把所有的sql語句封裝起來,封裝在一個或多個“數據處理類”中,較之第一種方法有所改進,仍然沒有完全消除應用程序和關系數據庫的耦合。一個更好的解決方案是在應用程序的業務邏輯層和數據庫層之間構建一個持久層,由持久層來提供對象一關系映射服務,封裝數據訪問細節。采用持久層的方法可以從根本上消除應用程序和關系數據庫的耦合,使得數據訪問對于應用程序的源代碼是透明的,如果數據庫的庫表結構發生改動,只

14、需要對持久層的配置文件做適當修改,不會對應用程序造成影響。1.2研究現狀在軟件系統開發過程中,數據和過程幾乎都是不可或缺的基本要素。數據是靜態的因素,而過程是動態的因素,是對數據的處理流程。在傳統的系統開發方法中,由于過程與數據的分離,隨著專門針對過程處理的高級程序設計語言的出現,相應地也出現了專門針對數據持久的文件系統和數據庫管理系統等技術。但是隨著數據和過程在細粒度上緊耦合成對象,那么最理想的狀態就是把專門針對過程處理的高級程序設計語言和專門針對數據持久的數據庫管理系統技術在細粒度上也耦合起來,從而發展出一種新的具有持久化功能的對象。無疑這一意義上的對象具備了對象持久的先天優勢,但這勢必要

15、求拋棄舊有技術而發展出一種新的對象技術,而這又是人們的思想一時不能接受的。因而現階段在實現對象持久化上并沒有采用這種徹底的面向對象技術,而是保留了現有數據持久化技術,以通過保留對象狀態再還原的方式來變相實現對象持久化。目前軟件系統通常采用了多種不同機制來實現對象持久存儲,而這些機制中又以支持事務處理、技術相對成熟的關系數據庫存儲機制尤為普遍。在j2ee平臺下,提供了多種數據持久化的實現機制,如jdbc,ejb,hibernate等。這些技術在整個市場中都占有一定的份額。jdbc是java數據訪問最原始、最直接、效率最高的方法,在目前許多中小型項目中仍然采用這種方式。ejb曾經是j2ee領域的核

16、心,目前也有許多項目是基于ejb的。但是實現起來的復雜性往往使人望而卻步。hibernate是近年來數據持久化的熱門技術,它有效地解決了對象和關系之間的阻抗不匹配問題,通過底層封裝了數據持久的代碼,為開發人員提供了真正的面向對象的開發方法。在數據訪問處理方面,目前業界比較慣用的有三種模式業務邏輯與數據訪問細節耦合的模式、基于主動域對象的模式、基于對象關系映射的模式。這三種模式的區別主要在于數據訪問細節的封裝上。基于對象關系映射的模式是目前數據訪問處理方面比較新穎的模式,也是越來越受青睞的模式。在多層體系結構的數據層的設計上,為了獲取較高的穩定性、較好的可擴充性,開發人員常常會借用設計模式這把利

17、器來獲得較好的設計效果。軟件的分層體系結構已由最初的兩層結構發展到了三層甚至四層或更多層結構,層次結構的劃分,使系統的易開發性,可維護性,可移植性,可擴展性,都得到了很大的提升。2.對象持久化的論述2.1面向對象技術和關系數據庫技術的基本理論2.1.1面向對象技術的基本理論面向對象技術代表了一種全新的程序設計思路和觀察、表述、處理問題的方法,與傳統的面向過程的開發方法不同,它力求符合人們日常自然的思維習慣,降低、分解問題的復雜性,提高整個求解過程的可控性、可監測性和可維護性,從而達到以較小的代價和較高的效率獲得較滿意效果的目的。面向對象技術最初是從面向對象的程序設計開始的,隨著面向對象程序設計

18、語言的發展,產生了面向對象的軟件工程學,面向對象的開發已成為當今軟件開發的主流方法。面向對象數據模型是由類來構成的層次結構,層次結構是指類與類之間的繼承關系。面向對象的數據模型是用面向對象的觀點來描述現實世界實體的邏輯組織、對象間限制、聯系等的模型。它將現實世界的所有實體都作為對象來處理,對象的屬性表示了對象的狀態和特征,而對象的操作表示了對象的行為方式。操作包括接口說明和實現兩部分,接口說明聲明了該操作的名稱、參數列表、返回類型等實現是通過某種具體語言編寫的代碼完成具體操作。外界只能通過消息與對象進行通信,消息按照對象中的方法說明規定的形式傳給對象,對象接收此消息后調用相應的操作,操作完成后

19、再以消息的形式返回操作結果。面向對象的數據模型能方便自然地模擬現實世界,對象內部數據及方法實現方式的變化不影響對象外界的使用,提高了數據的獨立性。方法的訪問與實現部分分離有利于保證數據的完整性和安全性,外界不能直接訪問修改對象內部數據。2.1.2 關系數據庫的基本理論關系是基于數學原理,特別是基于集合論的原理。關系模型是目前數據庫系統中應用最為廣泛的數據模型。相對于網狀模型和層次模型,關系模型有其自身的優勢,關系模型有嚴格的數學基礎、概念簡單清晰、非過程化程度高、數據具有獨立性、更有利于數據管理和數據檢索。關系模型由關系數據結構、關系操作集合和關系完整性約束三部分組成。關系模型的數據結構非常單

20、一,現實世界的實體以及實體之間的各種聯系均用關系來表示。關系模式是關系的描述,關系是關系模式在某一時刻的狀態或內容。關系模式是靜態的、穩定的,而關系是動態的、隨時間不斷變化的,因為關系操作在不斷地更新著數據庫中的數據。在用戶看來,關系模型中數據的邏輯結構就是一張二維表。2.2 數據訪問模式目前大多數的應用系統采用數據庫作為數據存儲的工具,而數據的處理則是通過應用程序來實現的。該部分數據訪問模式的研究是基于關系數據庫的。根據數據訪問在程序中所處的位置,可以將數據訪問模式分為三種:業務邏輯與數據訪問耦合模式,主動域對象模式,對象關系映射模式。2.2.1 業務邏輯與數據邏輯耦合模式由于業務邏輯和數據

21、訪問邏輯的代碼都寫在一個類中,因此這種模式稱為業務邏輯與數據邏輯耦合模式。這種模式的優點是直接、訪問效率高。在多層體系結構中,層次與效率是不可兼得的兩方面,層次越多效率越低。由于這種方式直接跟數據庫打交道,避免了中間的訪問環節,因此效率上是比較高的。缺點是可維護性差、可重用性差。業務邏輯與數據訪問邏輯代碼混合在一起,一是使得程序的可讀性差、維護起來困難,二是存在大量的重復代碼而無法重用。2.2.2 主動域對象模式在該模式中,數據訪問的細節位于實體域對象中。在實現中封裝了關系數據模型和數據的訪問細節,由實體域對象負責自身的數據訪問細節,這種實體域對象也被稱為主動域對象。過程域對象只包含業務邏輯,

22、通過對主動域的引用完成數據訪問操作。這種模式的優點是解耦應用程序代碼和數據模型、可維護性較好。由于過程域對象中只有業務處理邏輯代碼,而沒有包含任何的數據訪問代碼,關于數據模型的操作是由主動域自身完成的,因此數據模型的改變不會影響到業務邏輯。缺點是數據訪問分布在多個域對象中,限制了應用程序對數據訪問的控制。每個主動域對象都負責數據訪問實現,這就意味著采用全局性的數據訪問策略需要在每個主動域對象中重復相似的代碼。2.2.3 orm模式在這種模式中,數據訪問細節被封裝在一個被稱為持久層的層次中,而實體域對象只包含業務數據,過程域對象只包含業務邏輯。在這種模式中實現數據的訪問需要借助第三方的對象關系映

23、射工具來完成。這種模式的優點是應用程序代碼清晰,與包含數據模型和數據訪問細節的代碼相比,單純處理域對象的應用程序代碼更加清晰,也更容易開發和維護。對象關系映射機制隔離了可配置的映射元數據,可以在不影響應用程序代碼的情況下修改元數據。許多對象關系映射產品在運行時保存和解釋映射元數據,元數據的變化不需要重新編譯任何代碼。缺點是限制了應用程序對數據訪問的控制,應用程序只能通過持久化管理類來調用定義的接口,難以調整物理數據庫操作和資源管理以優化特定應用程序的數據訪問功能。orm中間件能在任何一個java應用的業務邏輯層和數據庫層之間充當橋梁(參見圖2-1).圖2-1 orm充當業務邏輯層和數據庫層之間

24、的橋梁2.3 持久層的概念什么是持久層呢?在定義持久層之前,我們先來了解下“持久”的含義。這里的持久是保持很久的意思。具體點就是:把應用程序中的對象的屬性和狀態保存到數據庫或文件系統中,讓對象的屬性和狀態在對象的生命周期結束后任然可以保持很久,以便將來可以根據數據庫中的數據來恢復對象,再次使用。而持久層就是實現對象持久化的一個邏輯層次。這個層次的程序代碼專門負責實現對象持久化的功能,所以的對象持久化代碼都在這個層次實現,這個層次的程序代碼出來對象持久化的功能之外沒有其他功能。現在的軟件架構一般都分為三個層次:表示層,業務邏輯層,數據邏輯層(即持久層)。就像前面所說的三種數據訪問模式,第一種是把

25、業務邏輯代碼和數據訪問邏輯代碼混合在一起,根本不能分出數據訪問的層次來。所以這種模式雖然有持久功能,但卻沒有形成持久層。第二中主動域模式把業務邏輯和數據訪問邏輯初步分開來了,初步形成了持久層,就是主動域層。第三種orm映射模式形成了比較完善的持久層,這個持久層通常叫數據訪問對象層。采用持久層的方法(如圖2-2)可以從根本上消除應用程序和關系數據庫的耦合。它使得數據對于應用程序的源代碼是透明的,如果修改數據庫的庫表結構,不會對應用程序造成影響,也不用改動持久層的代碼。它還有一個優點就是將程序員從sql語言中解放出來,程序員無需了解數據庫的結構。這種方法適合用于大規模的工程項目,因為它可維護性高,

26、可移植性好。其缺點是對應用系統的性能上有所影響。如果持久層設計的比較合理,這種影響會很小。圖2-2 持久層的使用2.4 常用的持久層中間件當一個軟件架構有清晰的持久層時,他的可維護性,可擴展性,可移植性都大大增強。又由于現在軟件編程中面向對象技術和關系型數據庫的廣泛應用,具有orm能力的持久層就變得非常實用,對于企業應用的系統開發人員,花費大量的時間自行開發持久層不是很可行。目前,在持久層領域,已經出現了許多持久化中間件可以幫助人們完成持久層的開發工作,用戶可以根據自己的需求進行選擇,并進行二次開發。這里介紹常用的持久化中間件。 1. toplinktoplink是一個較早期的持久化中間件產品

27、,最初面向c+,后來實現了java的映射。toplink性能優異,功能強大,并且提供了獨特的查詢過濾器機制,對關系的處理和查詢都非常有效,于是,toplink逐漸從商用。o/r mapping產品中勝出,成為市場上的最出色的映射產品。toplink雖然強大,但它價格高昂,讓很多用戶望而卻步。 2. castor castor是exolab組織開發的面向java的持久化工具,它最大的特色就是實現了大部分的odmg oql規范,在查詢上,可以像使用對象數據庫一樣對類圖進行查詢。它的原理是通過java反射api去實現屬性的設置和讀取。不過由于各種原因,castor后來的版本更新越來越慢,至今未出到1

28、.0正式版。3. apache torqueapache torque是一個使用關系數據庫作為存儲手段的java應用程序持久化工具,是apache的公開源代碼項目。torque是一個開源項目,由web應用程序框架jakarta apache turbine發展而來,但現在已完全獨立于turbine. torque主要包含兩部分:一部分是generator,它可以產生應用程序需要的所有數據庫資源,包括sql和java文件;另外一部分是runtime,提供使用這些代碼訪問數據庫的運行環境。目前torque支持的數據庫包括db2, sql server, oracle, postgresql等。 4

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

30、大減少。(3)開源免費的license,可以在需要的時候研究源代碼,改寫源代碼,進行功能的定制。(4)輕量級封裝,避免引入過多復雜的問題,容易調試,減輕程序員的負擔。(5)具有可擴展性,api開放,當自身功能不夠用的時候,可以自行編碼擴展。(6)開發者活躍,產品有穩定的發展保障。 6. ibatis使用ibatis提供的orm機制,對業務邏輯實現人員而言,面對的是純粹的java對象,這一層與通過hibernate實現orm而言基本一致,而對于具體的數據操作,hibernate會自動生成sql語句,而ibatis則要求開發者編寫具體的sql語句。相對hibernate等“全自動”orm機制而言,

31、ibatis以sql開發的工作量和數據庫移植性上的讓步,為系統設計提供了更大的自由空間。作為“全自動”orm實現的一種有益補充,ibatis的出現顯得別具意義。此外還有speedo,xorm,cayenne等,在這里就不介紹了。2.5 本章小結本章通過介紹面向對象技術和關系數據庫技術的基本理論,軟件架構中持久層的應用,引導到持久層的orm的應用,并且介紹了多種常用的持久層中間件,為詳細了解下一章的hibernate框架做好準備。3 hibernate實現對象持久化的原理hibernatehibernate2hibernate3相關工具實際應用理論思想tanghan eclipse plugin

32、jertroller weblogger眾多金融/erp等應用terac board/miracle每月下載量200萬,幾乎是事實上的orm標準實現andromdamiddlegenxdoclet hibernate tagshibernate consolehibernate synchronizer一個類跨越多個表支持手寫sql屬性延遲加載映射到xml文檔jmx支持通過query大批量更新/刪除虛擬條件脫離session的criterriaapi更靈活的類與表的映射關系,幾乎沒有限制一張表容納多個類、每個表一個類的映射選擇一對多、多對多關聯集合的透明映射直接sql查詢組件(componen

33、t)的支持兩級緩存自動主鍵管理持久層概念orm資源管理模式設計模式具體版本圖3-1 hibernate的體系結構圖3.1 hibernate的運行機制hibernate是一個基于java的開放源代碼的持久化中間件,它對jdbc做了輕量級封裝,不僅提供orm映射功能,還提供數據緩存和數據查詢功能,java開發人員可以方便的通過hibernate api來操縱數據庫。圖3-2闡述了hibernate的運行機制圖3-2 hibernate的運行機制hibernate從其配置文件中讀取和數據庫連接有關的信息,這個配置文件應該位于應用的classpath中。hibernate的配置文件有兩種形式:一種是

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

35、他類的關系。在運行時,hibernate將根據它生成各種sql語句。ddl即數據庫定義文件。hibernate對于這三種文件的生成具有強大的靈活性,只要知道任何一種文件,都可以通過hibernate提供的代碼自動生成工具得到另外兩種文件。如:1)只有映射文件:mapping file -hbm2java-java-schema export- ddl2)只有ddl: ddl-middlegen-hbm- hbm2java-java3)只有java: java-xdoclet-hbm- schema export - ddl如上圖所示,如果事先設計好了ddl,就可以利用middlegen自動生成

36、*.hbm.xml文件。如果先完成了映射文件,就可以先實例化configuration類,然后利用addclass()映射*.hbm.xml。再在a處調用configuration. getproperties,檢查所使用的數據庫,表的關聯性,外鍵約束性,和一對多關系的設置。最后在b處利用schemaexport類在數據庫中創建相應的表結構。在圖中還可以看到hibernate的初始化過程,包括如下步驟:1)創建一個configuration類的實例: configuration config = new configuration();該方法會調用environment類的getpropert

37、ies方法,從而把默認文件路徑下的perties(或hibernate.cfg.xml )配置文件中的配置信息讀入到內存。 2)調用configuration類的addclass()方法: config.addclass(class persistentclass);該方法把默認文件路徑下的persistentclass映射文件中的映射信息讀入到內存中 3)如c處所示,調用configuration類的buildsessionfactory()方法:sessionfactory = config.buildsessionfactory();該方法使用數據庫的jdbc的

38、驅動連接數據庫,查看所用數據庫連接池,同時檢驗jndi等的配置情況,最后創建一個sessionfactory實例,并把configuration對象包含的所有配置信息拷貝到sessionfactory對象的緩存中。由于java語言是純面向對象的語言,因此不可能像c語言那樣直接操縱內存例如聲明一段可用的內存空間。這里的緩存其實指的是java對象的屬性(通常是一些集合類型的屬性)占用的內存空間。例如,sessionfactory的實現類中定義了許多集合類型的屬性,這些屬性用于存放hibernate配置信息、映射元數據信息等。hibernate在初始化階段,會根據映射文件的映射信息,為所有的持久化類

39、預定義以下sql語句:1) insert語句:insert into表名(字段1,字段2,)values(?,?,.)2) update語句:update表名set字段1=?,字段2=?,where id=?3) delete語句:delete from表名where id=?4)根據oid來檢索持久化類實例的select語句:select字段1,字段2,.from表名where id=?以上sql語句中的問號代表jdbc preparedstatement中的參數。這些sql語句都存放在sessionfactory的緩存中,當執行session的save(), update(),delete

40、q, load()方法時,將從緩存中找到相應的預定義sql語句,再把具體的參數值綁定到該sql語句中。初始化過程結束后,調用sessionfactory實例的opensession()方法來獲得session實例,然后通過它執行訪問數據庫的操作。session接口提供了操縱數據庫的各種方法,如:1) save()方法:把java對象保存數據庫中。2) update()方法:更新數據庫中的java對象。3) delete()方法:把java對象從數據庫中刪除。4) load()方法:從數據庫中加載java對象。5) createquery()方法:從數據庫中查詢java對象。session是一個

41、輕量級對象。通常將每一個session實例和一個數據庫事務綁定,也就是說,每執行一個數據庫事務,都要先創建一個新的session實例。如果事務執行中出現異常,應該撤銷事務。不論事務執行成功與否,最后都調用session的close()方法,從而釋放session實例占用的資源。至此,已對hibernate的運行機制有了大概的了解,下面將具體分析hibernate如何實現對象關系映射orm。3.2 hibernate映射策略 o/r映射技術是orm中間件中最為關鍵的組成部分,也是開發過程中必須時刻關注的內容。下面,討論hibernate中o/r映射技術的實現策略。3.2.1 實體映射的策略實體映

42、射技術作為類與表之間的聯系紐帶,在orm實現中起著至關重要的作用。hibernate中,實體映射主要包括以下3部分內容:1.類一表映射在簡單的情況下,一個類映射成一張表。所謂簡單情況,就是說這個類不與其它的類存在繼承關系。在這里主要討論如何在關系數據庫中實現類的繼承。繼承關系是關系型數據與面向對象數據結構之間的主要差異之一。如何在關系型數據庫基礎之上,通過繼承關系得到清晰合理的層次劃分是hibernate實體層次設計中的一個關鍵問題。hibernate中支持3種類型的繼承形式:1)繼承關系樹的根類對應一個表(table-per-class-hierarchy):如圖3-3所示,父類和所有的子類

43、公用一個表,該表需要有一個簡單列充當類型判斷的角色。用類型鑒別器(discriminator)來判斷表中的每條記錄是什么類型,映射成對應的子類。優點:查詢簡單。缺點:多個子類公用一個表,造成表結構復雜,且很多字段置空。圖3-3 table-per-class-hierarchy2)繼承關系樹的每個具體類對應一個表(table-per-subclass ):如圖3-4所示,在具體類對應的表中,不僅包含和具體類的屬性對應的字段,還包含和具體類的父類的屬性對應的字段。即父類的公共屬性出現在每一個子類表中。需要注意的是,實現時在每個子類的xml文件中都要映射從父類繼承的關聯關系。優點:沒有數據冗余:如

44、果只是查詢某個子類,那么是簡單且高效的。缺點:不能很好的支持多態關聯,每個子類都是獨立的,查詢所有內容時,要分別從各個子類表中查詢,然后將查詢結果合并到一起,這對性能有壞的影響。圖3-4 table-per-subclass3)繼承關系樹的每個類對應一個表(table-per-concret-class ):如圖3-5所示,在關系數據模型中用外鍵參照關系來表示繼承關系。首先為公用字段創建一個表,每個subclass特有的屬性分別創建一個表。這樣一個完整的subclass就是公用表+子類表。優點:最符合面向對象的概念;類映射到數據庫中的表的創建工作是所有實現中最簡單的,表中只需包含自己的所有屬性

45、即可;對多態的支持最好,對于對象所可能充當的角色僅需要在相應的表中保存記錄;父類和子類之間的耦合度大大降低,易于修改父類和增加新的類。數據庫的空間被有效利用,不存在大量的數據冗余。缺點:每次取一個對象都要通過關聯查詢進行,性能較差。圖3-5 table-per-concret-class 如果不需要支持多態查詢和多態關聯,可以采用“table-per-subclass”的映射方式,如果需要支持多態查詢和多態關聯,并且子類包含的屬性不多,可以采用“table-per-class-hierarchy”的映射方式,如果需要支持多態查詢和多態關聯,并且子類包含的屬性很多,可以采用“table-per-

46、concret-class”的映射方式。如果繼承關系樹中包含接口,可以把它當作抽象類來處理。2.映射oidjava語言按內存地址來標識或區別同一個類的不同對象,而關系數據庫按主鍵值來標識或區別同一個表的不同記錄。hibernate使用oid來統一兩者之間的矛盾,oid是關系數據庫中的主鍵(通常為代理主鍵)在java對象模型中的等價物。在運行時,hibernate根據oid來維持java對象和數據庫表中記錄的對應關系。為了保證持久化對象的oid的唯一性和不可變性,通常由hibernate或底層數據庫來給oid賦值。因此,可以把oid的setid()方法設為private類型,以禁止java應用程

47、序隨便修改oid。而把getid()方法設為public類型,這使得java應用程序可以讀取持久化對象的oid。hibernate提供了標識符生成器接口identitygenerator接口,并且提供了多種內置的實現,例如:increment, identity, sequence等。3.屬性一字段映射屬性一字段映射將映射類屬性與庫表字段相關聯。下面將類屬性分成三種情況進行討論。 1)屬性類型可以直接映射到某個hibernate映射類型: 只要在xml文件中指定pojo的屬性名、庫表字段名以及數據類型,hibernate就可以透明地實現對應的映射。 2)屬性是java集合類型: 按照集合的數據

48、結構劃分,java集合可分為三類:set, list和map o hibernate允許把以上三種java集合都映射到數據庫中,在映射文件中,與映射java集合相關的元素包括, , 和。需要指出的是在java集合api中并沒有提供bag接口,hibernate允許在持久化類中用list來模擬bag的行為。對于每一種集合接口,hibernate都提供了內置的實現類,這些實現類都在collection包里。當session從數據庫中加載java集合時,會創建內置集合類的實例。3)屬性本身也是一個類:hibernate在映射類屬性時區別對待值類型類和實體類型類。值類型和實體類型的最重要的區別是前者沒

49、有oid,不能被單獨持久化,它的生命周期依賴于所屬的持久化類的對象的生命周期;而實體類型有oid,可以被單獨持久化。如果屬性類是值類型,即聚集(組成)關系映射。在創建映射文件時,不能使用元素來映射屬性,而要使用元素。如:a的某屬性b是值類型的類,則a在數據庫中對應的表的字段會包含b的所有屬性,b的屬性直接映射到a的映射表的相應字段。 如果屬性類是實體類型的,即多對一關聯關系的映射,下面會有詳細介紹。3.2.2實體關聯關系映射的策略 在前面的內容中,討論了基于hibernate的實體映射技術的基礎知識。對于orm而言,另外一個非常關鍵的特性,就是對實體之間關聯關系的管理。下面就一對一、一對多以及

50、多對多的關聯關系分別進行討論。 1.一對一關聯 hibernate提供了兩種映射一對一關聯關系的方法:按主鍵映射和按外鍵映射。1)按主鍵映射:這種映射方式就是兩張關聯表通過共享主鍵形成一對一映射關系。只需為一張表設定主鍵生成器,而另一張表的主鍵與之共享相同的主鍵值。hibernate通過。ne-to-one節點進行聲明。但如果某兩個類之間有多個一對一關聯,這種方法就不適用了,此時可以采用按外鍵映射的方法。 2)按外鍵映射:這種映射方式就是將一張表的主鍵作為另一張表的外鍵。hibernate通過many-to-one節點進行聲明。因為唯一外鍵關聯的一對一關系只是多對一關系的一個特例。2.一對多關

51、聯一對多關聯在系統實現中非常常見。一對多關系分為單向一對多關系和雙向一對多關系。單向一對多關系只需在“一”方進行配置,雙向一對多關系需要在關聯雙方均加以配置。對于單向一對多關聯關系,hibernate提供了集合屬性的映射支持。實現相對比較簡單。但是存在一個問題,由于是單向關聯,為了保持關聯關系,只能通過主控方對被動方進行級聯更新。如果被關聯方的關聯字段為“not null”,當hibernate創建或者更新關聯關系時,可能出現約束違例。此外,由于hibernate實現機制中,采用了兩條sql語句進行一次數據插入操作,相對單條insert操作,幾乎是雙倍的性能開銷,效率較低,因此,對于性能敏感的

52、系統而言,這樣的解決方案所帶來的開銷可能難以承受。雙向一對多關聯的出現則解決了上面單向關聯的問題。它除了避免約束違例和提高性能的好處之外,還帶來另外一個優點,由于建立了雙向關聯,可以在關聯雙方中任意一方,訪問關聯的另一方,這提供了更豐富靈活的控制手段。雙向一對多關聯,實際上是“一對多”與“多對一”關聯的組合。也就是說必須在主控方配置單向一對多的基礎上。在被控制方配置與其對應的多對一關系。需要注意的是,此時hibernate通過把集合元素的inverse設置為true,將關聯關系的維護工作交給“多方”,而“一方”的關聯只是“多方”的鏡像。hibernate僅按照“多方”的對象狀態的變化來同步數據

53、庫更新。3.多對多關聯hibernate關聯關系中相對比較特殊的就是多對多關聯。多對多關聯與一對一和一對多關聯不同,他需要借助中間表完成多對多映射信息的保存。關聯表包含關系中涉及到多張表的主鍵,也就是每個表中某個對象的oid,每條記錄即這些oid的組合,表示哪些對象之間是存在關系。通過將這些表的主鍵關聯起來,實現兩個或者多個表之間的多對多關系。關聯表的實現有兩種方法:一種是關聯表的屬性包含關系中涉及表的主鍵,并且關聯表的主鍵是這些屬性的組合:第二種方法是將關聯表視為普通表,使用自己的主鍵,然后通過將屬性設置成外鍵和別的表關聯起來。3.3 hibernate的緩存性能優化緩存是提升系統性能的關鍵

54、因素。它的主要作用是減少1/o和計算,提高系統性能,通過緩存查詢結果來提高數據庫系統的整體性能在數據庫領域得到了廣泛應用。相對于內存操作而言,數據庫調用是一個代價高昂的過程,對于典型企業級應用結構:數據庫往往與應用服務器位于不同的物理服務器,這也就意味著每次數據庫訪問都是一次遠程調用,socket的創建與銷毀,數據的打包拆包,數據庫執行查詢指令、網絡傳輸上的延時,這些消耗都給系統整體性能造成了嚴重影響。此時,緩存的存在價值就凸顯出來了。特別是對于查詢操作繁復的系統而言,良好的緩存管理機制以及合理的緩存應用模式往往是性能提升的關鍵。緩存技術從應用結構上可以劃分為三類:數據庫服務器的緩存、客戶端的

55、緩存技術、中間層的緩存。在數據庫應用系統中這三類技術是可以結合使用的。關于數據庫服務器的緩存和客戶端的緩存在這里就不進行介紹了,這里主要介紹下中間層的緩存機制。3.3.1 持久層的緩存技術上個世紀九十年代出現的三層結構克服了兩層結構的局限性,將應用的表現邏輯、業務邏輯和數據處理相互分離。第三層位于客戶端和服務器方數據管理組件之間,負責管理執行業務邏輯,又稱為中間層或應用服務器。相對于兩層結構而言,三層結構既保留了原來c/s模式的優點,又提高了應用的可維護性、可擴展性和可重用性。但是三層結構中將數據管理與應用邏輯相分離又造成了用戶訪問數據的性能下降,妨礙了系統的可伸縮性。因此人們提出了在三層結構

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

57、緩存將本地查詢結果和數據庫服務器的返回結果合并,得到最終結果。持久層緩存通過應用服務器將最終查詢結果返回客戶端。持久層的緩存范圍決定了緩存的生命周期以及可以被誰訪問。緩存的范圍可以分為三類:1.事務范圍:緩存只能被當前事務訪問。緩存的生命周期依賴于事務的生命周期,當事務結束時,緩存也就結束了生命周期。緩存的物理介質為內存。每個事務都有獨自的緩存,緩存內的數據通常采用相互關聯的對象形式。在同一事務的緩存中,持久化類的每個對象具有唯一的oid。2.進程范圍:緩存被進程范圍內的所有事務共享。這些事務有可能并發訪問緩存,因此必須對緩存采取必要的事務隔離機制。緩存的生命周期依賴于進程的生命周期,當進程結束,緩存也就結束生命周期。進程范圍內的緩存可能會存放大量數據,它的物理介質可以是內存或硬盤。緩存內的數據既可以采用相互關聯的對象形式,也可以采用對象的散裝數據形式。對象的散裝數據類似于對象的序列化數據,但是把對象分解為散裝數據的算法通常較之對象的序列化算法更快。在進程范圍的緩存中,如果數據按照相互關聯的對象形式存放,那么持久化類的每個對象都具有唯一的oid。這種數據存放形式的優點是節省內存。但是在并發環境中,當執行不同事務的各個線程同時長時間操縱同一個對象時,必須對這些線程進行同步,而同步會影響并發性能

溫馨提示

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

評論

0/150

提交評論