Java持久化API
Java持久化API(JPA)是一個Java應用程式接口規範,描述了使用Java標準版平台(Java SE)和Java企業版平台(Java EE)的應用中的關係數據的管理。
持久化,在這裏包括三個層面的意思:
- API本身,定義在
javax.persistence
包內 - Java持久化查詢語言(JPQL)
- 對象/關係元數據
JPA的參考實現是EclipseLink。
歷史背景
[編輯]2006年5月11號,JPA 1.0規範作為JCP JSR 220的一部分最終被發佈。JPA 2.0規範,在2009年12月發佈(Java EE 6平台,依賴於 JPA 2.0)JPA 2.1規範,在2013年4月22日發佈(Java EE 7平台,依賴於JPA 2.1[1])。
實體
[編輯]持久化實體是一個輕量級的Java類,其狀態通常持久地保存到關係數據庫的表中。這種實體的實例對應於表中的各個行。實體之間通常有關係,這些關係通過對象/關係元數據表示。可以在實體類文件中直接使用註釋來指定這種關係,也可以在隨應用程式分發的單獨XML描述文件中指定。
Java 持久化查詢語言(JPQL)
[編輯]Java持久化查詢語言(JPQL)對存儲在關係數據庫中的實體進行查詢。查詢在語法上類似於SQL查詢,但是操作的是實體對象而不是直接對數據庫表進行操作。
動機
[編輯]在引入EJB 3.0規範之前,許多企業級Java開發人員使用由持久化框架(例如Hibernate)或數據訪問對象(DAO)提供的輕量級持久化對象,來代替實體bean(EJB的一種)。 這是因為在以前的EJB規範中,實體bean需要太多複雜的代碼和繁重的資源佔用,並且由於bean和DAO對象或持久化框架之間的原始碼中的互連和依賴性,它們只能在Java EE應用程式伺服器中使用。 因此,最初在第三方持久性框架中提供的許多功能都被合併到Java持久化API中,並且從2006年開始,像Hibernate(版本3.2)和TopLink Essentials這樣的項目已經實現Java持久化API規範。
相關技術
[編輯]企業 JavaBeans(EJB)
[編輯]EJB 3.0規範(本身是Java EE 5平台的一部分)包含Java持久化API的定義。 無論如何,終端用戶不需要EJB容器或Java EE應用程式伺服器即可運行使用此持久性API的應用程式。[2] Java持久化 API的未來版本將在單獨的JSR和規範中定義,而不是在EJB JSR /規範中定義。
Java持久化API取代了EJB 2.0 CMP(持久化管理容器)的持久性解決方案
Java數據對象的API
[編輯]Java持久化API作為統一Java Data Objects API和EJB 2.0容器管理持久性(CMP)API的一部分來開發。截至2009年,支持這些API的大多數產品都支持Java持久化API。
Java持久化API僅為關係數據庫管理系統提供持久化特性。也就是說,JPA專注於對象關係映射(ORM)(請注意,除了關係數據庫之外,還有JPA提供程式支持其他數據庫模型,但這超出了JPA的設計範圍)。有關JPA角色的說明,請參閱JPA 2規範第1節簡介,其中非常清楚地說明「這項工作的技術目標是為Java應用程式開發人員提供一個對象/關係映射工具,使用Java領域模型來管理關係數據庫。」
Java數據對象規範支持ORM,以及對其他類型的數據庫模型的持久化,例如平面文件數據庫和NoSQL數據庫,包括文檔數據庫,圖形數據庫,以及字面上任何其他可想到的數據存儲。
服務數據對象 API
[編輯]Java持久化API的設計者旨在提供關係持久化,其中許多關鍵領域來自對象關係映射工具,如Hibernate和TopLink。Java持久化API改進並取代了EJB 2.0,其體現在EJB 3.0中。服務數據對象(SDO)API(JSR 235)與Java持久化API有着截然不同的目標,被認為是互補的。[3][4]SDO API專為面向服務的體系結構,多種數據格式而非關係數據和多種程式語言而設計。JCP管理SDO API的Java版本;SDO API的C++版本通過OASIS進行管理。
Hibernate
[編輯]Hibernate為Java提供了一個開源的對象關係映射框架。版本3.2及更高版本提供了Java 持久化 API的實現。Gavin King創立了Hibernate項目。[5]他代表JBoss參加JSR 220,這是負責開發JPA的JCP專家組。[6]這引發了圍繞JPA和Hibernate之間關係的持續爭議和猜測。Sun Microsystems表示[7],這些想法來自幾個框架,包括Hibernate和Java 數據對象。
Spring Data JPA
[編輯]抽象存儲庫的實現是Java應用程式框架Spring的領域驅動設計的關鍵構建塊。透明地支持所有可用的JPA實現,並支持CRUD操作以及方便地執行數據庫查詢。
JPA 2.0
[編輯]2007年7月,JPA 2.0 在JCP的JSR 317請求中作為新版本開發。2009年12月10日,JPA 2.0被批准為最終正式標準。JPA 2.0的重點是提供一些流行的ORM供應商中存在的特性,但在JPA 1.0中不能獲得一致認可。
主要特性包括:
- 擴大對象關係功能的映射
- 支持內嵌對象的收集,通過多對一的關係映射來連接ORM
- 有序列表
- 訪問類型的組合
- 一種標準查詢API
- 標準化的SQL提示
- 標準化的附加元數據,以支持DDL生成
- 支持驗證
- 支持共享對象的高速緩存
支持JPA 2.0的供應商:
- Batoo JPA
- DataNucleus (formerly JPOX)
- EclipseLink (formerly Oracle TopLink)
- IBM, for WebSphere Application Server[8]
- JBoss with Hibernate
- Kundera (頁面存檔備份,存於互聯網檔案館)
- ObjectDB
- OpenJPA
- OrientDB from Orient Technologies
- Versant Corporation JPA (not relational, object database)[9]
JPA 2.1
[編輯]2011年7月,JPA 2.1 在JCP的JSR 338請求中作為新版本開發。2013年5月22日,JPA 2.1被批准為最終正式標準。
主要特性包括:
- 轉換器-允許自定義的代碼去裝換不同的數據庫和數據類型。
- 標準Update/Delete-允許通過標準API批量更新和刪除。
- 實體圖表-允許獲取部分或合併對象。
- JPQL/標準增強-算子查詢,通用數據庫的功能,Join 聯合查詢,TREAT 選項。
- 模式生成
- 存儲過程,允許查詢被定義為數據庫的存儲過程。
支持 JPA 2.1 的供應商:
- DataNucleus
- EclipseLink
- Hibernate
JPA 2.2
[編輯]2017年,JPA 2.2在JCP的JSR 338請求中作為維護版本發佈開發。維護審查已於2017年6月19日獲得批准。
主要特性包括:
- 給所有有關的註釋添加
@Repeatable
- 允許所有JPA註釋可用於元的註釋。
- 添加查詢結果流處理能力
- 允許AttributeConverters的CDI注入
- 支持Java 8的日期和時間類型
支持JPA 2.2的供應商:
- DataNucleus
- EclipseLink(自2.7版本以來)
- Hibernate (自5.3版本以來)
JPA的未來工作
[編輯]未來的JPA規範信息可在此處獲得:
- JPA Specification Mailing Lists
- JPA Specification JIRA
2015年11月,Linda DeMichiel在javaee-spec用戶郵件中宣佈Lukas Jungmann接任規範化主管。Linda的聲明還表示,「計劃在Java EE 8時間框架內為JPA 2.2做MR」。[10][11][12]
工具
[編輯]- NetBeans Jeddict
- Eclipse JPA(Dali)
參見
[編輯]- .NET Persistence API(NPA)
- JDBC
- MyBatis
- OpenXava
- pureQuery
- SAP NetWeaver Application Server
- XQJ
- ObjectiveSql (頁面存檔備份,存於互聯網檔案館)
參考文獻
[編輯]- ^ JavaEE 7 tutorial. Oracle. [2018-07-29]. (原始內容存檔於2018-10-02).
- ^ Hibernate EntityManager: Java SE environments (頁面存檔備份,存於互聯網檔案館)
Hibernate EntityManager: Obtaining an EntityManager in a Java SE environment (頁面存檔備份,存於互聯網檔案館) - ^ Barreto, Charlton. SDO and JPA. Digital Walkabout. [5 May 2011]. (原始內容存檔於2011-08-13).
- ^ Edwards, Mike. SDO and Java Persistence Architecture (JPA). Open SOA. osoa.org. [5 May 2011]. (原始內容存檔於2011-09-29).
- ^ Java Persistence with Hibernate. Manning Publications. [8 December 2013]. ISBN 9781617290459. (原始內容存檔於2019-06-05).
Gavin King is the founder of the Hibernate project
- ^ JBoss.com - Industry Leadership. JBoss. [2008-11-17]. (原始內容存檔於2012-10-01).
JSR 220, EJB 3.0 Spec Committee, Gavin King, Bill Burke, Marc Fleury
- ^ Java Persistence API FAQ. Sun Microsystems. [2010-07-01]. (原始內容存檔於2008-08-22).
The Java Persistence API draws upon the best ideas from persistence technologies such as Hibernate, TopLink, and JDO
- ^ IBM WebSphere Application Server V7 Feature Pack for OSGi Applications and Java Persistence API. Download web site. IBM. 27 April 2010 [8 December 2013]. (原始內容存檔於2019-06-10).
- ^ Versant JPA 2-Step Download. Download web site. Actian. [8 December 2013]. (原始內容存檔於2013-12-08).
- ^ Java EE Platform Specification: users@javaee-spec.java.net: Archive — Project Kenai. [2016-11-08]. (原始內容存檔於2016-11-09).
- ^ Java, JavaOne LIVE - Tuesday, Mission, 2015-10-27 [2016-11-08], (原始內容存檔於2019-02-16)
- ^ Jungmann, Lukas. What’s New in the Java Persistence API (JSR 338) [CON7631]. JavaOne 2015 Session Catalog. 10 October 2015 [2016-11-08]. (原始內容存檔於2016-11-09) –透過rainfocus.com.
外部連結
[編輯]一般信息
[編輯]- Documentation for the final version of the EJB3 spec (called JSR220) (頁面存檔備份,存於互聯網檔案館)
- GlassFish's Persistence pageArchive.is的存檔,存檔日期2013-01-12
- JCP Persistence page (頁面存檔備份,存於互聯網檔案館)
教程
[編輯]- Java EE 6 Persistence API Javadoc(頁面存檔備份,存於互聯網檔案館)
- Java EE 6 Persistence API tutorial (頁面存檔備份,存於互聯網檔案館)
- Java EE 7 Persistence API Javadoc (頁面存檔備份,存於互聯網檔案館)
- Java EE 7 Persistence API tutorial (頁面存檔備份,存於互聯網檔案館)
- JPA Tutorial by Prasad Kharkar (頁面存檔備份,存於互聯網檔案館)
- JPA Tutorial from Java Code Geeks (頁面存檔備份,存於互聯網檔案館)
- JPA Tutorial using OpenJPA as implementation (頁面存檔備份,存於互聯網檔案館)
- Persistence in the Java EE 5 tutorial(頁面存檔備份,存於互聯網檔案館)