EJB 3 : Persistance des données avec JPA

Les différentes normes des EJB fournissent les moyens pour faire de la persistance de données. Or ceux-ci ont considérablement changé avec les EJB 3, à tel point que les spécifications associées sont sorties de la plate forme EJB en elle-même pour donner naissance à JPA (Java Persistence API).

Cette nouvelle API, très hibernate-like, permet d'associer des objets java POJO (les entity beans) à un modèle de base de données tout en fournissant les méthodes utiles au management des entities (insert, update, delete, ...).

Fini donc l'implémentation des Home, Component Interface, EntityBean propre aux EJB 2, qui était bien compliquée pour réussir à mettre en oeuvre ce côté persistance pour un modèle métier donné. Maintenant, il suffit juste d'une classe métier et du service de persistance fournit par l'API, le transfert des données étant facilité par le fait que l'on utilise des POJO.

Configuration de JPA

L'utilisation de JPA requiert l'écriture d'un fichier de configuration appelé persistence.xml. Celui-ci permet entre autre de définir la dataSource utilisée pour se connecter à la base de donnée :

<persistence>
<persistence-unit name="myUnit">
<jta-data-source>java:/myDataSource</jta-data-source>
</persistence-unit>
</persistence>

Ce fichier basique peut se complexifier en incluant des propriétés pour la dataSource, définir des types de transactions ou donner le lien vers un fichier xml de mapping (toutefois, nous resterons ici dans ce cas simple). Il se place dans le répertoire META-INF de l'EJB JAR.

Ecriture de la classe Entity

Il s'agit simplement d'écrire une classe java classique, en l'annotant avec @javax.persistence.Entity. Le mapping objet-relationnel peut ensuite se faire avec les annotations @Table, @Id, @Column, etc...

@Entity

@Table(name="MA_TABLE")

public class maClassePersistante implements Serializable {

private Integer id;

private String champ;

@Id

@Column(name="ID")

public Integer getId() {

return this.id;

}

public void setId(Integer id) {

this.id = id;

}

@Column(name="CHAMP")

public String getChamp() {

return this.champ;

}

public void setChamp(String champ) {

this.champ = champ;

}

}

La classe implémente l'interface Serializable afin que le bean puisse joueur son rôle de DTO (Data Transfert Object) dans le cas d'un client distant (Remote). A noter que le travail fait par les annotations peut aussi se réaliser avec un fichier xml de configuration.

Service de management des entities

JPA possède l'interface javax.persistence.EntityManager qui expose les méthodes usuelles afin d'effectuer les opérations sur la base de données. Parmi elles, la méthode persist(Object) réalise l'insertion d'une entité, la méthode find(Class,Object) sélectionne et renvoit une entité en fonction de son identifiant, la méthode merge(Object) réalise une mise à jour si un entity est sorti de son contexte de persistance et remove(Object) réalise une suppression. Il permet aussi d'effectuer des requêtes personnalisées en créant des Query fonctionnant à partir du langage EJB-QL. L'interface possède d'autres méthodes utiles non exposées ici. Son implémentation est à la charge de l'EJB provider.

La récupération de ce manager se fait par injection dans un SessionBean, à l'aide de l'annotation @PersistenceContext, par exemple :

@Stateless

public class MySessionBean implements MySessionRemote {

@PersistenceContext(unitName="myUnit")

private EntityManager entityManager;

...

}

L'unit name est celui défini dans le fichier persistence.xml. Le manager est ainsi disponible pour chaque méthode métier de l'EJB.

Conclusion

La spécification JPA simplifie considérablement la mise en place de la persistance des données au sein du container EJB 3, calquant une grande partie de son fonctionnement sur celui des framework de persistance du moment tels qu'hibernate. En outre, elle peut être mise en application en dehors du contexte des EJB, reste alors à en fournir l'implémentation.

Pour aller plus loin en pratique, un petit tutoriel de Serge Tahé :

http://tahe.developpez.com/java/jpa/

Source : Enterprise JavaBeans 3.0, Bill Burke & Richard Monson-Haefel, editions O'REILLY

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.