Java Persistence 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:缺省情况下缓存被禁用。 如果应用程序需要使用二级高速缓存,那么必须显式启用二级高速缓存。

jpa-2.1:缺省情况下,EclipseLink 提供程序已启用二级高速缓存和 QueryCache。 必须确保此设置是您的应用程序的最佳选项。 如果正在分布式环境(例如,集群)中运行,那么您需要禁用高速缓存,或理解不同节点可能具有不同数据。

增强功能/织入差别

jpa-2.0:OpenJPA 要求增强实体。 有关更多信息,请参阅产品文档中的 JPA 实体的增强功能 2.0

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 增强程序来增强实体。 请完全不要增强实体,或使用 EclipseLink 增强功能代替 OpenJPA 增强功能来增强实体。
    • 或者,使实体处于增强状态,然后重新配置 Liberty 以使用 jpa-2.0 功能部件。 这会导致 JPA 2.1 中的一些功能失效。
数据源用法差别

jpa-2.0 功能部件以保守方式使用非 JTA 数据源,所以调整应用程序时需要的非 JTA 数据源连接极少。

读取数据并且事务未处于活动状态时,jpa-2.1 使用非 JTA 数据源连接。 这意味着使用此功能部件时,非 JTA 数据源连接池需要增大。

请参阅 OpenJPA -> EclipseLink 迁移指南页面 ,以了解两个 JPA 提供程序之间的更多差异。

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 等效功能部件: Schema Mapper

实体图形

使用此功能部件,可指定实体对象图形的访存或处理。 有关更多信息,请参阅 JPA 2.1 规范的 3.7 节。

OpenJPA 等效功能部件: FetchPlan 和 FetchGroup

存储过程查询

使用此功能,可调用数据库中存储的过程。 有关更多信息,请参阅 JPA 2.1 规范的 部分 3.10.17

OpenJPA 等效功能部件: 查询调用

基本属性类型转换

使用此功能部件,可在基本类型属性的属性实体表示与数据库表示之间转换。 有关更多信息,请参阅 JPA 2.1 规范的 3.8 节。

OpenJPA 等效功能部件: Externalizer 功能部件

@Index 和 @ForeignKey 注释

请参阅 JPA 2.1 规范的 11.1.19 和 11.1.23 节。

OpenJPA 等效功能: OpenJPA's @Index和 @ForeignKey

EntityManager 的解包实用程序方法和高速缓存

请参阅 JPA 2.1 规范的 3.1.1 和 7.10 节。

OpenJPA 等效功能 : .unwrap() EntityManagerImplOpenJPAPersistence.cast()

从本机 SQL 映射结果时的对象构造

请参阅 JPA 2.1 规范的 3.10.16.2.2 节。

OpenJPA 等效功能部件: ResultShape 对象。