Vous êtes sur la page 1sur 18

Module Atelier Framework de persistance

Classes: DSI.3

Atelier 2. Le Mapping Objet-Relationnel


(ORM) avec JPA – Part1 : Les entités
A. Notions théoriques
A.1 ORM: Object Relational Mapping

La plupart des projets s’appuient sur une base de données pour gérer leurs données
persistantes. La récupération et/ou la mise à jour de ces données s’effectuent en général via
des requêtes SQL. En Java ceci s’effectue via l’API JDBC. Cette API présente
plusieurs inconvénients :
- - Nécessite l’écriture de nombreuses lignes de codes répétitives (basées sur sql)
- - La liaison entre les objets et les tables est un travail de bas niveau (manuel)

L’ORM ou Object Relational Mapping a pour but d’établir la correspondance entre :

Une table de la base de données ET Une classe du modèle objet

Pourquoi utiliser ce concept ? Au lieu de manipuler directement la base de données, l’ORM


permet de manipuler des instances POJO Java qui deviennent persistantes. Pour cela,
un mapping entre des classes POJO et les tables de la base doit être effectué :
- Pas besoin de connaître l’ensemble des tables et des champs de la base de données
- Faire abstraction de toute la partie SQL d’une application.

Exemple: Mapper la classe Client.java avec la table T_CLIENT

Figure1- Mapping Objet-Relationnel entre la classe Client et la table t_Client

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

A.2. JPA (Java Persistence API)


L’un des premiers frameworks d’ORM en Java qui a vu le jour est Hibernate. Face au succès
de ce framework, Sun Microsystems1 a décidé de créer une spécification standard d’ORM qui
s’appelle JPA (Java Persistence API). JPA est une API autrement dit elle ne fournit pas
l’implémentation mais que des interfaces.
Exemples d’implémentations JPA: JPA/Hibernate , JPA/EclipseLink, JPA/ TOPLink

Figure2- JPA : Principe de base

A.2.1 Le Mapping avec JPA : Les entités

Les entités dans les spécifications JPA permettent d'encapsuler les données d'une table. Ce
sont de simples POJO. Une entité doit obligatoirement avoir les propriétés suivantes
1- Être déclaré avec l'annotation annotation @Entity ( du package javax.persistence.*)
2- Implémenter l’interface Serializable
3- Avoir un constructeur vide (sans arguments)
4- Posséder au moins un attribut déclarée comme clé primaire avec l'annotation @Id

L'API JPA propose plusieurs annotations pour supporter un mapping Objet/Relaionnel assez
complet. L’ensemble de ces annotation font partie du package javax.persistence.*

1
Le 20 avril 2009, Sun a été est racheté par Oracle Corporation.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

Annotation Rôle
@Entity Cette annotation permet à une classe Java de type POJO d’être mappé vers une table de
la base de données
@Table Préciser le nom de la table concernée par le mapping. Cette annotation possède
plusieurs attributs, entre autres Name : spécifie le nom de la table
@Column Associer un champ de la table à la propriété (à utiliser sur la déclaration d’un attribut
ou un getter). Cette annotation possède plusieurs attributs, entre autres Name :
spécifie le nom de la colonne
@Id Associer un champ de la table à la propriété en tant que clé primaire
@ GeneratedValue Demander la génération automatique de la clé primaire au besoin.
Cette annotation possède plusieurs attributs, entre autres strategy qui précise
le type de générateur à utiliser : TABLE, SEQUENCE, IDENTITY ou AUTO.
La valeur par défaut est AUTO.
AUTO laisse l'implémentation générer la valeur de la clé primaire.
IDENTITY utilise un type de colonne spécial de la base de données.
TABLE utilise une table dédiée qui stocke les clés des tables générées.
@ Transient Demander de ne pas tenir compte du champ lors du mapping

Exemple :

import java.io.Serializable;
import javax.persistence.*;
1
@Entity 2
@Table(name="t_client")
public class Client implements Serializable {

4 @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="t_id")
private int id;

@Column(name="t_nom")
private String nom;

@Column(name="t_prenom")
private String prenom;

public Client() {
3

public Client(String nom, String prenom) {


super();
this.nom = nom;
this.prenom = prenom;
}
// Getters & Setters
}

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

A.2.2 Le fichier de configuration perssitence.xml


Le fichier persistence.xml contient la configuration nécessaire pour le mapping et fournit au
serveur d’application WildFly les informations sur la connexion à la base de données à utiliser.
Tag Rôle
La racine du document XML du fichier persistence.xml est le tag <persistence>.
<persistence>
Il contient un ou plusieurs tags <persistence-unit>
Ce tag va contenir les paramètres de l’unité de persistance. Ce tag possède un
<persistence-unit> attribut obligatoire : name qui précise le nom de l'unité et qui servira à y faire
référence
<provider> Ce tag indique le Provider (le fournisseur) de l'implémentation J.P.A, il
s'agit de la classe fournissant l'accès aux services de persistance
<jta-data-source> Ce tag pointe sur le nom JNDI de la base de données au quelle va être
associé cette unité de persistence.
<class> La liste des classes correspondant aux entités de mapping
<properties> Ce Tag comprend un sous-ensemble de tag <properety>. Ces propriétés
permettent, entre autres, de définir les paramètres de configuration
éventuelle de la couche de persistance+.
L’ensemble de ces propriétés dépendent du provider utilisé.

