Posted on 2005-11-24 11:14
Terry的Blog 閱讀(575)
評論(0) 編輯 收藏 所屬分類:
java語言 、
轉(zhuǎn)載
Hibernate的未來發(fā)展之路
最近半年多來,在Java世界,Hibernate是最引人關(guān)注的一個(gè)話題。從Gavin King加入EJB3.0 EG,負(fù)責(zé)制訂EJB3.0的持久層規(guī)范;到Gavin King非正式退出JDO EG,并且充滿個(gè)人情緒的攻擊JDO2.0規(guī)范;到《Hibernate in Action》的發(fā)行;再到Hibernate3 Alpha的發(fā)布;最后再到最近JBoss 3.0 PR的發(fā)布(使用Hibernate3實(shí)現(xiàn)Entity Bean)。可以說這其中的每一步都引起業(yè)界的側(cè)目。
Hibernate在不到3年的時(shí)間里,從一個(gè)不起眼的開源軟件發(fā)展到今天令業(yè)界矚目的主流O/R Mapping框架,Gavin King從一個(gè)開源軟件的作者成為業(yè)界舉足輕重的人物,這多少有些傳奇的色彩。畢竟,單純從技術(shù)成就而言,Hibernate不算是最有成就的Java開源框架軟件,到目前為止也不是一個(gè)完美無缺的軟件;從個(gè)人技術(shù)水平而言,Gavin King也不算絕頂高手。
在當(dāng)前的Java持久層框架中,最流行的O/R Mapping產(chǎn)品分別是Hibernate,JDO和TopLink。
自從去年Gavin King加入JBoss之后,Hibernate已經(jīng)由一個(gè)民間的開源軟件走上了兼容EJB EntityBean的道路。然而更加令人側(cè)目的是,Gavin King在EJB3.0 EG中充當(dāng)了一個(gè)非常重要的角色,只要對比一下EJB3.0的EntityBean和Hibernate3,真相就會大白,雖然API接口不同,但是EntityBean的設(shè)計(jì)理念完全來自于Hibernate。
雖然EJB3.0的EntityBean在相當(dāng)程度上來源于Hibernate,但是畢竟是不同的API接口,因此Hibernate和EJB3.0 EntityBean究竟是怎樣的一種關(guān)系,是很多人心中的疑問。
今年四月份JBoss的Ben Wang訪華期間,我曾經(jīng)向Ben請教Hibernate的未來發(fā)展,他回答說,Hibernate未來將仍舊以獨(dú)立的軟件產(chǎn)品存在和發(fā)展,既可以outside EJB container使用;同時(shí)Hibernate也將做為JBoss EntityBean Implementation,又可以inside EJB container使用。然而如何既inside,又outside,終究缺乏一個(gè)感性的認(rèn)識。
10月8日J(rèn)Boss發(fā)布的EJB3.0 PR揭開了答案。從Sourceforge的CVS服務(wù)器上面checkout出來源代碼看一下,我們可以發(fā)現(xiàn),Gavin King對Hibernate3進(jìn)行了簡單的封裝,將EJB 3.0 EntityBean API調(diào)用轉(zhuǎn)換為內(nèi)部Hibernate3自己的API,從而實(shí)現(xiàn)EJB3.0 EntityBean的兼容。
EJB3.0不承諾脫離容器調(diào)用,如果你想享用EJB3.0,則必須運(yùn)行在某個(gè)EJB Vendor提供的容器內(nèi),例如你使用JBoss提供的容器,那么你調(diào)用的是EntityBean API,這些調(diào)用請求會被轉(zhuǎn)換為Hibernate API的調(diào)用請求。這意味著Hibernate實(shí)際上提供了兩套API:一套是Hibernate原生API;另一套是兼容EJB3.0 EntityBean API。對于那些需要分布式調(diào)用支持,需要EJB容器的開發(fā)人員來說,他們選擇后一套API;對于不需要EJB容器的開發(fā)人員來說,他們選擇前一套API。這就是Hibernate既定的發(fā)展策略。
今年夏天投票通過的JDO2.0標(biāo)準(zhǔn)從某種程度而言,并不遜色于Hibernate當(dāng)前的版本,有些功能甚至比Hibernate還要好,例如JDO支持對類屬性的lazy loading,而Hibernate要到3才支持,當(dāng)前Hibernate僅僅支持類的lazy loading。實(shí)際上在去年,就已經(jīng)有很多用戶不斷提出對類屬性的lazy loading的需求,然而Gavin King當(dāng)時(shí)一直不認(rèn)為這個(gè)需求有添加的必要性。再例如被Gavin King形容為“可憎的”JDOQL,實(shí)際上是類SQL查詢語言和對象條件查詢的混合體。從功能上來說,不如HQL強(qiáng)大,但是遠(yuǎn)比Hibernate自己的條件查詢強(qiáng)很多。
不知道究竟出于什么原因,Gavin King對JDO似乎一直懷有由衷的厭惡,今年5月,他在Hibernate的blog上面對JDO進(jìn)行了毫不留情的批判,列舉了JDO的種種缺點(diǎn)來解釋為什么EJB3持久層規(guī)范沒有把JDO考慮進(jìn)去。然而事實(shí)上他的批判充滿了對JDO的誤解和偏見,例如Gavin King憎恨JDOQL絲毫沒有什么特別的理由,只因?yàn)镴DOQL不是一個(gè)純粹的查詢語言,而是一個(gè)混合體,這多少讓人對Gavin King的風(fēng)度感到遺憾。在被SolarMetric的Abe White反駁之后,同樣沒有風(fēng)度的說,“我可沒有時(shí)間做這種無謂的爭論,事實(shí)上每個(gè)人都認(rèn)為他自己的技術(shù)是最好的……我是錯(cuò)了,JDO那伙人也錯(cuò)了,每個(gè)人都會犯錯(cuò)誤……”。(所以說人無完人阿!)
JDO2規(guī)范的出臺事實(shí)上構(gòu)成了對Hibernate,乃至基于Hibernate理念的EJB3.0 EntityBean的嚴(yán)重威脅。JDO1.0規(guī)范在功能上的嚴(yán)重缺失導(dǎo)致了JDO無力面對Hibernate和TopLink的競爭,然而功能基本完備的JDO2挾眾多JDO Vendor商業(yè)支持的合力,同時(shí)JDO規(guī)范可以避免產(chǎn)品鎖定在某個(gè)Vendor的優(yōu)勢,已經(jīng)將競爭的天平拉直。
然而JDO2和EJB3兩大商業(yè)主流標(biāo)準(zhǔn)的分裂,是大部分人,甚至包括廠商所不希望看到的。 于是最終EJB3的Lead Linda DeMichiel和JDO2的Lead Craig Russell聯(lián)名發(fā)表公開信,宣布了一個(gè)合并EJB3和JDO2持久層規(guī)范的計(jì)劃,新的持久層規(guī)范將以JSR-220(EJB3.0)的持久層規(guī)范為基礎(chǔ),融合JDO2的部分特性。新的持久層規(guī)范將進(jìn)入J2EE1.5之中,獨(dú)立于EJB存在,既可以inside J2EE容器來使用,也可以脫離J2EE容器,獨(dú)立的運(yùn)行。
這個(gè)新的持久層框架可以說完全是一個(gè)政治的產(chǎn)物。EJB Vendors出于自身利益反對JDO,使得JDO沒有辦法成為J2EE的一部分,然而標(biāo)準(zhǔn)的分裂也是大部分人更加不希望看到的,于是最終JDO成了政治斗爭的犧牲品。從表面上來看,JDO和EJB3.0 EntityBean都將被新的持久層框架取代,似乎JDO并沒有吃虧,但實(shí)際上JDO2標(biāo)準(zhǔn)已經(jīng)成熟,部分JDO領(lǐng)導(dǎo)廠商的產(chǎn)品已經(jīng)蓄始待發(fā),而EJB3.0 EntityBean還處于Early Draft,等待產(chǎn)品誕生至少也是一年之后的事情了;另外值得耐人尋味的是,新的持久層框架將基于當(dāng)前EJB3.0 EntityBean,再結(jié)合JDO2的規(guī)范,并且將處于EJB3.0 EG的控制之下,再加入一些JDO2 EG的成員。因此可以看出來新的持久層框架無疑還是以EJB3.0 EG為主導(dǎo)進(jìn)行制定的。
從長遠(yuǎn)來看,EJB3和JDO2的政治斗爭對雙方都有好處,長期分裂帶來的后果對雙方的發(fā)展都不利,然而從短期來看,JDO2確實(shí)是在這場政治斗爭中敗下陣來。最直接的體現(xiàn)就是,已經(jīng)有一些JDO的用戶對JDO的前景產(chǎn)生了動搖和迷茫,不少的JDO愛好者更是直言JDO將死。
不過對JDO來說,事情未必如此悲觀。因?yàn)樾碌某志脤涌蚣艿淖罱K發(fā)布最快也要在2005年夏天,這還是樂觀的估計(jì),比較廣泛的使用則是2006年的事情了。并且如果新的持久層框架還是像EJB3 EntityBean那樣嚴(yán)重依賴J2SE5.0的annotation的話,無疑將無法在很多當(dāng)前運(yùn)行的系統(tǒng)和遺留系統(tǒng)上使用。這些都是JDO2的市場生存空間。有了這段時(shí)間的緩沖,JDO Vendor將可以平緩的轉(zhuǎn)變?yōu)橐粋€(gè)J2EE1.5持久層框架的供應(yīng)商,面臨更加廣闊的企業(yè)客戶群體。
TopLink是一個(gè)老牌的O/R Mapping軟件了,自從被Oracle收購之后,又增加了對Oracle數(shù)據(jù)庫的良好支持,和對Oracle AS EntityBean的支持。Oracle提供了TopLink的圖形設(shè)計(jì)環(huán)境,可以使得設(shè)計(jì)好的TopLink域模型既可以被單獨(dú)用在TopLink中,也可以被用在EJB CMP中。因此看來TopLink也走了一條和Hibernate同樣策略的路。
TopLink的問題在于相比Hibernate的開源和免費(fèi)的優(yōu)勢來說,TopLink既不開源,售價(jià)又不菲上。本來商業(yè)軟件TopLink應(yīng)該在技術(shù)支持和商業(yè)宣傳策略上擁有足夠的優(yōu)勢,然而Oracle公司畢竟是一個(gè)以數(shù)據(jù)庫為核心產(chǎn)品的公司,其他的一切產(chǎn)品都是為了數(shù)據(jù)庫銷售業(yè)績而服務(wù)的。在Oracle產(chǎn)品線中處于一個(gè)從屬地位的TopLink,由于先天不足,只能眼睜睜看著Hibernate的日益壯大而無所作為,因此TopLink更多的被局限在購買了Oracle數(shù)據(jù)庫,并且綁定Oracle數(shù)據(jù)庫的用戶群體中。
J2EE1.5的新持久層規(guī)范將毫無懸念的成為未來持久層框架的主流API,無論是Hibernate,JDO,還是TopLink終將兼容這個(gè)主流商業(yè)API。在當(dāng)前的這三種持久層API當(dāng)中,Hibernate無疑是最有前途的。這是因?yàn)椋?
1、新的持久層規(guī)范將基于EJB3.0 EntityBean規(guī)范,這意味著仍將以Hibernate的設(shè)計(jì)理念為基礎(chǔ)
2、JBoss對EJB3.0規(guī)范跟隨的步伐非常緊密,在規(guī)范制定過程中就不斷的發(fā)布參考實(shí)現(xiàn)產(chǎn)品,因此可以對對EJB3.0規(guī)范產(chǎn)生比較大的影響力。
3、根據(jù)內(nèi)部泄漏出來的小道消息,BEA公司的WebLogic9產(chǎn)品線的項(xiàng)目經(jīng)理已經(jīng)在用Hibernate2來實(shí)現(xiàn)EJB3.0的持久層框架。WebLogic9 beta1預(yù)計(jì)年底發(fā)布,beta2預(yù)計(jì)明年3月發(fā)布,正式產(chǎn)品將緊隨EJB3.0規(guī)范正式版發(fā)布之后的明年秋季發(fā)布。
綜上所述,我們有理由對Hibernate的前途抱有強(qiáng)烈的信心。
最后的一個(gè)疑問是,既然J2EE1.5的新持久層框架可以脫離J2EE容器運(yùn)行,那么大家不全部都去用Hibernate的后一套兼容API,而完全放棄Hibernate的原生API了嗎?那么是否意味著Hibernate做為一個(gè)獨(dú)立產(chǎn)品的使命徹底終結(jié)呢?
對于這個(gè)問題我的看法是:J2EE1.5的持久層規(guī)范要綜合各個(gè)EJB Vendor,JDO Vendor的意見,要平衡他們之間的利益得失,那么這樣一個(gè)瞻前顧后的規(guī)范必然無法覆蓋所有應(yīng)用場合的全面需要,這不像Hibernate的原生API可以隨時(shí)根據(jù)開發(fā)人員的要求增加功能那么靈活。因此我預(yù)計(jì)Hibernate的原生API以其更加強(qiáng)大的功能仍然會吸引一大批人直接使用原生API,而不是兼容J2EE規(guī)范的API。
總而言之,對于我們當(dāng)前的持久層開發(fā)來說,最好的辦法莫過于堅(jiān)定的使用DAO層來隔離持久層和業(yè)務(wù)層邏輯,那么不管未來持久層風(fēng)云如何變換,但凡基于POJO的持久層框架都可以被我們拿來任意替換。
轉(zhuǎn)載來源:
http://www.hibernate.org.cn/viewtopic.php?t=8146&postdays=0&postorder=asc&start=0