Java 持續性 API (JPA)

「資料持續性」對應用程式的意義在於,持續保存和擷取永久儲存體系統中的資訊。 從 EJB 3.0 規格開始, Java™ 持續性 API (JPA) 提供一種機制來管理持續性,以及與物件相關的對映和功能。

Open Liberty 如需 JPA 2.1 以及更新版本與 Liberty搭配使用的相關資訊,請參閱 Open Liberty 網站

由於需要存取關聯式資料庫,持續性對企業應用程式很重要。 針對這種環境開發的應用程式必須自行管理持續性,或是使用協力廠商的解決方案,透過持續性來處理資料庫的更新和擷取。

JPA 規格本身就會在內部定義物件/關聯對映,而不倚靠供應商專用的對映實作。 JPA 是以適用於 Java Enterprise Edition (Java EE) 環境的 Java 程式設計模型為基礎,但 JPA 可以在 Java SE 環境內運作,以測試應用程式功能。

JPA 代表簡化的持續性程式設計模型。 JPA 規格會明確定義物件/關聯對映,而不倚靠供應商專用的對映實作。 JPA 使用註釋或 XML,將物件對映至一或多個資料庫表格,來將與物件相關對映的重要作業標準化。 為了進一步簡化持續性程式設計模型:

  • EntityManager API 可以在資料庫中持續保存、更新、擷取或移除物件。
  • EntityManager API 和物件/關聯對映 meta 資料可處理大部分的資料庫作業,您不需要撰寫 JDBC 或 SQL 程式碼來維護持續性。
  • JPA 提供的查詢語言是獨立 EJB 查詢語言(亦稱為 JPQL)的延伸,可供您用來擷取物件,而不必撰寫您所用資料庫專用的 SQL 查詢。

JPA 設計成在 Java Enterprise Edition (Java EE) 儲存器內外運作。 當您在儲存器內執行 JPA 時,應用程式可以使用儲存器來管理持續性環境定義。 如果沒有儲存器可用來管理 JPA,應用程式必須自行處理持續性環境定義的管理。 設計成由儲存器管理持續性的應用程式在處理持續性時,雖不需要大量的程式碼實作,但是這些應用程式無法在儲存器外部使用。 管理自己的持續性的應用程式可以在儲存器環境或 Java SE 環境中運作。

支援 EJB 3.x 程式設計模型的 Java EE 儲存器必須支援 JPA 實作,也稱為持續性提供者。 JPA 持續性提供者使用下列元素,能在 EJB 3.x 環境中更容易管理持續性:

持續性單元
定義完整的 Object-Relational Model 對映 Java 類別 (實體 + 支援結構) 與關聯式資料庫。 EntityManagerFactory 會使用此資料,來建立可透過 EntityManager 存取的持續性環境定義。
EntityManagerFactory
用來建立 EntityManager,以便與資料庫互動。 應用程式伺服器儲存器通常會提供此功能,但是如果您使用 JPA 應用程式管理的持續性,就需要 EntityManagerFactory。 一個 EntityManagerFactory 實例代表一項持續性環境定義。
持續性環境定義
定義應用程式目前正在操作的一組作用中實例。 您可以手動或透過注入,來建立持續性環境定義。
EntityManager
這種資源管理程式負責維護應用程式正在使用的作用中實體物件集合。 EntityManager 會處理資料庫互動,以及物件/關聯對映的 meta 資料。 一個 EntityManager 實例代表一項持續性環境定義。 儲存器中的應用程式可以透過注入應用程式或在 Java 元件名稱空間中查閱,來取得 EntityManager 。 如果應用程式會管理其持續性,則會從 EntityManagerFactory 取得 EntityManager。
實體物件
簡式 Java 類別,以最簡單的形式代表資料庫表格中的列。 實體物件可以是具體類別或抽象類別。 它們會利用內容或欄位來維護狀態。

Java 持續性 API 和區域交易環境定義

WebSphere 為受管理元件同時提供了廣域及區域交易環境定義。 透過向受管理元件提供這些環境定義以及讓執行緒服務受管理元件,不論是針對廣域交易環境定義 (GTC) 還是區域交易環境定義 (LTC),交易一律處於作用中狀態。

此處理不會影響應用程式管理的持續性環境定義,JPA EntityManagers 透過利用 @PersistenceUnit 注入到應用程式中的 EntityManagerFactories 來獲得這些持續性環境定義。 但是,此處理可以影響 JPA EntityManagers 透過 @PersistenceContext 注入的儲存器管理的持續性環境定義 (CMTS)。 JPA API 方法需要在 GTC 界限外部呼叫時擲出 TransactionRequiredException,並且此異常狀況仍依照預期予以擲出。 不過,當 LTC 保持處於作用中狀態且直到啟動新 GTC 或者達到元件服務呼叫的末尾時,CMTS 持續性環境定義保持處於作用中狀態。 由 CMTS EntityManager 使用尋找或查詢功能在 LTC 範圍內提取的實體,仍由該持續性環境定義進行管理,而不會立即變成分離狀態。 作為此處理(類似於部分 JPA 程式設計手冊的非預期行為及行為差異)的結果,一旦 GTC 啟動且該持續性環境定義所管理的實體變成分離狀態,則將分離由 LTC 保持處於作用中狀態的持續性環境定義。