JPA-2.x-Anwendungen für eine Java SE-Umgebung entwickeln

In diesem Artikel wird beschrieben, wie Sie Persistenzanwendungen vorbereiten, um sie außerhalb des Anwendungsservercontainers in einer Java™ SE-Umgebung testen zu können.

Informationen zu diesem Vorgang

Achtung: Führen Sie die JPA-Befehlstools im Verzeichnis Profilstammverzeichnis/bin und nicht im Verzeichnis Stammverzeichnis_des_Anwendungsservers/bin aus, um sicherzustellen, dass Sie die neueste Version der Befehle für Ihren Release-Level haben.

Für diese Task müssen Sie die eigenständige JAR-Datei (Java-Archiv) com.ibm.ws.jpa-2.1.thinclient_9.0.jar in Ihrem Klassenpfad für die Kompilierung mit JPA 2.1-Schnittstellen angeben. Für die Kompilierung mit JPA 2.0-Schnittstellen müssen Sie com.ibm.ws.jpa-2.0.thinclient_9.0.jar in Ihrem Klassenpfad angeben. Diese eigenständige JAR-Datei ist in den Installationsimages verfügbar. Diese Dateien befinden sich im Serverinstallationsimage im Verzeichnis ${Stammverzeichnis_des_Anwendungsservers}/runtimes/.

Wichtig: Für JPA-Anwendungen (Java Persistence API) sind andere Konfigurationsverfahren erforderlich als für Anwendungen, die CMP (Container-Managed Persistence, über Container realisierte Transaktionspersistenz) oder BMP (Bean-Managed Persistence, über JavaBeans realisierte Transaktionspersistenz) verwenden. Sie folgen nicht den üblichen Implementierungsverfahren, die für Anwendungen angewendet werden, die CMP oder BMP implementieren. In JPA-Anwendungen müssen Sie eine Persistenzeinheit definieren und die geeigneten Eigenschaften in der Datei persistence.xml konfigurieren, um sicherzustellen, dass die Anwendungen in einer Java SE-Umgebung ausgeführt werden können.
Für die Ausführung von JPA-Anwendungen in einer Java SE-Umgebung müssen folgende Aspekte berücksichtigt werden:
  • Die Ressourceninjektion ist nicht verfügbar. Sie müssen diese Services gesondert oder über das Programm konfigurieren.
  • Der Lebenszyklus von EntityManagerFactory und EntityManager wird von der Anwendung gesteuert. Anwendungen steuern das Erstellen, Bearbeiten und Löschen dieser Konstrukte über das Programm.

