应用程序服务器中的容器可以为 Java™ Enterprise Edition (Java EE) 环境中的 Java Persistence API (JPA) 提供许多必要的功能。应用程序服务器还提供了 JPA 命令工具来帮助您在 Java EE 环境中开发应用程序。
关于此任务
对于此任务,必须在类路径中指定 com.ibm.ws.jpa-2.1.thinclient_9.0.jar
独立 Java 归档 (JAR) 文件以针对 JPA 2.1 接口进行编译。要针对 JPA 2.0 接口进行编译,请指定
com.ibm.ws.jpa-2.0.thinclient_9.0.jar。可从安装映像中获取此独立 JAR 文件。在服务器安装映像中,这些文件的位置是 ${app_server_root}/runtimes
目录。
要点: JPA 应用程序需要的配置方法有别于使用容器管理的持久性 (CMP) 或 Bean 管理的持久性 (BMP) 的应用程序的配置方法。它们并不遵循与实现 CMP 或 BMP 的应用程序相关联的典型部署方法。在 JPA 应用程序中,您必须定义持久性单元并配置适当的属性以确保这些应用程序可以在 Java EE 环境中运行。
容器支持所有必要的插入以确保应用程序在 Java EE 环境中运行。例如,容器可以为应用程序插入 @PersistenceUnit 和 @PersistenceContext。
过程
- 生成实体类。 它们是普通旧式 Java 对象 (POJO) 实体。根据开发模型的不同,可使用部分或全部 JPA 工具:
- 自顶向下映射:从实体定义和对象关系映射开始,然后从该数据派生数据库模式。如果您使用此方法,那么很可能涉及创建对象模型的体系结构,然后编写实体类。这些实体类最终会推动数据库模型的创建。如果您使用从对象模型到关系模型的自顶向下映射,请开发实体类,然后使用 JPA 提供程序的功能来生成基于这些实体类的数据库表。使用 OpenJPA 作为持久性提供程序时,wsmapping 工具对此方法会有所帮助。
- 自底向上映射:从数据模型(即数据库模式)开始,然后一直向上进行处理,直到实体类。使用 OpenJPA 作为持久性提供程序时,wsreversemapping 工具对此方法会有所帮助。
- 中间会合映射:可能是最常用的开发模型。您具有数据模型和部分完成的对象模型。根据目标和需求的不同,您必须协调关系以解决任何分歧。使用 OpenJPA 作为持久性提供程序时,wsmapping
工具和 wsreversemapping 工具都对此方法有所帮助。
应用程序服务器的 JPA 解决方案提供了若干个工具来帮助开发 JPA 应用程序。通过将这些工具与 IBM® Rational® Application Developer 相结合,为 Java EE 或 Java SE 应用程序提供了坚实的开发环境。Rational Application Developer
包含用于插入注释的 GUI 工具、经过定制的 persistence.xml
文件编辑器、数据库资源管理器以及其他功能部件。另一个备选项是 Eclipse Dali
项目。您可以在 Rational Application Developer 或 Eclipse Dali 插件的相应 Web 站点找到有关它们的更多信息。
- 编译实体类。
按您编译任何 Java 类的方式编译实体,除非您正在使用条件 API。如果正在使用条件 API,那么还必须生成条件 API 元模型类:
以下是说明如何使用此选项的示例。
使用 EclipseLink,并随
javac 命令一起提供以下自变量:
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml= persistence.xml_location
app_server_root/java/bin/javac
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.0.jar
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml=app_location/src/META-INF/persistence.xml mypackage\MyEntity.java
使用 OpenJPA 或 WSJPA,并随
javac 命令一起提供以下自变量:
-Aopenjpa.metamodel=true
app_server_root/java/bin/javac
-Aopenjpa.metamodel=true
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.0.jar
mypackage/MyEntity.java
- 使用应用程序服务器的 JPA 增强器工具 eclenhancer(对于 EclipseLink)和
wsenhancer(对于 OpenJPA)来增强实体类。 增强器是一个自动对您编写的持久类添加特定于提供程序的集成字节码的工具。该增强程序对由 Java 编译器生成的字节码进行后处理并添加实现持久性功能所需的字段和方法。虽然应用程序服务器的持久性提供程序都可以在运行时自动增强实体,但是,如果您可以在构建应用程序时增强您的实体,那么您将获得更好的性能。应用程序不会尝试对已增强的实体进行增强。
有关说明如何使用
eclenhancer 工具的示例,请参阅“eclenhancer 命令”主题。有关说明如何使用
wsenhancer 工具的示例,请参阅“wsenhancer 命令”主题。
- 可选: 如果未将开发模型用于自底向上映射,那么数据库表可自动或通过使用
eclenhancer 或 wsmapping 工具生成或更新。
- 缺省情况下,对象关系映射不会自动发生,但是您可以配置应用程序服务器以使用
eclipselink.ddl-generation 属性(对于 EclipseLink)或
openjpa.jdbc.SynchronizeMappings 属性(对于 OpenJPA)来提供该映射。这些属性可通过自动确保数据库表与对象模型相匹配来加速开发。要启用自动映射,请在
persistence.xml 文件中包括下面这一行:
对于 EclipseLink:
<property name="eclipselink.ddl-generation" value =“create-tables”/>
对于 OpenJPA:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
JPA 2.1 标准:
<property name="javax.persistence.schema-generation.database.action" value="create"/>
避免故障: 要在运行时启用自动对象关系映射,必须以 XML 格式在 Java .class 文件、映射文件以及 Java 归档 (JAR) 文件元素中列出所有持久类。
gotcha
- 要手动更新或生成数据库表,请从命令行运行应用程序服务器的 JPA 映射工具以便在数据库中创建这些表。有关如何运行
eclenhancer 工具的示例,请参阅“eclenhancer 命令”主题。有关说明如何使用
wsmapping 工具的示例,请参阅“wsmapping 命令”主题。
- 可选: 如果您使用的是 DB2® 并想使用静态结构化查询语言 (SQL),请运行 wsdbgen 命令。 为使用 wsdbgen 命令,必须安装 IBM Optim pureQuery Runtime。wsdbgen
命令会在 persistence.xml 文件所在的 META-INF 目录下创建 persistence_unit_name.pdqxml
文件。如果有多个持久性单元,那么必须对每个持久性单元运行 wsdbgen 命令。
如果应用程序引用了多个
pdqxml 文件,请使用 Merge
实用程序将它们合并到单个 pdqxml 文件中。将组合
pdqxml 文件指定为 pdqProperties 的 pureQueryXml 属性。请参阅 IBM Integrated Data Management 信息中心中的“合并实用程序”文档。
避免故障: 实现 Java 持久性 API (JPA) 并且已配置为运行静态 SQL 的应用程序可能会遇到各种异常。运行
wsdbgen
命令(可用于预编译应用程序)时或应用程序正在运行并调用 JPA 方法时可能会发生这些异常。为解决此问题,请完成以下步骤:
- 为 iSeries JDBC 驱动程序 V5R4 安装程序临时性修订 (PTF)。请安装编号为 SI32561 和 SI32562 的 PTF。可通过 IBM System i® Support: PTF Cover Letters Web 站点找到这些 PTF。
- 如果使用 DB2 Universal Database™ for iSeries V6R1
或 V5R3,请访问相应发行版的修订 Web 站点。
- 安装所需的 pureQuery 级别,即版本 1.3.100 或更高版本。有关更多信息,请参阅 IBM Optim
pureQuery Runtime Web 站点。安装最新的 JCC 驱动程序(即版本 3.52.95 或更高版本)以及
APAR PK65069 的修订。最新的 JCC 驱动程序已包含在 IBM DB2 软件包中。
- 对于 z/OS® 服务器上的 DB2,请安装 PTF UK39204(对于 V8 备用驱动程序)或 PTF UK39205(对于 V9),并安装 APAR PK67706 的修订。
gotcha
有关说明如何运行此命令的示例,请参阅“wsdbgen 命令”主题。
- 可选: 如果使用的是 OpenJPA 和应用程序管理的标识,请使用 wsappid 工具生成应用程序管理的标识类。 使用应用程序管理的标识时,必须有一个或多个字段是标识字段。如果实体具有多个标识字段且至少有一个字段与另一个实体相关,请使用标识类。应用程序管理的标识工具生成 Java 代码,该代码将标识类用于任何实现“应用程序管理的标识”的持久类。
有关说明如何使用
wsappid 工具的示例,请参阅“wsappid 命令”主题。
示例
以下是
persistence.xml 文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd” ">
<persistence-unit name="TheWildZooPU" transaction-type="JTA">
<jta-data-source>jdbc/DataSourceJNDI</jta-data-source>
<!-- additional Mapping file, in addition to orm.xml>
<mapping-file>META-INF/JPAorm.xml</mapping-file>
<class>com.company.bean.jpa.PersistebleObjectImpl</class>
<class>com.company.bean.jpa.Animal</class>
<class>com.company.bean.jpa.Dog</class>
<class>com.company.bean.jpa.Cat</class>
<properties>
<property name=”eclipselink.ddl-generation”
value=”create-tables”/>
</properties>
</persistence-unit>
</persistence>