詳細分析Hibernate技術(shù)
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate技術(shù),包括介紹實體CMP-EJB等方面。
J2EE領(lǐng)域熱切的盼來了一種非常流行的開源技術(shù),它就是Hibernate技術(shù).這個技術(shù)被提升到JCP(一種Java規(guī)范組織)標準中去了。從J2EE開發(fā)者反饋的信息來看,掌握Hibernate知識是所有想在J2EE領(lǐng)域有所作為的人的必修課。
Hibernate是一個對象關(guān)系映射的技術(shù)。它是一個開源,并且免費的技術(shù),由SourceForge. Net開發(fā)。在過去,有許多的類似的對象關(guān)系映射技術(shù)。TopLink就是這樣的一種工具,后來被Oracle所采用。來自SourceForge的Hibernate和Apache的OJB也都是非常知名的對象關(guān)系工具,開源并且免費。JDO也要被歸為這一類。
Gavin King是Hibernate的負責(zé)人,而Craig Russell 和David Jordan是JDO的主要設(shè)計者,JDO是由SUN牽頭做的。由于一些技術(shù)的原因,今天JCP規(guī)范中的大多數(shù)成分有利于Hibernate,而不是JDO.從表面上它們沒有什么區(qū)別,語法和一些處理方法看起來大多數(shù)相同,但是,Hibernate的語法更簡單易學(xué)。
非常有趣的是Craig Russell為SUN工作,而Gavin King 為JBoss工作。資料表明JCP是一個非常民主的社區(qū)組織,SUN并沒有強制規(guī)定一些條條款款,保護自己的語言和企業(yè)級的用戶。
EJB-3是目前最新的版本,很大程度上受到了Hibernate的影響。一些讀者將EJB-3 和Hibernate等同起來。Oracle支持EJB-3提議,而它是j2ee領(lǐng)域中重要的數(shù)據(jù)庫公司,那么EJB-3前景就會很好。從J2EE這個名字本身,就能看出它是一種企業(yè)級的技術(shù),并且EJB本質(zhì)上就是針對這些企業(yè)級的應(yīng)用,由于存在提供的內(nèi)置容器服務(wù),只有Hibernate和EJB聯(lián)合使用,Hibernate才能凸顯其重要性,因此Hibernate轉(zhuǎn)向到EJB是不可避免的。
EJB有三種類型的Bean.一種類型是會話Bean,存在于企業(yè)容器中,可以被認為是一種功能Bean,以RMI-IIOP方式調(diào)用。
ORM工具有時和會話Bean一起使用。最近主要的問題是過去ORM工具具有所有權(quán)的、價格昂貴的問題。但是現(xiàn)在,可靠、開源的ORM工具可以得到,并且Richard Monson Haefel承認使用ORM工具,替代實體bean,是一種非常安全、并且很有開發(fā)效率的方法。
另外一個類型實體Bean就沒有這么走運了。EJB-1. 1、 EJB-2. 0和隨后的EJB-2. 1在關(guān)于實體Bean規(guī)范方面做了許多的改變。
我們能夠說實體bean是一個“Attribute bean”或者'property-bean',帶有setter 和getter方法,以RMI-IIOP方式調(diào)用,存在于企業(yè)容器中。定義一個Javabean的方式是Java中經(jīng)常提到的話題。同樣的方式也要出現(xiàn)在BDK,、EJB-Entity beans,、Struts、JSF 和現(xiàn)在的Hibernate技術(shù)中。所以,如何定義Javabean是非常重要并且很有藝術(shù)性的。
第三中類型就是通信和MDB.從企業(yè)這兩個字就看出這里面應(yīng)用程序里面涉及了很多的用戶和并發(fā)事務(wù),RPC形式非常像打電話,容易導(dǎo)致“占線” 問題。如果你所呼叫的人正在給別人的打電話,那么這個時候就導(dǎo)致了線路阻塞。但是,通信的樣式中,如在email中,至少要保證信息發(fā)送出去。很明顯 RPC是不合適的,被夸大了。有時,我需要即時響應(yīng)。由于一些原因,即使像XML web服務(wù),如果問題很嚴重的話,也應(yīng)該采用同新樣式。MDB(消息驅(qū)動bean)事實上越來越被接受。
因此,為什么單單實體bean發(fā)現(xiàn)不合格,并且規(guī)范老在變呢?
實體bean有兩種類型:CMP和BMP兩種。
CMP指的是容器管理持久化,而BMP指的是Bean管理持久化。理論上說,EJB規(guī)范并沒有規(guī)定你采用何種方法來持久化你的對象。你也可以簡單的將對象串行化。數(shù)據(jù)庫可以是對象數(shù)據(jù)庫或者是關(guān)系對象數(shù)據(jù)庫,或者是XML的。但是,在實際中,數(shù)據(jù)庫經(jīng)常是指關(guān)系數(shù)據(jù)庫,使用SQL.
在CMP中,編碼員只是在存儲器中處理對象。創(chuàng)建新對象,修改它們,刪除它們,和查詢它們,所有都是在存儲器中進行的。保存這些對象到關(guān)系數(shù)據(jù)庫表格中去的任務(wù)由容器自動完成。編碼員不需要些任何的與SQL相關(guān)的代碼。
在BMP中,編碼員不得不寫SQL語句來持久化對象到關(guān)系數(shù)據(jù)庫中。
EJB1. 1版本的CMP適合簡單的表格,和其它的表格沒有復(fù)雜的關(guān)系。CMP避免對底層數(shù)據(jù)庫的引用。因此,它是很具有可移植的。CMP除了能將數(shù)據(jù)庫持久化到關(guān)系數(shù)據(jù)庫中之外,還能持久化到對象數(shù)據(jù)庫中去。
但是,CMP并不是適合所有的情況。如果數(shù)據(jù)庫是先前遺留的類型的話,如不能使用SQL,數(shù)據(jù)庫公司提供了自己的代碼來持久化,并且這些代碼在我們的編程中用來持久化數(shù)據(jù),這樣的情況就不適合了。
但是,真正的問題在于CMP使用了ORM概念,雖然很多的實現(xiàn)迫切需要。它并沒有暴露EJB開發(fā)商到底實現(xiàn)了多少規(guī)范。Weblogic, Oracle, IBM WebSphere, SUN , JBoss都是實現(xiàn)了CMP中他們認為適合的部分。使用CMP是不錯的,并不僅僅因為它使得代碼可移植,很容易寫。如果我們采用CMP,更多的原因是 EJB容器能夠極大優(yōu)化性能。因此開發(fā)社區(qū)希望采用CMP,但是發(fā)現(xiàn)CMP不適合復(fù)雜的任務(wù)。
雖然做了一些改進,但是發(fā)現(xiàn)CMP不能成為最終的解決方案。它里面沒有繼承性。
雖然EJB容器所提供的服務(wù)在真正大的企業(yè)級的應(yīng)用程序中是不可或缺的,但是J2EE陣營仍讓垂直的劃分為兩個層,Web層和EJB層。支持 Web層的聲稱EJB的陡峭的學(xué)習(xí)曲線和容易發(fā)生錯誤的開發(fā)環(huán)境對于大多數(shù)的應(yīng)用程序是不需要的。他們喜歡有一個對象關(guān)系映射工具構(gòu)建到J2EE規(guī)范中。并不是只有在EJB存在ORM任務(wù),甚至在Servlets、JSP也在使用他們,只不過J2EE規(guī)范沒有對此做規(guī)定。ORM工具如OJB, JDO 和 Hibernate技術(shù)不只是能夠用在EJB容器,還可以用在web容器和一個獨立的容器中。使用這樣的工具,J2EE標準就會使得開發(fā)任務(wù)簡單,無論是開發(fā)web層的應(yīng)用程序還是ejb層的應(yīng)用程序。
在嚴厲的攻擊EJB實體Bean的復(fù)雜性和性能時,Rod Johnson預(yù)言在今后幾年,J2EE將會終止EJB的使用。無論我們同不同意他的觀點,我們還是很有價值去看看他對EJB實體Bean的一些批判。他提議將Spring框架作為EJB容器的替代品,并且這個觀念影響力正在擴大。
【編輯推薦】