Exemple de fichier de configuration persistence.xml :

A.3 Introduction aux EJB

Un EJB est un composant serveur qui encapsule une logique métier, qui peut être déployé
dans un serveur d’application Les appels aux méthodes par les clients de l’EJB sont
interceptés par le conteneur d’EJB du serveur d’application. Le conteneur d’EJB s’occupe de

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

certains traitements; a savoir: le cycle de vie du bean, l’injection de dépendance, l’accès au


bean, la communication à distance, la sécurité d’accès, les accès concurrents, la gestion des
transactions, …
Comme le montre la figure suivante, il existe deux grandes familles d’EJB : les Session Bean
et les Message Driven Bean.

Figure3- Les familles des composants EJB

B. Travail à faire
L’objectif de cet atelier est de développer un projet de type EJB qui porte la facette JPA. Le
projet EJB2 comportera initialement le fichier de configuration persistence.xml et les entités à
mapper.

Dans un premier temps, vous allez créer une nouvelle « datasource » au niveau de votre
serveur d’application WildFly. La « datasource » permet d’établir le lien entre le serveur
d’application et la base de données que vous allez utiliser.

Dans un second temps, vous allez demander à votre projet EJB d’utiliser cette « datasource ».
Ceci s’effectue au niveau du tag « jta-data-source » de votre fichier de configuration
« persistence.xml ».

Exemple : Supposons qu’on dispose d’une data source avec le nom JNDI
« java:/banqueDS » dans le serveur d’application WildFly. Cette datasource est relative à
une base de données nommé BanqueDB. Au niveau du projet EJB, et plus précisément dans
le fichier de configuration persitence.xml il faut rajouter le nom JNDI « java:/banqueDS »
dans le tag <jta-data-source> comme le montre la figure suivante.

2
Le même projet sera utilisé durant les prochains ateliers pour créer des composants EJB Stateless assurant les
opérations CRUD sur la base de données.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

BanqueDB

Finalement, vous allez déployer votre projet EJB dans le conteneur EJB du serveur WildFly.
A cet effet, une nouvelle unité de persistance sera crée et le mapping entre vos classes Java
(entités) et les tables correspondantes da la base données sera effectué. La figure suivante
illustre l’architecture globale de l’application à mettre en place :

Figure7- Déploiement d’un projet EJB-JPA sous WildFly


Wafa NEJI – Technologue à l’ISET de Béja
Module Atelier Framework de persistance
Classes: DSI.3

B.1 Configuration d’une datasource avec le serveur d’application WildFly 9.0

Pour rajouter une nouvelle datasource au serveur d’application wildfly, suivez les étapes
suivantes :

- Etape1: Créer une base de données mysql nommé schoolDB


- Etape2: Démarrer le serveur d’application WildFly 9.0 et allez sur la pgae s’acceuil
du serveur en utilisant l’url : http://localhost:18080/. Cliquez sur ‘Administration
Console’ et connectez-vous à la console d’administration 3

- Etape3: Choisissez l’anglet « Configuration » et sélectionne dans le menu à gauche


« Subsystem >Datasources ». Cliquez sur le bouton « View »

3
La version du serveur WildFly fournie dans le pack ISETBejaJEETools.rar, comporte le Management User
suivant :
- User = admin
- Password = adminpwd

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape4: Cliquez sur « Add » pour ajouter une nouvelle Datasource

- Etape5 : Choisissez une datasource de type ‘MySQL Datasource’. Cliquez sur Next

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape6 : Saisissez le nom de la datasource schoolDS et son nom JNDI


java:/SchoolDS. Cliquez sur Next >

Mémorisez cette
valeur : le JNDI Name
java:/SchoolDS va être
utilisé par la suite dans
le fichier de config
persistence.xml

- Etape7 : Sélectionnez l’anglet « Detected Driver » et choisir le driver mysql. Cliquez


sur Next >

- Etape8 : Saisir l’url, l’utilisateur et le mot de passe relatifs à la configuration de base


de données schooldb (crées dans l’étape 1).

Exemple:

 Connection URL : jdbc :mysql://localhost:3306/schooldb


 User name : root
 Password: root

Testez ensuite la connexion en cliquant sur Test Connection. Vérifiez que la


connexion a été bien établie. Cliquez sur Done.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape9 : Vérifiez que votre nouvelle datasource SchoolDS a été rajouté à la liste des
datasources du serveur WildFly.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

