Java 持續性 API 2.1 行為變更

如果您的應用程式已使用 jpa-2.0 特性,請讓現有的應用程式繼續使用 jpa-2.0 特性,以防發生任何移轉問題。 如果是新的應用程式,最好使用 jpa-2.1 特性,它可讓您充分利用 JPA 2.1 規格所提供的新特性。 如果您想讓現有的應用程式改用 jpa-2.1 特性,而不使用 jpa-2.0 特性,可能需要在移轉程序中調整應用程式。

jpa-2.0jpa-2.1 之間的差異

請注意 jpa-2.0jpa-2.1 特性之間的幾個主要差異。 請參閱下列各項:

PersistenceProvider 類別名稱差異
jpa-2.0
  • IBM® 提供者:com.ibm.websphere.persistence.PersistenceProviderImpl
  • OpenJPA 提供者:org.apache.openjpa.persistence.PersistenceProviderImpl
jpa-2.1
  • org.eclipse.persistence.jpa.PersistenceProvider
快取行為差異

jpa-2.0:依預設會停用快取。 如果您的應用程式需要利用 L2 快取,必須明確啟用它。

jpa-2.1:依預設,EclipseLink 提供者會啟用 L2 快取和 QueryCache。 您必須確定這項設定是您應用程式的最佳選項。 如果您是在叢集之類的分散式環境中執行,則需要停用快取,或是瞭解不同的節點可能有不同的資料。

加強 / 編排差異

jpa-2.0:OpenJPA 需要加強實體。 如需相關資訊,請參閱產品說明文件中的 JPA 2.0 的 JPA 實體加強功能

jpa-2.1:EclipseLink 可以搭配未加強的實體使用。 WebSphere Application Server 支援靜態加強。

有些特性可能無法使用,例如:延遲載入和某些效能提昇。

  • 如果實體類別經過靜態加強,以便與 jpa-2.0 (OpenJPA) 提供者一起使用,在使用 jpa-2.1 提供者之前,必須重新編譯這些類別。
  • 如果 Liberty 配置成使用 jpa-2.1 特性,且使用 OpenJPA 加強功能來加強實體,則會擲出下列錯誤:
    java.lang.NoClassDefFoundError: 
    org.apache.openjpa.enhance.PersistenceCapable.
  • 發生 NoClassDefFoundError 是因為當 Liberty 伺服器配置成使用 jpa-2.1時,伺服器在執行時期無法使用 OpenJPA 類別。
    • 如果要解決這個問題,請重新編譯應用程式,確定未利用 OpenJPA 加強程式來加強實體。 根本不要加強實體,或不要使用 OpenJPA 加強功能,而是利用 EclipseLink 加強功能來加強實體。
    • 或者,讓實體維持其加強狀態,並重新配置 Liberty 來使用 jpa-2.0 特性。 結果會失去 JPA 2.1 的部分功能。
資料來源用法的差異

jpa-2.0 特性很少使用 non-jta-datasource,因此當您調整應用程式時,需要建立少量的 non-jta-datasource 連線。

在讀取資料以及交易不在作用中時,jpa-2.1 會使用 non-jta-datasource 連線。 也就是說,當使用這項特性時,需要較大的 non-jta-datasource 連線儲存區。

如需兩個 JPA 提供者之間的其他差異,請參閱 OpenJPA-> EclipseLink 移轉手冊頁面

OpenJPA 所提供的 JPA 2.1 特性

OpenJPA 是 JPA 2.0 提供者,它有一些特性的運作方式類似於 JPA 2.1 的新特性。 這表示,如果您現有的應用程式使用 jpa-2.0 特性,您想使用一些 JPA 2.1 特性,您不需要切換至 jpa-2.1 特性。 對於新特性,您倒是可以使用 OpenJPA 所提供的同等特性。 OpenJPA 所提供的部分 JPA 2.1 重要特性如下:

綱目產生

當使用這個特性時,您可以產生 DDL,或直接與資料庫互動,以根據 JPA 實體定義來定義表格綱目。 如需相關資訊,請參閱 JPA 2.1 規格第 9.4 節

OpenJPA 同等特性: 綱目對映器

實體圖形

當使用這個特性時,您可以指定實體物件圖形的提取或處理方式。 如需相關資訊,請參閱 JPA 2.1 規格第 3.7 節。

OpenJPA 同等特性: FetchPlan 和 FetchGroup

儲存程序查詢

當使用這個特性時,您可以呼叫儲存在資料庫中的程序。 如需相關資訊,請參閱 JPA 2.1 規格第 3.10.17 節

OpenJPA 同等特性: 查詢呼叫

基本屬性類型轉換

當使用這個特性時,您可以在屬性實體表示法與資料庫表示法之間,轉換基本類型屬性。 如需相關資訊,請參閱 JPA 2.1 規格第 3.8 節。

OpenJPA 同等特性: 外部化程式特性

@Index 和 @ForeignKey 註釋

請參閱 JPA 2.1 規格的第 11.1.19 節與第 11.1.23 節。

OpenJPA 同等特性 :OpenJPA 的 @Index 和 @ForeignKey

EntityManager、Cache 的 unwrap 公用程式方法

請參閱 JPA 2.1 規格的第 3.1.1 節與第 7.10 節。

OpenJPA 同等特性: EntityManagerImpl.unwrap ()OpenJPAPersistence.cast ()

對映原生 SQL 結果時的物件建構

請參閱 JPA 2.1 規格的第 3.10.16.2.2 節。

OpenJPA 同等特性: ResultShape 物件。