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
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.
- 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.
- 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
- 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.
- 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: 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".
- 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: 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:
- 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.
- Wenn Sie DB2 Universal Database for iSeries V6R1
oder V5R3 verwenden, rufen Sie die Website mit den Fixes für das entsprechende Release auf.
- 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.
- 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.
- 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>