Java 持續性 API 2.1 行為的變更
如果您的應用程式已使用 jpa-2.0 特性,請讓現有的應用程式繼續使用 jpa-2.0 特性,以防發生任何移轉問題。 如果是新的應用程式,最好使用 jpa-2.1 特性,它可讓您充分利用 JPA 2.1 規格所提供的新特性。 如果您想讓現有的應用程式改用 jpa-2.1 特性,而不使用 jpa-2.0 特性,可能需要在移轉程序中調整應用程式。
jpa-2.0 與 jpa-2.1 之間的差異
請注意 jpa-2.0 和 jpa-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 物件。