Vorgehensweise

  1. Generieren Sie Ihre Entitätsklassen.

    Dies sind POJO-Entitäten (Plain Old Java Object). Abhängig von Ihrem Entwicklungsmodell müssen Sie entweder einige der folgenden JPA-Tools oder alle verwenden:

    Top-down-Zuordnung
    Sie beginnen damit, dass Sie die Eintitätsdefinitionen und die objektbezogenen Zuordnungen neu erstellen, und anschließend leiten Sie die Datenbankschemas von diesen Daten ab. Wenn Sie diese Vorgehensweise verwenden, befassen Sie sich vermutlich mit der Erstellung der Architektur Ihres Objektmodells und anschließend mit dem Schreiben Ihrer Entitätsklassen. Diese Entitätsklassen würden schließlich für die Erstellung Ihres Datenbankmodells verwendet werden. Wenn Sie eine Top-down-Zuordnung vom Objektmodell zum relationalen Modell verwenden, entwickeln Sie die Entitätsklassen und verwenden anschließend die Persistenzproviderfunktionalität, um die auf den Entitätsklassen basierenden Datenbanktabellen zu generieren. Das Tool wsmapping bietet Unterstützung bei dieser Vorgehensweise, wenn Sie OpenJPA als Persistenzprovider verwenden.
    Bottom-up-Zuordnung
    Sie beginnen mit Ihrem Datenmodell, das aus den Datenbankschemas besteht, und arbeiten sich zu den Entitätsklassen nach oben. Das Tool wsreversemapping bietet Unterstützung bei dieser Vorgehensweise, wenn Sie OpenJPA als Persistenzprovider verwenden.
    Meet-in-the-middle-Zuordnung
    Dies ist vermutlich das am häufigsten verwendete Entwicklungsmodell. Sie verwenden eine Kombination aus dem Datenmodell und dem teilweise erstellten Objektmodell. Abhängig von den Zielen und Anforderungen müssen die Beziehungen zwischen den Modellen ausgehandelt werden, um Abweichungen zu beheben. Die Tools wsmapping und wsreversemapping bieten Unterstützung bei dieser Vorgehensweise, wenn Sie OpenJPA als Persistenzprovider verwenden.

    Die JPA-Lösung für den Anwendungsserver stellt mehrere Tools bereit, die Sie bei der Entwicklung von JPA-Anwendungen unterstützen. In Kombination mit IBM® Rational Application Developer bilden diese Tools eine solide Entwicklungsumgebung für Java EE- und Java SE-Anwendungen. Rational Application Developer enthält GUI-Tools für das Einfügen von Annotationen, einen Editor zum Anpassen der Datei persistence.xml, einen Datenbank-Explorer und weitere Features. Eine andere Alternative ist das Eclipse-Dali-Projekt. Weitere Informationen zu Rational Application Developer und zum Eclipse-Dali-Plug-in finden Sie auf den entsprechenden Websites.

  2. Kompilieren Sie die Entitätsklassen.

    Kompilieren Sie die Entitäten so, wie Sie Java-Klassen kompilieren würden, es sei denn, Sie verwenden die API Criteria. Wenn Sie die API Criteria verwenden, müssen Sie auch die Metamodellklassen der API Criteria verwenden.

    Im Folgenden finden Sie einige Beispiele für die Verwendung dieser Option.

    Wenn Sie EclipseLink verwenden, müssen Sie dem Befehl javac die folgenden Argumente hinzufügen:
    -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 
    Wenn Sie OpenJPA verwenden, müssen Sie dem Befehl javac die folgenden Argumente hinzufügen:
    -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. Erweitern Sie die Entitätsklasse mit dem JPA-Erweiterungstool, oder geben Sie den Java-Agenten an, um zur Ausführungszeit eine dynamische Erweiterung auszuführen.
    • Verwenden Sie für EclipseLink das Tool eclenhancer und für OpenJPA das Tool wsenhancer.

      Das Erweiterungstool führt eine Nachbearbeitung für den vom Java-Compiler generierten Code durch und fügt die Felder und Methoden hinzu, die für die Implementierung der Persistenzfeatures erforderlich sind. Beispiele für die Verwendung des Tools eclenhancer finden Sie im Artikel zum Befehl eclenhancer. Beispiele für die Verwendung des Tools wsenhancer finden Sie im Artikel zum Befehl wsenhancer.

    • Sie können einen Java-Agent-Mechanismus angeben, der die dynamische Erweiterung zur Ausführungszeit ausführt. Geben Sie beispielsweise an der Eingabeaufforderung Folgendes ein:
      Für EclipseLink:
      java -javaagent:${Stammverzeichnis_des_Anwendungsclients}/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.jar com.xyz.Main  
      Für OpenJPA:
      java -javaagent:${Stammverzeichnis_des_Anwendungsclients}/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.jar com.xyz.Main  
      Achtung: Sie können ein Erweiterungstool ausführen oder den Befehl javaagent angeben. Sie müssen nicht beide Aktionen ausführen.
  4. Optional: Falls Sie nicht das Entwicklungsmodell für die Bottom-up-Zuordnung verwenden, generieren oder aktualisieren Sie die Datenbanktabellen automatisch oder mit dem Tool "eclenhancer" oder wsmapping.
    • Standardmäßig wird die objektbezogene Zuordnung nicht automatisch ausgeführt, Sie können den Anwendungsserver jedoch so konfigurieren, dass er diese Zuordnung mit der Eigenschaft eclipselink.ddl-generation für EclipseLink oder openjpa.jdbc.SynchronizeMappings für OpenJPA bereitstellt. Diese Eigenschaften können die Entwicklung beschleunigen, indem sie automatisch sicherstellen, dass die Datenbanktabellen mit dem Objektmodell übereinstimmen. Um die automatische Zuordnung zu aktivieren, nehmen Sie folgende Zeile in die Datei persistence.xml auf:
      Für EclipseLink:
      <property name=”eclipselink.ddl-generation” value=”create-tables”/>  
      Für OpenJPA:
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>  
      JPA 2.1-Standard:
      <property name=”javax.persistence.schema-generation.database.action” value=”create”/> 
      Fehler vermeiden Fehler vermeiden: Damit die automatische objektbezogene Zuordnung zur Ausführungszeit aktiviert wird, müssen alle persistenten Klassen in der Java-Datei .class, der Zuordnungsdatei und den JAR-Dateielementen (Java Archive) im XML-Format aufgelistet sein.gotcha
    • Damit die Datenbanktabellen manuell aktualisiert oder generiert werden, führen Sie das JPA-Zuordnungstool für den Anwendungsserver in der Befehlszeile aus, um die Tabellen in der Datenbank zu erstellen. Beispiele für die Verwendung des Tools eclenhancer finden Sie im Artikel zum Befehl "eclenhancer". Beispiele für die Verwendung des Tools wsmapping finden Sie im Artikel zum Befehl "wsmapping".
  5. Optional: Wenn Sie mit DB2 arbeiten und statisches SQL verwenden möchten, führen Sie den Befehl wsdbgen aus. Zur Verwendung des Befehls wsdbgen muss IBM Optim PureQuery Runtime installiert sein. Der Befehl wsdbgen erstellt die Datei Name_der_Persistenzeinheit.pdqxml in demselben Verzeichnis META-INF, in dem sich auch die Datei persistence.xml befindet. Wenn Sie mehrere Persistenzeinheiten haben, muss der Befehl wsdbgen für jede Persistenzeinheit ausgeführt werden.

    Wenn eine Anwendung mehrere Dateien pdqxml referenziert, verwenden Sie das Dienstprogramm Merge, um diese Dateien zu einer einzigen Datei pdqxml zusammenzuführen. Geben Sie die kombinierte Datei pdqxml als pureQueryXml-Eigenschaft von "pdqProperties" an. Lesen Sie die Dokumentation zum Dienstprogramm "Merge" im Information Center von IBM Integrated Data Management.

    Fehler vermeiden Fehler vermeiden: In Anwendungen, die JPA (Java Persistence API) verwenden und für die Ausführung der statischen Structured Query Language (SQL) konfiguriert sind, können verschiedene Ausnahmen eintreten. Diese Ausnahmen können bei der Ausführung des Befehls wsdbgen eintreten, mit dem Sie die Anwendung vorbereiten, oder beim Aufruf einer JPA-Methode durch die aktive Anwendung. Sie können das Problem wie folgt beheben:
    1. Installieren Sie die vorläufigen Programmkorrekturen (PTF, Program Temporary Fix) für iSeries JDBC Driver V5R4. Installieren Sie die PTFs mit den Nummern SI32561 und SI32562. Sie finden die PTFs über die Website "Support: PTF Cover Letters" IBM System i Support.
    2. Wenn Sie DB2 Universal Database for iSeries V6R1 oder V5R3 verwenden, rufen Sie die Website mit den Fixes für das entsprechende Release auf.
    3. Installieren Sie die erforderliche Version von IBM Optim PureQuery Runtime (Version 1.3.100 oder höher). Weitere Informationen finden Sie auf der Website von IBM Data Studio pureQuery Runtime. Installieren Sie die neuesten JCC-Treiber (Version 3.52.95 oder höher) mit dem Fix für APAR PK65069. Die neuesten JCC-Treiber sind im Softwarepaket von IBM DB2 enthalten.
    4. Installieren Sie für DB2 auf einem z/OS-Server PTF UK39204 für den alternativen Treiber der Version 8 bzw. PTF UK39205 für Version 9, und installieren Sie den Fix für APAR PK67706.
    gotcha

    Beispiele für die Ausführung dieses Befehls finden Sie im Artikel zum Befehl wsdbgen.

  6. Optional: Wenn Sie OpenJPA und anwendungsverwaltete Identitäten verwenden, generieren Sie mit dem Tool wsappid eine Klasse für anwendungsverwaltete Identitäten. Wenn Sie eine anwendungsverwaltete Identität verwenden, muss mindestens ein Feld ein Identitätsfeld sein. Verwenden Sie eine Identitätsklasse, wenn Ihre Entität mehrere Identitätsfelder enthält und mindestens eines der Felder mit einer anderen Entität verknüpft ist. Das anwendungsverwaltete Identitätstool generiert Java-Code, der die Identitätsklasse für alle persistenten Typen verwendet, die die anwendungsverwaltete Identität implementieren.

    Beispiele für die Verwendung des Tools wsappid finden Sie im Artikel zum Befehl "wsappid".

Beispiel

Im Folgenden sehen Sie eine Beispieldatei persistence.xml für die Java SE-Umgebung:

Für 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">
          <!-- weitere Zuordnungsdatei neben "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>
      
Für 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">
              <!-- weitere Zuordnungsdatei neben "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>
    

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadevsefepplus
Dateiname:tejb_jpadevsefepplus.html