为 Java SE 环境开发 JPA 2.x 应用程序

准备持久性应用程序,以便在 Java™ SE 环境中应用程序服务器容器外部进行测试。

关于此任务

注意: 使用这些 JPA 命令工具时,请从 profile_root/bin 目录(而不是 app_server_root/bin 目录)运行它们,以确保命令的版本对于您的发行版级别而言是最新的。

对于此任务,必须在类路径中指定 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/ 目录。

要点: Java Persistence API (JPA) 应用程序需要的配置方法有别于使用容器管理的持久性 (CMP) 或 Bean 管理的持久性 (BMP) 的应用程序的配置方法。它们并不遵循与实现 CMP 或 BMP 的应用程序相关联的典型部署方法。在 JPA 应用程序中,必须定义持久性单元并在 persistence.xml 文件中配置适当的属性以确保这些应用程序可以在 Java SE 环境中运行。
在 Java SE 环境中运行 JPA 应用程序需要注意一些事项:
  • 资源插入不可用。您必须专门或以编程方式配置这些服务。
  • EntityManagerFactory 和 EntityManager 的生命周期由应用程序进行管理。应用程序以编程方式控制这些构造的创建、操作和删除。

过程

  1. 生成实体类。

    它们是普通旧式 Java 对象 (POJO) 实体。根据开发模型的不同,可使用部分或全部 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 站点找到有关它们的更多信息。

  2. 编译实体类。

    按您编译任何 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 
  3. 使用 JPA 增强程序工具来增强实体类,或者指定 Java 代理在运行时执行动态增强。
    • 对于 EclipseLink,请使用 eclenhancer,或者,对于 OpenJPA,请使用 wsenhancer

      该增强程序对由 Java 编译器生成的字节码进行后处理并添加实现持久性功能所需的字段和方法。有关说明如何使用 eclenhancer 工具的示例,请参阅“eclenhancer 命令”主题。有关说明如何使用 wsenhancer 工具的示例,请参阅“wsenhancer 命令”主题。

    • 可指定 Java 代理机制在运行时执行动态增强。例如,在命令提示符下输入以下命令:
      对于 EclipseLink:
      java -javaagent:${app_client_root}/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.jar com.xyz.Main  
      对于 OpenJPA:
      java -javaagent:${app_client_root}/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.jar com.xyz.Main  
      注意: 可运行增强器工具或指定 javaagent 命令。不必同时执行两者。
  4. 可选: 如果未将开发模型用于自底向上映射,那么数据库表可自动或通过使用 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 命令”主题。
  5. 可选: 如果您使用的是 OpenJPA 和 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 方法时可能会发生这些异常。为解决此问题,请完成以下步骤:
    1. 为 iSeries JDBC 驱动程序 V5R4 安装程序临时性修订 (PTF)。请安装编号为 SI32561 和 SI32562 的 PTF。可通过 IBM System i® Support: PTF Cover Letters Web 站点找到这些 PTF。
    2. 如果使用 DB2 Universal Database™ for iSeries V6R1 或 V5R3,请访问相应发行版的修订 Web 站点。
    3. 安装所需的 IBM Optim pureQuery Runtime 级别,即版本 1.3.100 或更高版本。有关更多信息,请参阅 IBM Data Studio pureQuery Runtime Web 站点。安装最新的 JCC 驱动程序(即版本 3.52.95 或更高版本)以及 APAR PK65069 的修订。最新的 JCC 驱动程序已包含在 IBM DB2 软件包中。
    4. 对于 z/OS® 服务器上的 DB2,请安装 PTF UK39204(对于 V8 备用驱动程序)或 PTF UK39205(对于 V9),并安装 APAR PK67706 的修订。
    gotcha

    有关说明如何运行此命令的示例,请参阅“wsdbgen 命令”主题。

  6. 可选: 如果使用的是 OpenJPA 和应用程序管理的标识,请使用 wsappid 工具生成应用程序管理的标识类。 使用应用程序管理的标识时,必须有一个或多个字段是标识字段。如果实体具有多个标识字段且至少有一个字段与另一个实体相关,请使用标识类。应用程序管理的标识工具生成 Java 代码,该代码将标识类用于任何实现“应用程序管理的标识”的持久类。

    有关说明如何使用 wsappid 工具的示例,请参阅“wsappid 命令”主题。

示例

以下是用于 Java SE 环境的样本 persistence.xml 文件:

对于 EclipseLink:

<?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="RESOURCE_LOCAL">
          <!-- 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="javax.persistence.jdbc.driver"
                        value="org.apache.derby.jdbc.EmbeddedDriver"/>
             <property name="javax.persistence.jdbc.url"
                       value="jdbc:derby:target/database/jpa-test-database;create=true" />
             <property name="javax.persistence.schema-generation.database.action"
                        value="create" />
             <property name="javax.persistence.jdbc.user"
                        value="user" />
             <property name="javax.persistence.jdbc.password"
                        value="password"/>
          </properties>
     </persistence-unit>
</persistence>
      
对于 OpenJPA:
<?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.0"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                       http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
            <persistence-unit name="TheWildZooPU" transaction-type="RESOURCE_LOCAL">
              <!-- 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="openjpa.ConnectionDriverName"
                                value="org.apache.derby.jdbc.EmbeddedDriver" />
                        <property name="openjpa.ConnectionURL"
                                value="jdbc:derby:target/database/jpa-test-database;create=true" />
                        <property name="openjpa.Log"
                                value="DefaultLevel=INFO,SQL=TRACE,File=./dist/jpaEnhancerLog.log,Runtime=INFO ,Tool=INFO" />
                        <property name="openjpa.ConnectionFactoryProperties"
                                value="PrettyPrint=true,PrettyPrintLineLength=72" />
                        <property name="openjpa.jdbc.SynchronizeMappings"
                                value="buildSchema(ForeignKeys=true)" />
                        <property name="openjpa.ConnectionUserName"
                                value="user" />
                        <property name="openjpa.ConnectionPassword"
                                value="password"/>
                        </properties>
            </persistence-unit>
</persistence>
    

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadevsefepplus
文件名:tejb_jpadevsefepplus.html