Développement d'applications JPA 2.x pour un environnement Java SE

Vous pouvez préparer des applications persistantes à tester hors du conteneur de serveur d'applications dans un environnement Java™ SE.

Pourquoi et quand exécuter cette tâche

Avertissement : Lorsque vous utilisez ces outils de commande JPA, exécutez-les à partir du répertoire racine_profil/bin et non à partir du répertoire racine_serveur_app/bin. Ainsi, vous êtes certain de disposer de la dernière version des commandes pour votre niveau de version.

Pour cette tâche, vous devez spécifier le fichier JAR (Java archive) autonome com.ibm.ws.jpa-2.1.thinclient_9.0.jar dans votre chemin d'accès aux classes pour la compilation avec des interfaces JPA 2.1. Pour effectuer la compilation avec des interfaces JPA 2.0, spécifiez le fichier com.ibm.ws.jpa-2.0.thinclient_9.0.jar dans votre chemin d'accès aux classes. Ce fichier JAR autonome est accessible via les images d'installation. L'emplacement de ces fichiers sur l'image d'installation du serveur est le répertoire ${app_server_root}/runtimes/.

Important : Les applications utilisant l'API Java requièrent différentes techniques de configuration provenant d'applications utilisant la persistance gérée par conteneur (CMP) ou la persistance gérée par bean (BMP). Elles ne sont pas déployées via les techniques de déploiement par défaut des applications implémentant CMP ou BMP. Dans les applications JPA, vous devez définir une unité de persistance et configurer les propriétés appropriées dans le fichier persistence.xml afin de garantir que les applications peuvent être exécutées dans un environnement Java SE.
Vous devez tenir compte de certains points lors de l'exécution des applications JPA dans un environnement Java SE :
  • Le service d'injection de ressources n'est pas disponible. Vous devez configurer ces services de manière spécifique ou les configurer par programme.
  • Le cycle de vie des éléments EntityManagerFactory et EntityManager est géré par l'application. Les applications contrôlent la création, la manipulation et la suppression de ces constructions par programme.

