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的王道嗎?

           

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

          一、        引子

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

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

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

          JPA受到了極大的支持和贊揚,那到JPA作為ORM領域標準化整合者的目標應該能實現嗎?能成來ORM的王道嗎?

          二、        JPA來了

          JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中,圖 1很好地描述了JPA的結構:


          1.JPA的結構圖

          Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EEJava SE應用的對象持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。

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

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

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

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

          查詢語言,這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。

          三、        JPA的優勢

          1 標準化

          JPA JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問 API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

          2 對容器級特性的支持

          JPA 框架中支持大數據集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用。

          3 簡單易用,集成方便

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

          4 可媲美JDBC的查詢能力

          JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQLJava Persistence Query Language),JPQLEJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOINGROUP BYHAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

          5 支持面向對象的高級特性

          JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。

          四、        JPA的供應商

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

          1 Hibernate

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

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

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

          2 Spring

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

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

          3 OpenJPA

          OpenJPA Apache 組織提供的開源項目,它實現了 EJB 3.0 中的 JPA 標準,為開發者提供功能強大、使用簡單的持久化數據管理框架。OpenJPA 封裝了和關系型數據庫交互的操作,讓開發者把注意力集中在編寫業務邏輯上。OpenJPA 可以作為獨立的持久層框架發揮作用,也可以輕松的與其它 Java EE 應用框架或者符合 EJB 3.0 標準的容器集成。

          4 其它

          目前支持的實現包括ToplinkHibernate Entitymanager等。TopLink以前需要收費,如今開源了。OpenJPA雖然免費,但功能、性能、普及性等方面更加需要加大力度。

          對于EJB來說,實體Bean一直是被批評的對象,由于其太復雜和龐大。JPA的出現,很大程度的分離了復雜性。這讓EJB的推廣也變得容易。

          總而言之,JPA規范主要關注的僅是API的行為方面,而由各種實現完成大多數性能有關的調優。盡管如此,所有可靠的實現都應該擁有某種數據緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標準。

          五、        小結

          EJB 3.0JPA 毫無疑問將是Java EE 5的主要賣點。在某些領域中,它們給Java社區帶來了競爭優勢,并使Java 在其他領域與競爭對手不分伯仲(因為,不可否認,目前某些領域尚不存在基于標準的方法)。

          過去數年來,Spring Framework一直是EJB在企業領域的主要競爭對手。EJB3.0規范解決了很多促進Spring興起的問題。隨著它的出現,EJB3.0毫無疑問比Spring提供了更好的開發體驗——最引人注目的優勢是它不需要配置文件。

          JPA提供一種標準的OR映射解決方案,該解決方案完全集成到EJB30兼容的容器中。JPA的前輩將會繼續穩定發展,但是業務應用程序中的 raw 使用將可能會減少。實現 JPA 兼容的實體管理器似乎很可能是此類技術的發展方向。

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

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

          JPA已經作為一項對象持久化的標準,不但可以獲得Java EE應用服務器的支持,還可以直接在Java SE中使用。開發者將無需在現有多種ORM框架中艱難地選擇,按照Sun的預想,現有ORM框架頭頂的光環將漸漸暗淡,不再具有以往的吸引力。

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


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


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(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
          主站蜘蛛池模板: 乡城县| 杂多县| 浮山县| 辽阳市| 彭水| 榆中县| 怀安县| 贺州市| 广河县| 嘉义市| 昌图县| 龙游县| 恩平市| 贡觉县| 神木县| 北辰区| 青冈县| 温州市| 交城县| 南皮县| 香港| 东山县| 高邮市| 登封市| 北宁市| 集贤县| 繁峙县| 白朗县| 泰安市| 铁岭县| 蒲江县| 保德县| 三亚市| 徐水县| 霍山县| 台南市| 杭州市| 即墨市| 枣阳市| 大英县| 仁布县|