posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          JPA會(huì)是ORM的王道嗎?

          Posted on 2007-09-25 09:03 詩(shī)特林 閱讀(3714) 評(píng)論(6)  編輯  收藏 所屬分類(lèi): JPA
            應(yīng)IT168寫(xiě)的專稿.http://tech.it168.com/j/2007-09-24/200709241207013.shtml

          JPA會(huì)是ORM的王道嗎?

           

          近幾年持久化技術(shù)領(lǐng)域異常喧囂,各種框架雨后春筍般地冒出。例如Spring對(duì)多個(gè)持久化技術(shù)提供了集成的支持,還通過(guò)Spring JDBC框架對(duì)JDBC API進(jìn)行簡(jiǎn)化。Sun也連接不斷地頒布幾個(gè)持久化規(guī)范,如JPA(Java Persistence API)JPA作為Java EE 5.0平臺(tái)標(biāo)準(zhǔn)的ORM規(guī)范,將得到所有Java EE服務(wù)器的支持。Sun這次吸取了之前EJB規(guī)范慘痛失敗的經(jīng)歷,在充分吸收現(xiàn)有ORM框架的基礎(chǔ)上,得到了一個(gè)易于使用、伸縮性強(qiáng)的ORM規(guī)范。從目前的開(kāi)發(fā)社區(qū)的反應(yīng)上看,JPA受到了極大的支持和贊揚(yáng),JPA作為ORM領(lǐng)域標(biāo)準(zhǔn)化整合者的目標(biāo)應(yīng)該不難實(shí)現(xiàn)。

          一、        引子

          荀子在《荀子·王制》中有云:王奪之人,霸?shī)Z之與,強(qiáng)奪之地。什么叫王道?就是仁義,以德待人,把人感動(dòng)得甘心情愿認(rèn)你當(dāng)老大。什么叫霸道?就是你有實(shí)力,以力服人,誰(shuí)不服就把他打服為止。從哲學(xué)上說(shuō),王道是正道,當(dāng)然正道須以實(shí)力為基礎(chǔ)。王道中也包含霸道,但王道順勢(shì)而行。

          最近,筆者查看了JPAjava 持久性API)的相關(guān)規(guī)范,作為EJB3.0的重要組成部分,JPA還是很值得關(guān)注的。看完規(guī)范,感覺(jué)JPA還是比較的單一,其目標(biāo)就是實(shí)現(xiàn)Java 持久性的通用。JPA采用純POJO的方式實(shí)現(xiàn),更多的是采用Java 5注釋(Annotation),它利用 Java 5 中的注釋和對(duì)象/關(guān)系映射,為數(shù)據(jù)持久化提供了更簡(jiǎn)單、易用的編程方式。JPA的優(yōu)勢(shì)是多供應(yīng)商的支持,可以運(yùn)行在容器之中,也可以運(yùn)行于容器之外,這就是其顯著的優(yōu)點(diǎn)。

          Java™ Platform Enterprise Edition (Java EE 5)的設(shè)計(jì)方法,充分利用了 Enterprise JavaBeans™ (EJB) 3.0 新的 Java Persistence API (JPA)特性。JPA 提供了一種標(biāo)準(zhǔn)的對(duì)象關(guān)系映射解決方案,該解決方案避免了依賴第三方框架(如 Hibernate)。Java EE 5 許多新功能都包含在經(jīng)過(guò)修補(bǔ)的 EJB 架構(gòu)中,其突出特性之一是 JPA。由于具有容器內(nèi)和容器外持久性選項(xiàng),JPA J2EE 軟件架構(gòu)師帶來(lái)一系列全新設(shè)計(jì)選擇。

          JPA受到了極大的支持和贊揚(yáng),那到JPA作為ORM領(lǐng)域標(biāo)準(zhǔn)化整合者的目標(biāo)應(yīng)該能實(shí)現(xiàn)嗎?能成來(lái)ORM的王道嗎?

          二、        JPA來(lái)了

          JPA通過(guò)JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中,圖 1很好地描述了JPA的結(jié)構(gòu):


          1.JPA的結(jié)構(gòu)圖

          Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有Java EEJava SE應(yīng)用的對(duì)象持久化的開(kāi)發(fā)工作;其二,Sun希望整合對(duì)ORM技術(shù),實(shí)現(xiàn)天下歸一。

          JPAEJB 3.0軟件專家組開(kāi)發(fā),作為JSR-220實(shí)現(xiàn)的一部分。但它不囿于EJB 3.0,你可以在Web應(yīng)用、甚至桌面應(yīng)用中使用。JPA的宗旨是為POJO提供持久化標(biāo)準(zhǔn)規(guī)范,由此可見(jiàn),經(jīng)過(guò)這幾年的實(shí)踐探索,能夠脫離容器獨(dú)立運(yùn)行,方便開(kāi)發(fā)和測(cè)試的理念已經(jīng)深入人心了。目前Hibernate 3.2TopLink 10.1.3以及OpenJPA都提供了JPA的實(shí)現(xiàn)。

          JPA的總體思想和現(xiàn)有HibernateTopLinkJDOORM框架大體一致。總的來(lái)說(shuō),JPA包括以下3方面的技術(shù):

          ORM映射元數(shù)據(jù),JPA支持XMLJDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對(duì)象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)表中;

          JPA API,用來(lái)操作實(shí)體對(duì)象,執(zhí)行CRUD操作,框架在后臺(tái)替我們完成所有的事情,開(kāi)發(fā)者從繁瑣的JDBCSQL代碼中解脫出來(lái)。

          查詢語(yǔ)言,這是持久化操作中很重要的一個(gè)方面,通過(guò)面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的查詢語(yǔ)言查詢數(shù)據(jù),避免程序的SQL語(yǔ)句緊密耦合。

          三、        JPA的優(yōu)勢(shì)

          1 標(biāo)準(zhǔn)化

          JPA JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問(wèn) API,這保證了基于JPA開(kāi)發(fā)的企業(yè)應(yīng)用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運(yùn)行。

          2 對(duì)容器級(jí)特性的支持

          JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級(jí)事務(wù),這使得 JPA 超越了簡(jiǎn)單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。

          3 簡(jiǎn)單易用,集成方便

          JPA的主要目標(biāo)之一就是提供更加簡(jiǎn)單的編程模型:在JPA框架下創(chuàng)建實(shí)體和創(chuàng)建Java 類(lèi)一樣簡(jiǎn)單,沒(méi)有任何的約束和限制,只需要使用 javax.persistence.Entity進(jìn)行注釋;JPA的框架和接口也都非常簡(jiǎn)單,沒(méi)有太多特別的規(guī)則和設(shè)計(jì)模式的要求,開(kāi)發(fā)者可以很容易的掌握。JPA基于非侵入式原則設(shè)計(jì),因此可以很容易的和其它框架或者容器集成。

          4 可媲美JDBC的查詢能力

          JPA的查詢語(yǔ)言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的,它以面向?qū)ο蟮淖匀徽Z(yǔ)法構(gòu)造查詢語(yǔ)句,可以看成是Hibernate HQL的等價(jià)物。JPA定義了獨(dú)特的JPQLJava Persistence Query Language),JPQLEJB QL的一種擴(kuò)展,它是針對(duì)實(shí)體的一種查詢語(yǔ)言,操作對(duì)象是實(shí)體,而不是關(guān)系數(shù)據(jù)庫(kù)的表,而且能夠支持批量更新和修改、JOINGROUP BYHAVING 等通常只有 SQL 才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。

          5 支持面向?qū)ο蟮母呒?jí)特性

          JPA 中能夠支持面向?qū)ο蟮母呒?jí)特性,如類(lèi)之間的繼承、多態(tài)和類(lèi)之間的復(fù)雜關(guān)系,這樣的支持能夠讓開(kāi)發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計(jì)企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫(kù)的持久化。

          四、        JPA的供應(yīng)商

          JPA 的目標(biāo)之一是制定一個(gè)可以由很多供應(yīng)商實(shí)現(xiàn)的API,并且開(kāi)發(fā)人員可以編碼來(lái)實(shí)現(xiàn)該API,而不是使用私有供應(yīng)商特有的API。因此開(kāi)發(fā)人員只需使用供應(yīng)商特有的API來(lái)獲得JPA規(guī)范沒(méi)有解決但應(yīng)用程序中需要的功能。盡可能地使用JPA API,但是當(dāng)需要供應(yīng)商公開(kāi)但是規(guī)范中沒(méi)有提供的功能時(shí),則使用供應(yīng)商特有的API

          1 Hibernate

          JPA是需要Provider來(lái)實(shí)現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個(gè),目前來(lái)說(shuō)應(yīng)該無(wú)人能出其右。從功能上來(lái)說(shuō),JPA現(xiàn)在就是Hibernate功能的一個(gè)子集。Hibernate 3.2開(kāi)始,就開(kāi)始兼容JPAHibernate3.2獲得了Sun TCKJPA(Java Persistence API) 兼容認(rèn)證。

          只要熟悉Hibernate或者其他ORM框架,在使用JPA時(shí)會(huì)發(fā)現(xiàn)其實(shí)非常容易上手。例如實(shí)體對(duì)象的狀態(tài),在Hibernate有自由、持久、游離三種,JPA里有newmanageddetachedremoved,明眼人一看就知道,這些狀態(tài)都是一一對(duì)應(yīng)的。再如flush方法,都是對(duì)應(yīng)的,而其他的再如說(shuō)Query query = manager.createQuery(sql),它在Hibernate里寫(xiě)法上是session,而在JPA中變成了manager,所以從HibernateJPA的代價(jià)應(yīng)該是非常小的

          同樣,JDO,也開(kāi)始兼容JPA。在ORM的領(lǐng)域中,看來(lái)JPA已經(jīng)是王道,規(guī)范就是規(guī)范。在各大廠商的支持下,JPA的使用開(kāi)始變得廣泛。

          2 Spring

          Spring + Hibernate 常常被稱為 Java Web 應(yīng)用人氣最旺的框架組合。而在 JCP 通過(guò)的 Web Beans JSR ,卻欲將JSF + EJB + JPA 、來(lái)自 JBoss SeamSpring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡(jiǎn)化 Session Bean 框架)的一個(gè) Web 組合進(jìn)行標(biāo)準(zhǔn)化。如今的 Spring 2.0  JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環(huán)境內(nèi)可以在 Spring 管理的服務(wù)層使用(包括 Spring 的所有 AOP  DI 增強(qiáng))。同時(shí),關(guān)于下一個(gè)Web應(yīng)用組合會(huì)是 EJBSpring + Hibernate 還是 Spring + JPA 的論戰(zhàn),早已充斥于耳。

          Spring 2.0.1中,正式提供對(duì)JPA的支持,這也促成了JPA的發(fā)展,要知道JPA的好處在于可以分離于容器運(yùn)行,變得更加的簡(jiǎn)潔。

          3 OpenJPA

          OpenJPA Apache 組織提供的開(kāi)源項(xiàng)目,它實(shí)現(xiàn)了 EJB 3.0 中的 JPA 標(biāo)準(zhǔn),為開(kāi)發(fā)者提供功能強(qiáng)大、使用簡(jiǎn)單的持久化數(shù)據(jù)管理框架。OpenJPA 封裝了和關(guān)系型數(shù)據(jù)庫(kù)交互的操作,讓開(kāi)發(fā)者把注意力集中在編寫(xiě)業(yè)務(wù)邏輯上。OpenJPA 可以作為獨(dú)立的持久層框架發(fā)揮作用,也可以輕松的與其它 Java EE 應(yīng)用框架或者符合 EJB 3.0 標(biāo)準(zhǔn)的容器集成。

          4 其它

          目前支持的實(shí)現(xiàn)包括ToplinkHibernate Entitymanager等。TopLink以前需要收費(fèi),如今開(kāi)源了。OpenJPA雖然免費(fèi),但功能、性能、普及性等方面更加需要加大力度。

          對(duì)于EJB來(lái)說(shuō),實(shí)體Bean一直是被批評(píng)的對(duì)象,由于其太復(fù)雜和龐大。JPA的出現(xiàn),很大程度的分離了復(fù)雜性。這讓EJB的推廣也變得容易。

          總而言之,JPA規(guī)范主要關(guān)注的僅是API的行為方面,而由各種實(shí)現(xiàn)完成大多數(shù)性能有關(guān)的調(diào)優(yōu)。盡管如此,所有可靠的實(shí)現(xiàn)都應(yīng)該擁有某種數(shù)據(jù)緩存,以作為選擇。但愿不久的將來(lái),JPA能成為真正的標(biāo)準(zhǔn)。

          五、        小結(jié)

          EJB 3.0JPA 毫無(wú)疑問(wèn)將是Java EE 5的主要賣(mài)點(diǎn)。在某些領(lǐng)域中,它們給Java社區(qū)帶來(lái)了競(jìng)爭(zhēng)優(yōu)勢(shì),并使Java 在其他領(lǐng)域與競(jìng)爭(zhēng)對(duì)手不分伯仲(因?yàn)椋豢煞裾J(rèn),目前某些領(lǐng)域尚不存在基于標(biāo)準(zhǔn)的方法)。

          過(guò)去數(shù)年來(lái),Spring Framework一直是EJB在企業(yè)領(lǐng)域的主要競(jìng)爭(zhēng)對(duì)手。EJB3.0規(guī)范解決了很多促進(jìn)Spring興起的問(wèn)題。隨著它的出現(xiàn),EJB3.0毫無(wú)疑問(wèn)比Spring提供了更好的開(kāi)發(fā)體驗(yàn)——最引人注目的優(yōu)勢(shì)是它不需要配置文件。

          JPA提供一種標(biāo)準(zhǔn)的OR映射解決方案,該解決方案完全集成到EJB30兼容的容器中。JPA的前輩將會(huì)繼續(xù)穩(wěn)定發(fā)展,但是業(yè)務(wù)應(yīng)用程序中的 raw 使用將可能會(huì)減少。實(shí)現(xiàn) JPA 兼容的實(shí)體管理器似乎很可能是此類(lèi)技術(shù)的發(fā)展方向。

          Java EE系列規(guī)范的較大問(wèn)題與JPA沒(méi)有任何關(guān)系。Java EE 系列規(guī)范的問(wèn)題涉及到 WebEJB容器之間的集成。Spring在此領(lǐng)域仍然具有主要競(jìng)爭(zhēng)優(yōu)勢(shì)。JBossSeam項(xiàng)目嘗試使用自定義的方法來(lái)解決這一問(wèn)題。Caucho Resin應(yīng)用服務(wù)器試圖擴(kuò)展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問(wèn)題,為我們提供一個(gè)全面而標(biāo)準(zhǔn)的依賴性注入方法。

          在不久的將來(lái),Sun可能會(huì)將JPA作為一個(gè)單獨(dú)的JSR對(duì)待,同時(shí)JPA還可能作為Java SE的一部分。不過(guò)這些都不太重要,重要的是,我們現(xiàn)在已經(jīng)可以在脫離容器的情況下、在Java SE應(yīng)用中使用JPA了。 

          JPA已經(jīng)作為一項(xiàng)對(duì)象持久化的標(biāo)準(zhǔn),不但可以獲得Java EE應(yīng)用服務(wù)器的支持,還可以直接在Java SE中使用。開(kāi)發(fā)者將無(wú)需在現(xiàn)有多種ORM框架中艱難地選擇,按照Sun的預(yù)想,現(xiàn)有ORM框架頭頂?shù)墓猸h(huán)將漸漸暗淡,不再具有以往的吸引力。


          評(píng)論

          # re: JPA會(huì)是ORM的王道嗎?  回復(fù)  更多評(píng)論   

          2007-09-25 09:43 by 千里冰封
          強(qiáng)力支持JPA

          # re: JPA會(huì)是ORM的王道嗎?  回復(fù)  更多評(píng)論   

          2007-09-25 10:29 by Alexander.Yu
          等它成熟了再用。。。呵呵。

          # re: JPA會(huì)是ORM的王道嗎?  回復(fù)  更多評(píng)論   

          2007-09-25 16:56 by fxbird
          剛想學(xué)hibernate,就看到了這篇文章,唉,java技術(shù)更新太快了,作為普通開(kāi)發(fā)者根本跟不上,還是先用著冬眠吧,等jpa成熟了再說(shuō)。

          # re: JPA會(huì)是ORM的王道嗎?[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-09-26 08:53 by 過(guò)客
          已經(jīng)開(kāi)始用了

          # re: JPA會(huì)是ORM的王道嗎?[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-09-26 09:58 by Johnson
          現(xiàn)在還很難說(shuō),開(kāi)源的一個(gè)優(yōu)勢(shì)就是對(duì)需求的響應(yīng)速度快,有了不足之處可以及時(shí)得到改進(jìn)。

          # re: JPA會(huì)是ORM的王道嗎?  回復(fù)  更多評(píng)論   

          2008-10-20 14:22 by 心跳
          不太懂

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 攀枝花市| 综艺| 连城县| 钟山县| 绥滨县| 泸州市| 溧水县| 广东省| 高邑县| 宜城市| 鄂伦春自治旗| 东宁县| 古丈县| 湘潭市| 宾阳县| 高台县| 望谟县| 湘西| 根河市| 斗六市| 周至县| 电白县| 连江县| 永修县| 江都市| 澄城县| 内乡县| 安丘市| 沧源| 饶平县| 宣化县| 略阳县| 湖南省| 公安县| 开鲁县| 三台县| 永胜县| 元朗区| 多伦县| 忻州市| 上饶县|