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.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:缺省情况下缓存被禁用。如果应用程序需要使用二级高速缓存,那么必须显式启用二级高速缓存。
jpa-2.1:缺省情况下,EclipseLink 提供程序已启用二级高速缓存和 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 增强程序来增强实体。请完全不要增强实体,或使用 EclipseLink 增强功能代替 OpenJPA 增强功能来增强实体。
- 或者,保留实体处于其增强状态,并将 Liberty 重新配置为使用 jpa-2.0 功能部件。这会导致 JPA 2.1 中的一些功能失效。
- 数据源用法差别
jpa-2.0 功能部件以保守方式使用非 JTA 数据源,所以调整应用程序时需要的非 JTA 数据源连接极少。
读取数据并且事务未处于活动状态时,jpa-2.1 使用非 JTA 数据源连接。这意味着使用此功能部件时,非 JTA 数据源连接池需要增大。
有关这两个 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 的解包实用程序方法和高速缓存
请参阅 JPA 2.1 规范的 3.1.1 和 7.10 节。
OpenJPA 等价功能部件:EntityManagerImpl.unwrap() 和 OpenJPAPersistence.cast()。
- 从本机 SQL 映射结果时的对象构造
请参阅 JPA 2.1 规范的 3.10.16.2.2 节。
OpenJPA 等价功能部件:ResultShape 对象。