Procédure

  1. Générez les classes entités.

    Il s'agit d'entités POJO (Plain Old Java Object). En fonction de votre modèle de développement, vous pouvez être amené à utiliser certains ou tous les outils JPA :

    Mappage descendant
    Ce mappage consiste à commencer par définir les entités et effectuer des mappages au niveau des objets puis générer ensuite les schémas de base de données à partir de ces données. Si vous utilisez cette approche, vous faites partie des utilisateurs qui doivent créer l'architecture du modèle d'objet avant de procéder à l'écriture des classes entités. Ces dernières peuvent éventuellement servir de modèle lors de la création du modèle de base de données. Si vous utilisez un mappage descendant du modèle d'objet avec le modèle relationnel, vous devez développer les classes d'entités, puis utiliser la fonctionnalité Votre fournisseur de persistance pour générer les tables de base de données qui sont basées sur les classes d'entités. L'outil wsmapping s'avère utile pour cette approche lorsque vous utilisez OpenJPA comme fournisseur de persistance.
    Mappage ascendant
    Ce mappage consiste à partir du modèle de données, qui correspond aux schémas de base de données, puis à remonter vers les classes d'entité. L'outil wsreversemapping s'avère utile pour cette approche lorsque vous utilisez OpenJPA comme fournisseur de persistance.
    Mappage intermédiaire
    Il s'agit du modèle de développement le plus couramment utilisé. La combinaison du modèle de données avec le modèle d'objet est partiellement terminée. Selon vos objectifs et vos exigences, vous devez négocier les relations afin de résoudre les divergences éventuelles. Dans cette approche, les outils wsmapping et wsreversemapping peuvent s'avérer utiles lorsque vous utilisez OpenJPA comme fournisseur de persistance.

    La solution JPA du serveur d'applications fournit plusieurs outils qui facilitent le développement d'applications utilisant JPA. La combinaison de ces outils avec IBM® Rational Application Developer garantit un environnement de développement solide pour les applications Java EE ou Java SE. Rational Application Developer comprend des outils d'interface graphique permettant d'insérer des annotations, un éditeur de fichier persistence.xml personnalisé, un explorateur de bases de données ainsi que d'autres fonctionnalités. Le projet Eclipse Dali représente une autre alternative. Pour plus d'informations sur Rational Application Developer ou le plug-in Eclipse Dali, consultez leurs sites Web respectifs.

  2. Compilez les classes d'entité.

    Compilez les entités comme vous le feriez avec toute classe Java, sauf si vous utilisez l'API Criteria. Si vous utilisez l'API Criteria, vous devez également générer les classes de métamodèle de cette API.

    Vous trouverez ci-dessous des exemples d'utilisation de cette option.

    Si vous utilisez EclipseLink, indiquez les arguments suivants à l'aide de la commande 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 
    Si vous utilisez OpenJPA ou WSJPA, indiquez les arguments suivants à l'aide de la commande 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. Etendez les classes entités à l'aide de l'outil d'extension JPA, ou spécifiez l'agent Java afin de pouvoir effectuer une extension dynamique au moment de l'exécution.
    • Utilisez l'outil eclenhancer pour EclipseLink ou utilisez l'outil wsenhancer pour OpenJPA.

      L'outil d'extension effectue un post-traitement du code intermédiaire généré par le compilateur Java et ajoute les zones et les méthodes nécessaires à l'implémentation des fonctions de persistance. Pour obtenir des exemples d'utilisation de l'outil eclenhancer, voir la rubrique sur la commande eclenhancer. Pour obtenir des exemples d'utilisation de l'outil wsenhancer, voir la rubrique sur la commande wsenhancer.

    • Vous pouvez spécifier le mécanisme de l'agent Java pour effectuer l'extension dynamique au moment de l'exécution. Par exemple, saisissez la commande suivante au niveau de la ligne de commande :
      Pour EclipseLink :
      java -javaagent:${app_client_root}/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.jar com.xyz.Main  
      Pour OpenJPA :
      java -javaagent:${app_client_root}/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.jar com.xyz.Main  
      Avertissement : Vous pouvez exécuter un outil d'extension ou spécifier la commande javaagent. Vous n'avez pas besoin de faire les deux.
  4. Facultatif : Si vous n'utilisez pas le modèle de développement de mappage ascendant, activez la génération ou la mise à jour automatique des tables de base de données ou générez ou mettez ces dernières à jour à l'aide de l'outil eclenhancer ou wsmapping.
    • Par défaut, le mappage objet-relationnel ne s'enclenche pas automatiquement ; toutefois, vous pouvez configurer le serveur d'applications de sorte qu'il fournisse le mappage avec la propriété eclipselink.ddl-generation pour EclipseLink ou la propriété openjpa.jdbc.SynchronizeMappings pour OpenJPA. Ces dernières accélèrent le développement en s'assurant automatiquement que les tables de base de données sont conformes au modèle d'objet. Pour activer le mappage automatique, insérez la ligne suivante dans le fichier persistence.xml :
      Pour EclipseLink :
      <property name=”eclipselink.ddl-generation” value=”create-tables”/>  
      Pour Open JPA :
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
      Norme JPA 2.1 :
      <property name=”javax.persistence.schema-generation.database.action” value=”create”/> 
      Eviter les incidents Eviter les incidents: Pour activer le mappage objet-relationnel automatique pendant la phase d'exécution, vous devez répertorier toutes vos classes persistantes dans le fichier Java .class, le fichier de mappage et les éléments du fichier JAR (Java archive) au format XML.gotcha
    • Pour mettre à jour et générer manuellement les tables de la base données, démarrez l'outil de mappage de l'API JPA du serveur d'applications à partir de la ligne de commande afin de créer les tables dans la base de données. Pour obtenir des exemples d'exécution de l'outil eclenhancer, voir la rubrique sur la commande eclenhancer. Pour obtenir des exemples d'utilisation de l'outil wsmapping, voir la rubrique sur la commande wsmapping.
  5. Facultatif : Si vous utilisez OpenJPA et DB2 et souhaitez utiliser un SQL statique, exécutez la commande wsdbgen. L'utilisation de la commande wsdbgen n'est possible que si l'environnement d'exécution IBM Optim PureQuery est installé. La commande wsdbgen crée le fichier persistence_unit_name.pdqxml dans le même répertoire META-INF que celui dans lequel se trouve le fichier persistence.xml. Si vous avez plusieurs unités de persistance, la commande wsdbgen doit être exécutée pour chaque unité de persistance.

    Lorsque plusieurs fichiers pdqxml sont référencés par une application, servez-vous de l'utilitaire Merge pour les regrouper dans un seul fichier pdqxml. Indiquez le fichier pdqxml en tant que propriété pureQueryXml de pdqProperties. Voir la documentation sur l'utilitaire de fusion dans le centre de documentation IBM Integrated Data Management.

    Eviter les incidents Eviter les incidents: Les applications qui utilisent JPA et qui sont configurées pour exécuter le langage SQL statique peuvent rencontrer diverses exceptions. Ces exceptions peuvent se produire avec la commande wsdbgen, que vous pouvez utiliser pour préparer l'application ou lorsque l'application est en cours d'exécution et appelle une méthode JPA. Pour résoudre ce problème, procédez comme suit :
    1. Installez les PTF du pilote JDBC iSeries V5R4. Installez les PTF SI32561 et SI32562. Vous pouvez trouver les PTF via le support IBM System i : site Web PTF Cover Letters.
    2. Si vous utilisez DB2 Universal Database for iSeries V6R1 ou V5R3, visitez le site Web sur les correctifs de l'édition appropriée.
    3. Installez le niveau requis de l'environnement d'exécution IBM Optim PureQuery, c'est-à-dire la version 1.3.100 ou ultérieure. Pour plus d'informations, voir le site Web IBM Data Studio pureQuery Runtime. Installez les pilotes JCC les plus récents, ceux de la version 3.52.95 ou une version ultérieure, avec le correctif pour APAR PK65069. Les pilotes JCC les plus récents sont disponibles dans IBM DB2.
    4. Pour DB2 sur un serveur z/OS, installez la PTF UK39204 pour le pilote alternatif V8 ou la PTF UK39205 pour V9, et installez le correctif pour l'APAR PK67706.
    gotcha

    Pour obtenir des exemples d'exécution de cette commande, voir la rubrique sur la commande wsdbgen.

  6. Facultatif : Si vous utilisez OpenJPA et une identité gérée par une application, générez une classe identity gérée par une application à l'aide de l'outil wsappid. Dans ce cas, une ou plusieurs zones doivent être des zones identité. Utilisez une classe identity si votre entité contient plusieurs zones identité et que l'une d'elle, au moins, est reliée à une autre entité. L'outil d'identité géré par les applications génère un code Java qui utilise la classe d'identité pour tous les types de persistance implémentant l'identité gérée par l'application.

    Pour obtenir des exemples d'utilisation de l'outil wsappid, voir la rubrique sur la commande wsappid.

Exemple

Voici un exemple de fichier persistence.xml pour l'environnement Java SE :

Pour 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>
      
Pour 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>
    

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadevsefepplus
Nom du fichier : tejb_jpadevsefepplus.html