JPA

weixin_30639719發表於2020-04-05
定義 Java Persistence API
JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。

起源

Sun引入新的JPA ORM規範出於兩個原因:其一,簡化現有Java EE和Java SE應用的物件持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。
JPA由EJB 3.0軟體專家組開發,作為JSR-220實現的一部分。但它不囿於EJB 3.0,你可以在Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久化標準規範,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運 行,方便開發和測試的理念已經深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。
JPA的總體思想和現有Hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:
ORM對映後設資料
JPA支援XML和JDK 5.0註解兩種後設資料的形式,後設資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中;
JPA 的API
用來操作實體物件,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL程式碼中解脫出來。
查詢語言
這是持久化操作中很重要的一個方面,通過物件導向而非面向資料庫的查詢語言查詢資料,避免程式的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能成為真正的標準。
小結
EJB 3.0和JPA 毫無疑問將是Java EE 5的主要賣點。在某些領域中,它們給Java社群帶來了競爭優勢,並使Java 在其他領域與競爭對手不分伯仲(因為,不可否認,目前某些領域尚不存在基於標準的方法)。
過去數年來,Spring Framework一直是EJB在企業領域的主要競爭對手。EJB3.0規範解決了很多促進Spring興起的問題。隨著它的出現,EJB3.0毫無疑問比Spring提供了更好的開發體驗——最引人注目的優勢是它不需要配置檔案。
JPA提供一種標準的OR對映解決方案,該解決方案完全整合到EJB3。0相容的容器中。JPA的前輩將會繼續穩定發展,但是業務應用程式中的 raw 使用將可能會減少。實現 JPA 相容的實體管理器似乎很可能是此類技術的發展方向。
Java EE系列規範的較大問題與JPA沒有任何關係。Java EE 系列規範的問題涉及到 Web和EJB容器之間的整合。Spring在此領域仍然具有主要競爭優勢。JBoss的Seam專案嘗試使用自定義的方法來解決這一問題。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框架頭頂的光環將漸漸暗淡,不再具有以往的吸引力。

轉載於:https://www.cnblogs.com/jdonson/archive/2009/07/24/1530063.html

相關文章