gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          JPA會是ORM的王道嗎?

          JPA會是ORM的王道嗎?

           

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

          一、        引子

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

          最近,筆者查看了JPAjava 持久性API)的相關(guān)規(guī)范,作為EJB3.0的重要組成部分,JPA還是很值得關(guān)注的。看完規(guī)范,感覺JPA還是比較的單一,其目標(biāo)就是實(shí)現(xiàn)Java 持久性的通用。JPA采用純POJO的方式實(shí)現(xiàn),更多的是采用Java 5注釋(Annotation),它利用 Java 5 中的注釋和對象/關(guān)系映射,為數(shù)據(jù)持久化提供了更簡單、易用的編程方式。JPA的優(yōu)勢是多供應(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)的對象關(guān)系映射解決方案,該解決方案避免了依賴第三方框架(如 Hibernate)。Java EE 5 許多新功能都包含在經(jīng)過修補(bǔ)的 EJB 架構(gòu)中,其突出特性之一是 JPA。由于具有容器內(nèi)和容器外持久性選項(xiàng),JPA J2EE 軟件架構(gòu)師帶來一系列全新設(shè)計(jì)選擇。

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

          二、        JPA來了

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


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

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

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

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

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

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

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

          三、        JPA的優(yōu)勢

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

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

          2 對容器級特性的支持

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

          3 簡單易用,集成方便

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

          4 可媲美JDBC的查詢能力

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

          5 支持面向?qū)ο蟮母呒壧匦?/span>

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

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

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

          1 Hibernate

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

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

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

          2 Spring

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

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

          3 OpenJPA

          OpenJPA Apache 組織提供的開源項(xiàng)目,它實(shí)現(xiàn)了 EJB 3.0 中的 JPA 標(biāo)準(zhǔn),為開發(fā)者提供功能強(qiáng)大、使用簡單的持久化數(shù)據(jù)管理框架。OpenJPA 封裝了和關(guān)系型數(shù)據(jù)庫交互的操作,讓開發(fā)者把注意力集中在編寫業(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),如今開源了。OpenJPA雖然免費(fèi),但功能、性能、普及性等方面更加需要加大力度。

          對于EJB來說,實(shí)體Bean一直是被批評的對象,由于其太復(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ù)緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標(biāo)準(zhǔn)。

          五、        小結(jié)

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

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

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

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

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

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

          posted on 2007-11-12 13:35 gembin 閱讀(794) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 张北县| 乐清市| 吉安县| 开鲁县| 洮南市| 肥城市| 简阳市| 临汾市| 云南省| 大余县| 公主岭市| 仁布县| 隆林| 兰西县| 绥中县| 民权县| 仁怀市| 佛山市| 临武县| 章丘市| 淮南市| 临洮县| 阿克陶县| 义乌市| 霍州市| 雅安市| 图们市| 兴文县| 高碑店市| 九龙县| 吉木乃县| 富阳市| 无棣县| 玛纳斯县| 肇源县| 沅陵县| 徐闻县| 禄丰县| 铜川市| 沙田区| 资讯 |