(七)Hibernate之JPA

什麼是JPA

     JPA(Java Persistence API)是Sun官方提出的Java持久化規範。J

   PA通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。它爲Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關係數據。他的出現主要是爲了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自爲營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。從目前的開發社區的反應上看,JPA受到了極大的支持和讚揚,其中就包括了Spring與EJB3.0的開發團隊。着眼未來幾年的技術走向,JPA作爲ORM領域標準化整合者的目標應該不難實現。 

Sun引入新的JPA ORM規範出於兩個原因

其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;

其二,Sun希望整合對ORM技術,實現天下歸一。


     JPA的總體思想和現有Hibernate,TopLink,JDO等ORM框架大體一致。總的來說,
JPA包括以下3方面的技術

  • ORM映射元數據
         JPA支持XML和JDK5.0註釋(也可譯作註解)兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持久化到數據庫表中。
  • Java持久化API
         用來操作實體對象,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者可以從繁瑣的JDBC和SQL代碼中解脫出來。
  • 查詢語言(JPQL)
         這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的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定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關係數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 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開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認證。

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

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

2 Spring

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

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

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

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


    
提示JPA不是一種新的ORM框架,他的出現只是用於規範現有的ORM技術,他不能取代現有的Hibernate,TopLink等ORM框架。相反,在採用JPA開發時,我們仍將使用到這些ORM框架,只是此時開發出來的應用不再依賴於某個持久化提供商。應用可以在不修改代碼的情況下在任何JPA環境下運行,真正做到低耦合,可擴展的程序設計。

      簡單說,JPA乾的東西就是Hibernate乾的東西,他們的作用是一樣的。但要注意的是:JPA只是一套規範,不是一套產品,Hibernate已經是一套產品了。
      他的出現主要是爲了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自爲營的局面。 之前學的Hibernate,實際上我們面對的是Hibernate的API進行開發,那麼面對Hibernate的API開發有哪些不好的地方呢?不好的地方是我們跟Hibernate這個產品就會緊密的耦合在一塊,如果離開了Hibernate我們是無法在別的ORM框架中使用我們的應用的。那麼JPA的出現就是爲了結束現在Hibernate,TopLink,JDO等ORM框架各自爲營的局面。簡單的說就是:你採用JPA開發應用,那麼你的應用可以運用在實現了JPA規範的持久化產品中(好比說Hibernate,TopLink,JDO)

     JPA這門技術是未來發展的必然趨勢,以後我們要採用ORM技術呢,我們不會在面對Hibernate編程,不會在面對TopLink編程,而是面對JPA規範編程。 就是說,過了幾年之後,你們的應用就會很少面對Hibernate API進行編程,這是爲什麼呢? 這就好比以前我們訪問數據庫一樣,假設以前我們沒有JDBC這門技術的話,我們跟各個數據庫鏈接只能使用各個數據庫廠商給我們提供的API,去訪問他們的數據庫,那麼自從有了JDBC之後,我們就不再需要面對數據庫廠商給我們提供的API進行跟數據庫鏈接了,而是直接使用JDBC這套規範,我們就可以跟各個數據庫進行對接。目前,JPA跟Hibernate,TopLink的關係也是一樣的,JPA就和JDBC一樣,提供一種通用的,訪問各個ORM實現產品的橋樑工具。通過JPA技術,我們只需要面對它的規範編程,編出來的應用就可以應用在各個持久化產品中(包括Hibernate,TopLink),就是說你底層用的產品對我來說,已經不再重要了。

    
總結一下:JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麼我們就可以叫他們爲JPA的實現產品。
    JPA的主要設計者是Hibernate的設計者。JPA是一種規範不是產品,而Hibernate是一種ORM技術的產品。JPA有點像JDBC,爲各種不同的ORM技術提供一個統一的接口,方便把應用移植到不同的ORM技術上。

    
低耦合一直是我們在軟件設計上追求的目標,使用JPA,就可以把我們的應用完全從Hibernate中解脫出來了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章