Accès aux données à l'aide de l'API JPA dans un bundle différent

Pourquoi et quand exécuter cette tâche

Vous devez configurer votre bundle JPA et les sources de données pour WebSphere Application Server avant d'accéder aux unités de persistance JPA à partir d'un autre bundle. C'est le cas par exemple d'un bundle l'applications Web qui consomme des entités JPA et affiche et manipule les données.
Conseil :

Assurez-vous que votre fichier de persistance JPA contient des références à une API JTA (Java™ Transaction API) et une source de données non JTA.

JPA dispose de deux éléments de transaction pour accéder à une source de données :
jta-data-source
Le modèle de ressources JTA (Java Transaction API) dépend des transactions globales. Il est typiquement utilisé dans le cadre d'une façade de sessions EJB (Enterprise JavaBeans). Cette configuration permet au bean session de contrôler les contextes de transaction et de sécurité, alors que l'API JPA gère les mappages de persistance. Dans ce cas, une fois accessible, l'application n'utilise pas l'interface EntityTransaction mais repose sur EntityManager enrôlée avec la transaction globale.
non-jta-data-source
L'élément de ressource non JTA est utilisé pour gérer une seule ressource en l'absence des transactions globales. L'élément de ressource non-JTA est typiquement utilisé dans le cadre d'une application Web ou d'un client d'application. L'application contrôle la transaction avec la source de données à l'aide de l'interface EntityTransaction.

Dans les fichiers persistence.xml d'une application OSGi, les éléments jta-data-source et non-jta-data-source accèdent aux sources de données par le biais d'une recherche JNDI (Java Naming and Directory Interface), une recherche JNDI sur le registre d'utilisateurs, ou via Blueprint.

Si les sources de données JTA et non JTA ne sont pas configurées dans le fichier persistence.xml, les sources de données JTA et non JTA par défaut configurées pour le serveur sont utilisées. Par défaut, les valeurs sont null. Certaines fonctions d'entité JPA nécessitent qu'une source de données non JTA soit spécifiée. Par exemple, la génération automatique de l'identité d'une entité.

Procédure

  1. Assurez-vous que les entités et les packages de contrôleur d'entité sont ajoutés au fichier manifest.mf en tant que packages d'exportation :
    1. Cliquez deux fois sur Manifeste : <nom_projet>, où <nom_projet> correspond au nom de votre projet de bundle JPA. Le manifeste de bundle s'affiche dans l'éditeur.
    2. Passez à l'onglet Exécution. Vérifiez que les entités et les packages de contrôleur d'entité sont ajoutés en tant que packages d'exportation.
  2. Ajoutez des sources de données non JTA au fichier persistence.xml :
    1. Ouvrez le fichier persistence.xml dans l'éditeur.
    2. Dans la liste de composants, sélectionnez l'entité dont vous voulez afficher les détails.
    3. Dans la zone de source de données non JTA, indiquez le nom JNDI global d'une source de données non JTA. Par exemple, osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/blogdbnojta).
  3. Modifiez la méthode getEntityManager().

    En modifiant la méthode getEntityManager(), vous configurez la recherche JNDI pour le service EntityManagerFactory étant donné que l'unité de persistance dans un bundle JPA ne se trouve pas dans un environnement Java EE.

    Vous pouvez également configurer la recherche JNDI en faisant du bean entity manager un bean géré blueprint. Pour plus d'informations, voir Applications JPA et OSGi.

    1. Ouvrez le bean entity manager dans l'éditeur.
    2. Recherchez getEntityManager() et modifiez-le comme suit :
      private EntityManager getEntityManager() {
      		try {
      			emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
      		} catch (NamingException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		}
      		
      		return emf.createEntityManager();
      	}
      Important : Dans la ligne de code suivante, vérifiez que l'unité de persistance correspond à l'unité de persistance dans le fichier persistence.xml :
      emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
  4. Corrigez les erreurs générées dans InitialContext et NamingException :
    1. Passez à la vue Marqueurs.
    2. Cliquez avec le bouton droit de la souris sur une erreur et sélectionnez le Correctif rapide. Suivez les instructions de l'assistant pour importer les packages requis.
  5. Ajoutez un fournisseur JDBC à la console d'administration WebSphere Application Server :
    1. Accédez à la vue Serveurs.
    2. Cliquez avec le bouton droit de la souris sur l'instance de votre serveur et sélectionnez Démarrer.
    3. Cliquez avec le bouton droit de la souris sur l'instance de serveur et sélectionnez Administration > Exécuter la console d'administration pour ouvrir la console d'administration.
    4. Cliquez sur Ressources > JDBC > Fournisseurs JDBC.
    5. Cliquez sur Nouveau dans la page des fournisseurs JDBC. L'assistant de création d'une source de données s'affiche.
    6. Suivez les instructions dans l'assistant pour créer le fournisseur JDBC.
    7. Sauvegardez vos modifications.
  6. Ajoutez les définitions de source de données à la console d'administration WebSphere Application Server :
    1. Dans la console d'administration, cliquez sur Ressources > JDBC > Sources de données pour ouvrir la page des sources de données dans la console.
    2. Dans la page Sources de données, cliquez sur Nouveau pour créer une définition de source de données avec un nom JNDI défini sur la définition de connexion JTA spécifiée dans le fichier persistence.xml. Par exemple, jdbc/blogdb.
    3. Dans la page Sources de données, cliquez sur Nouveau pour créer une autre définition de source de données avec un nom JNDI défini sur la définition de connexion non JTA spécifiée dans le fichier persistence.xml. Par exemple, jdbc/blogdbnojta.
    4. Une fois créée la source de données pour la connexion non JTA, cliquez sur la définition pour la connexion non JTA dans la page Sources de données de la console d'administration. La page Configuration s'ouvre.
    5. Dans la section Propriétés supplémentaires, cliquez sur Propriétés de la source de données WebSphere Application Server.
    6. Sélectionnez Source de données non transactionnelle. Dans le serveur d'application, l'utilisation de l'élément <non-jta-data-source> requiert une configuration spéciale pour une source de données non-transactionnel. Les sources de données configurées pour le serveur d'applications ne fonctionnent pas comme élément <non-jta-data-source> car toutes les sources de données configurées par le serveur d'applications sont automatiquement enrôlées dans le contexte transactionnel en cours. Pour éviter cet enrôlement automatique, ajoutez une propriété personnalisée de source de données nonTransactionalDataSource=true supplémentaire.

Résultats

Vous pouvez maintenant consommer des entités JPA et afficher et manipuler les données JPA, où un bundle JPA est accessible à partir d'un bundle d'applications Web.
Icône indiquant le type de rubrique Rubrique de tâche
Dispositions pour les centres de documentation | Commentaires en retour

Icône d'horodatage Dernière mise à jour: May 29, 2014 10:11

Nom de fichier : taccessjpaoutbundle.html