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）。

**實體**
持久化實體是一個輕量級的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的應用程式。 Hibernate EntityManager: Obtaining an EntityManager in a Java SE environment date=20190601084640  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有著截然不同的目標，被認為是互補的。SDO API專為面向服務的體系結構，多種數據格式而非關係數據和多種編程語言而設計。JCP管理SDO API的Java版本；SDO API的C++版本通過OASIS進行管理。

**Hibernate**
Hibernate為Java提供了一個開源的對象關係映射框架。版本3.2及更高版本提供了Java 持久化 API的實現。Gavin King創立了Hibernate項目。他代表JBoss參加JSR 220，這是負責開發JPA的JCP專家組。這引發了圍繞JPA和Hibernate之間關係的持續爭議和猜測。Sun Microsystems表示，這些想法來自幾個框架，包括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- JBoss with Hibernate-  Kundera date=20170222073553 - ObjectDB- OpenJPA- OrientDB from Orient Technologies- Versant Corporation JPA (not relational, object database)

**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”。

**工具**
 NetBeans Jeddict- Eclipse JPA（Dali）

**參見**
 .NET Persistence API（NPA）- JDBC- MyBatis- OpenXava- pureQuery- SAP NetWeaver Application Server- XQJ-  ObjectiveSql date=20201229135311 

**參考文獻**

**外部鏈接**

**一般信息**
  Documentation for the final version of the EJB3 spec (called JSR220) date=20200426220450 -  GlassFish's Persistence pagedate=2013-01-12 -  JCP Persistence page date=20210119165310 

**教程**
  Java EE 6 Persistence API Javadocdate=20120820044211 -  Java EE 6 Persistence API tutorial date=20200508012524 -  Java EE 7 Persistence API Javadoc date=20200924194326 -  Java EE 7 Persistence API tutorial date=20190402121325 -  JPA Tutorial by Prasad Kharkar date=20200728085039 -  JPA Tutorial from Java Code Geeks date=20201108103920 -  JPA Tutorial using OpenJPA as implementation date=20201204102244 -  Persistence in the Java EE 5 tutorialdate=20191017191350