關(guān)于Hibernate你必須知道的六個(gè)方面
一 歷史與背景
1 應(yīng)用程序的分層體系結(jié)構(gòu)
隨著計(jì)算機(jī)應(yīng)用軟件的發(fā)展,應(yīng)用程序逐漸由單層體系結(jié)構(gòu)發(fā)展為多層體系結(jié)構(gòu)。其中,三層結(jié)構(gòu)是目前典型的一種應(yīng)用軟件結(jié)構(gòu),如圖1左。
表述層:提供與用戶交互的界面,如GUI(圖形用戶界面),web頁(yè)面等;
業(yè)務(wù)邏輯層:負(fù)責(zé)各種業(yè)務(wù)邏輯,直接訪問數(shù)據(jù)庫(kù),提供對(duì)業(yè)務(wù)數(shù)據(jù)的保存、更新、刪除和查詢操作;
數(shù)據(jù)庫(kù)層:負(fù)責(zé)存放管理應(yīng)用的持久性業(yè)務(wù)數(shù)據(jù)
![]() |
三層結(jié)構(gòu)的特點(diǎn)是:所有下層向上層提供調(diào)用的接口,具體實(shí)現(xiàn)細(xì)節(jié)對(duì)上層透明。層與層之間存在自上而下的依賴關(guān)系,即上層會(huì)訪問下層的API,但下層不依賴于上層。
2 持久化層(如圖1右)
在圖1右中,分離出的持久化層封裝了數(shù)據(jù)訪問細(xì)節(jié),為業(yè)務(wù)邏輯層提供了面向?qū)ο蟮腁PI。
(1)什么叫持久化?
持久(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對(duì)象)保存到可永久保存的存儲(chǔ)設(shè)備中(如磁盤)。持久化的主要應(yīng)用是將內(nèi)存中的數(shù)據(jù)存儲(chǔ)在關(guān)系型的數(shù)據(jù)庫(kù)中,當(dāng)然也可以存儲(chǔ)在磁盤文件中、XML數(shù)據(jù)文件中等等。
(2)什么叫持久層?
持久層(Persistence Layer),即專注于實(shí)現(xiàn)數(shù)據(jù)持久化應(yīng)用領(lǐng)域的某個(gè)特定系統(tǒng)的一個(gè)邏輯層面,將數(shù)據(jù)使用者和數(shù)據(jù)實(shí)體相關(guān)聯(lián)。
(3)為什么要持久化?增加持久層的作用是什么?
數(shù)據(jù)庫(kù)的讀寫是一個(gè)很耗費(fèi)時(shí)間和資源的操作,當(dāng)大量用戶同時(shí)直接訪問數(shù)據(jù)庫(kù)的時(shí)候,效率將非常低,如果將數(shù)據(jù)持久化就不需要每次從數(shù)據(jù)庫(kù)讀取數(shù)據(jù),直接在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行操作,這樣就節(jié)約了數(shù)據(jù)庫(kù)資源,而且加快了系統(tǒng)的反映速度。
增加持久化層提高了開發(fā)的效率,使軟件的體系結(jié)構(gòu)更加清晰,在代碼編寫和系統(tǒng)維護(hù)方面變得更容易。特別是在大型的應(yīng)用里邊,會(huì)更有利。同時(shí),持久化層作為單獨(dú)的一層,人們可以為這一層獨(dú)立的開發(fā)一個(gè)軟件包,讓其實(shí)現(xiàn)將各種應(yīng)用數(shù)據(jù)的持久化,并為上層提供服務(wù)。從而使得各個(gè)企業(yè)里做應(yīng)用開發(fā)的開發(fā)人員,不必再來(lái)做數(shù)據(jù)持久化的底層實(shí)現(xiàn)工作,而是可以直接調(diào)用持久化層提供的API。
(4)目前在持久化層領(lǐng)域,實(shí)現(xiàn)模式有以下幾種:
A 業(yè)務(wù)邏輯和數(shù)據(jù)訪問耦合
B 主動(dòng)域?qū)ο竽J?/P>
C ORM模式
D JDO模式
E CMP模式
3 ORM介紹
ORM(Object Relational Mapping),即對(duì)象關(guān)系映射。
指以O(shè)/R原理設(shè)計(jì)的持久化框架(Framework),包括 O/R機(jī)制、SQL自生成、事務(wù)處理和Cache管理等。
ORM的實(shí)現(xiàn)思想就是將關(guān)系數(shù)據(jù)庫(kù)中表的數(shù)據(jù)映射成為對(duì)象,以對(duì)象的形式展現(xiàn),這樣開發(fā)人員就可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)這些對(duì)象的操作。因此它的目的是為了方便開發(fā)人員以面向?qū)ο蟮乃枷雭?lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
常用的ORM中間件有:
Apache OJB (http://db.apache.org/ojb/)
Cayenne (http://objectstyle.org/cayenne/)
Jaxor (http://jaxor.sourceforge.net)
Hibernate (http://www.hibernate.org)
iBatis (http://www.ibatis.com)
jRelationalFramework (http://ijf.sourceforge.net)
mirage (http://itor.cq2.org/en/oss/mirage/toon)
SMYLE (http://www.drjava.de/smyle)
TopLink (http://otn.oracle.com/products/ias/toplink/index.html)
其中 Hibernate 的輕量級(jí) ORM 模型逐步確立了在 Java ORM 架構(gòu)中領(lǐng)導(dǎo)地位,甚至取代復(fù)雜而又繁瑣的 EJB 模型而成為事實(shí)上的 Java ORM 工業(yè)標(biāo)準(zhǔn)。而且其中的許多設(shè)計(jì)均被 J2EE 標(biāo)準(zhǔn)組織吸納而成為最新 EJB 3.0 規(guī)范的標(biāo)準(zhǔn)。
二 Hibernate定義
Hibernate是一種Java語(yǔ)言下的對(duì)象關(guān)系映射解決方案。 它是一種自由、開源的軟件。它用來(lái)把對(duì)象模型表示的對(duì)象映射到基于SQL 的關(guān)系模型結(jié)構(gòu)中去,為面向?qū)ο蟮念I(lǐng)域模型到傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的映射,提供了一個(gè)使用方便的框架。
三 Hibernate的作用
Hibernate 不僅管理Java 類到數(shù)據(jù)庫(kù)表的映射(包括從Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時(shí)人工使用SQL 和JDBC 處理數(shù)據(jù)的時(shí)間。
它的設(shè)計(jì)目標(biāo)是將軟件開發(fā)人員從大量相同的數(shù)據(jù)持久層相關(guān)編程工作中解放出來(lái)。無(wú)論是從設(shè)計(jì)草案還是從一個(gè)遺留數(shù)據(jù)庫(kù)開始,開發(fā)人員都可以采用Hibernate。
四 Hibernate的應(yīng)用
Hibernate對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,它既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用。最具革命意義的是,Hibernate可以在應(yīng)用EJB(Enterprise JavaBeans是Java應(yīng)用于企業(yè)計(jì)算的框架)的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
五 Hibernate API簡(jiǎn)介
1 Hibernate API中的接口可以分為以下幾類:
(1) 提供訪問數(shù)據(jù)庫(kù)的操作的接口,包括session、Transaction、Query接口;
(2) 用于配置Hibernate的接口,Configuration;
(3) 間接接口,使應(yīng)用程序接受Hibernate內(nèi)部發(fā)生的事件,并作出相關(guān)的回應(yīng),包括:Interceptor、Lifecycle、Validatable;
(4) 用于擴(kuò)展Hibernate功能的接口,如UserType、CompositeUserType、IdentifierGenerator接口。
Hibernate內(nèi)部還封裝了JDBC、JTA(Java Transaction API)和JNDI(Java Naming And Directory Interface)。其中,JDBC提供底層的數(shù)據(jù)訪問操作,只要用戶提供了相應(yīng)的JDBC驅(qū)動(dòng)程序,Hibernate可以訪問任何一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)。JTA和JNDI使Hibernate能夠和J2EE應(yīng)用服務(wù)器集成。
2 Hibernate的核心接口框圖
![]() |
六 Hibernate的優(yōu)缺點(diǎn)
(1)優(yōu)點(diǎn):
a.Hibernate 使用 Java 反射機(jī)制 而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。
b.Hibernate 的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。
c. 它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
(2)缺點(diǎn):
Hibernate限制您所使用的對(duì)象模型。例如,一個(gè)持久性類不能映射到多個(gè)表。
【編輯推薦】