B.2 Création d’un projet EJB-JPA

Pour créer un projet EJB suivez les étapes suivantes :

- Etape1 : Cliquez sur ‘File>New> Other’. Dans l’écran qui s’affiche, tapez ‘ejb’ et
sélectionnez ‘EJB Project’. Cliquez sur ‘Next’

- Etape2 : Dans l’écran qui s’affiche, choisissez le nom de votre projet EJB :
edu.iset.schoolNomBinome.ejb. Dans le champ ‘Target runtime’, choisissez votre
serveur d’application WildFly. Cliquez sur ‘Finish’

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape3 : Pour déployer votre projet EJB sous le serveur Wildfly, dans l’anglet
‘Server’ cliquez droit sur la racine de votre serveur WildFly et sectionnez ‘Add and
remove’

Click
droit

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape4 : Sélectionnez votre projet EJB et cliquez sur ‘Add’. Cliquez sur ‘Finish’

A présent, votre projet EJB « edu.iset.schoolTeam1.ejb » a été déployé sous forme d’un
fichier qui porte l’extension .jar dans le serveur d’application WildFly (plus précisément
dans le dossier \standalone\deployments de votre serveur).

- Etape5 : Pour rajouter la facette JPA à votre projet EJB, cliquez droit sur la racine de
votre projet EJB « edu.iset.schoolTeam1.ejb » et selectionnez ‘Properties’. Dans le
menu gauche de l’écran qui s’affiche, choisissez ‘Project Facets’. Cochez ensuite
JPA. Votre projet porte à présent la facette JPA. Notez que le fournisseur (le
provider) de votre implémentation JPA n’est autre que le serveur d’application
Wildfly. Suite à cette étape, le fichier de configuration persistence.xml va être rajouter
à votre projet EJB.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

Click
droit

- Etape6 : Vérifiez la présence du fichier persistence.xml sous le menu JPA Content


présent dans l’arborescence de votre projet EJB. Cliquez sur « Source » pour afficher
le contenue en format xml du fichier persistence.xml.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape7 : Configuration du fichier persistence.xml. Votre fichier de configuration


contient par défaut le tag <persistence-unit>. Vous allez rajouter le tag <jta-data-
source> pour pointer sur le nom JNDI «java :/SchoolDS » de la datasource
SchoolDS relié à votre base de données schooldb (au quelle va être associé cette unité
de persistence).
Vous allez également rajouter le tag <properties> avec la propriété
hibernate.hbm2ddl.auto ayant comme valeur create. Cette propriété permettra de
créer automatiquement les tables dans votre base de données schooldb à partir des
classes (ou entités) mappées. La valeur update va être utilisée par la suite pour mettre
à jour les entités mappées.

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
Le nom JNDI de
la datasource
<persistence-unit name="edu.iset.schoolTeam1.ejb">

<jta-data-source> java:/SchoolDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>

</persistence>

- Etape8 : A cette étape, vous allez créer votre première entité « Etudiant » qui sera
mappé avec la table « Etudiant ». Pour ceci, commencez par créer une simple classe
Java nommé « Etudiant ». Cliquez-droir sur « ejbModuke » et selectionnez
New>Class.

Click
droit

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

En respectant les spécifications JPA, l’entité Etudiant aura la forme suivante :


package edu.iset.schoolTeam1.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.*;

@Entity
public class Etudiant implements Serializable{

@Id
private int cin;
private String nom;
private String prenom;

@Temporal(TemporalType.DATE)
private Date dateNaissance;

private String mail;

public Etudiant() {
super();
}

// getters & setters


}

Quelle est le rôle de chaque annotation ? (la réponse est à rendre dans un compte
rendu)

- Etape9 : Pour rajouter l’entité Etudiant dans la liste de classe mappés dans le fichier
persistence.xml, il suffit de cliquer-droir sur le fichier persistence.xml> Synchronize
Class List

Click
droit

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

- Etape10 : Pour que votre serveur d’application prenne les nouvelles modifications du
projet EJB, redeployez de nouveau le projet « edu.iset.schoolTeam1.ejb » en cliquant
droit sur la racine du serveur Wildfly, et en selectionnal ‘Clean’ (ou bien, cliquez-
droit sur le projet « edu.iset.schoolTeam1.ejb » sous le serveur, ensuite choisissez
‘Full publish’)

Click
droit

Vérifiez le log du serveur. Que signifie la trace « Schema export complete » ? (la
réponse est à rendre dans un compte rendu)

- Etape11 : Dans « MySQL Administrator », vérifiez la création de la table


« Etudiant », conformément à la classe Java (ou l’entité) Etudiant.

Wafa NEJI – Technologue à l’ISET de Béja


Module Atelier Framework de persistance
Classes: DSI.3

Wafa NEJI – Technologue à l’ISET de Béja

Vous aimerez peut-être aussi