Marin
. Afin de porter cette classe, on crée un nouveau projet Netbeans, cours-ejb-model. Ce projet est un projet Java classique, il ne définit pas d'unité de persistence, nous verrons pourquoi dans la suite.
Voici sa structure.
Marin
. Il s'agit d'une entité JPA classique.
Exemple 60. Classe
Marin
du modèle
package org.paumard.ejb.model ; @Entity public class Marin implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String nom ; // reste de la classe }
Marin
porte des annotations JPA.
Nous n'avons pas encore décrit la structure d'un fichier EAR. Disons pour le moment qu'il s'agit d'une archive, au même sens qu'un fichier JAR ou WAR, qui possède une structure interne spéciale. Notamment, le standard EAR exige que seuls les JAR contenant des EJB peuvent être rangés à la racine de cette archive, tous les autres JAR doivent être rangés dans un sous-répertoire
lib
de ce fichier EAR. C'est donc dans ce répertoire que le JAR de ce projet devra être rangé au final.
persistence.xml
, celui dans lequel nous devons définir notre unité de persistance ? On a en fait plusieurs choix. Soit l'ensemble des classes de notre modèle est rangé dans le même JAR, et dans ce cas, le plus simple est de ranger ce fichier dans le répertoire
META-INF
de JAR. Soit les entités JPA de notre modèle sont réparties dans plusieurs JAR (ce qui est parfaitement légal), auquel cas, le plus logique est de le ranger dans le répertoire
META-INF
de son propre JAR, de façon à ne pas privilégier un JAR du modèle plutôt qu'un autre. C'est cette façon de faire que nous choisissons ici, aussi pour traiter par l'exemple un cas de configuration non trivial.
Créons donc un projet cours-ejb-persistence, qui ne porte que ce fichier
persistence.xml
. Voici sa structure.
DataSource
. Lorsqu'un module d'une application entreprise a besoin d'accéder à une base de données, en aucun cas elle n'ouvre la connexion à cette base elle-même : elle utilise plutôt l'une de ces sources de données, en l'appelant par son nom. C'est ce que fait notre unité de persistance, qui, plutôt que de définir les coordonnées d'une connexion JDBC, comme nous l'avons fait au chapitre précédent, va référencer une source de données existante, définie au niveau de notre serveur d'applications.
jdbc/CoursEJBDS
comme nom, c'est par ce nom que notre unité de persistance pourra se connecter à la base.
sun-ressources.xml
est créé dans notre projet cours-ear, dans le nœud Server resources.
persistence.xml
. Voici donc son contenu.
Exemple 61. Fichier
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="cours-ear-pu" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/CoursEJBDS</jta-data-source> <class>org.paumard.ejb.model.Marin</class> <properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence>
transaction-type
de l'élément
persitence-unit
a la valeur
JTA
. Cela signifie que les transactions de cette unité de persitance seront gérées par le serveur d'application, et non plus à la main. Nous verrons les conséquences de ce point dans la suite.
jta-data-source
. Cet élément porte le nom de la source de données que l'on vient de créer. Notre unité de persistance se connectera à la base en utilisant cette source de données.
persistence.xml
. Comme ce module ne porte pas de code, il ne dépend de rien.
lib
de cet EAR.
.ear
, rangé dans le répertoire
dist
de notre projet. La structure de ce fichier doit exactement suivre celle de la répartition de nos modules dans l'application.
Le déploiement dans Glassfish se fait en invoquant l'option Deploy du même menu. L'EAR est alors pris en compte par Glassfish, qui va déployer les EJB, initialiser la source de données, charger l'unité de persistance, et créer la structure de base de données en conséquences.
De la même façon, cette opération doit se terminer par l'apparition d'un message de victoire dans la console.
En cas de problème de déploiement, il peut être assez difficile de diagnostiquer ce qui ne va pas. Un point de départ peut être le contenu du répertoire
cours-ear/cours-ear/dist
. Ce répertoire contient deux choses. Tout d'abord le fichier EAR déployé par Glassfish. Ensuite l'ouverture de ce fichier par Glassfish, rangée dans le sous-répertoire
gfdeploy
. Examiner le contenu de ces deux éléments peut permettre de détecter des problèmes d'assemblage, et de les corriger.