Cours Java JPA
Cours Java JPA
Achref El Mouelhi
[Link]@[Link]
1 Introduction
4 Entity
Création d’une entité
Création de tables associées aux entités
Création des entités à partir d’une BD existante
5 EntityManager
Insertion
Mise à jour
Suppression
Consultation
Définition
est une couche d’abstraction à la base de données
I ©
est une classe qui permet à l’utilisateur d’utiliser les tables d’une
H
base de données comme des objets
U EL
O
consiste à associer :
f E LM
r e
une ou plusieurs classes à chaque table
chclasse à chaque colonne de la table
© A
un attribut de
Définition
est une couche d’abstraction à la base de données
I ©
est une classe qui permet à l’utilisateur d’utiliser les tables d’une
H
base de données comme des objets
U EL
O
consiste à associer :
f E LM
r e
une ou plusieurs classes à chaque table
chclasse à chaque colonne de la table
© A
un attribut de
Object-Relational Mapping
Pour Java
EclipseLink
Hibernate
H I ©
Java Data Objects (JDO)
UEL
O
LM
...
r e f E
ch
©A
Object-Relational Mapping
Pour Java
EclipseLink
Hibernate
H I ©
Java Data Objects (JDO)
UEL
O
LM
...
JPA
EclipseLink ?
H I ©
EL
est un framework open source de mapping objet-relation
U
L MO(un framework d’ORM open
est dérivé du projet TopLink d’Oracle
e
source acheté par Oracle
r f Een 2002)
supporte l’APIA cdehpersistence de données JPA
©
JPA
I ©
est une interface standardisée par Sun, qui permet l’organisation
H
des données
UEL
O
f E LM
a été proposé par JSR (Java Specification Requests)
r e
s’appuie sur l’utilisation des annotations pour définir le lien entre
ch
©A
Entity (classe) et table (en base de données relationnelle) et sur
le gestionnaire EntityManager pour gérer les données
(insertion, modification...)
JPA
Étapes
r e
Établissement de liens entre entités
ch
©A
Création des tables, à partir des entités, si elles n’existent pas
Manipulation des entités (ajout, suppression, modification,
consultation) avec EntityManager
H I ©
UEL
O
f E LM
ch r e
©A
f E LM
r e
Sélectionner le SGBD (dans notre cas MySQL)
ch
©A
Attribuer un nom à cette connexion dans Name
Vérifier ensuite l’URL, User name, Password et DataBase Name (jpa) et Valider
H I ©
EL
Tester la connexion
Aller dans l’onglet Data Source Explorer O U
f E LM
ch r e
Faire un clic droit et ensuite choisir Connect
©A
JPA
Création d’un projet JPA
H I ©
EL
Choisir jre1.8 dans Target runtime et cliquer deux fois sur Next
U
O
f E LM
Dans Platform, choisir la dernière version d’EclipseLink (2.5.2)
ch r e
Dans Type de JPA Implementation, choisir User Library
©A
Ensuite cocher la case EclipseLink et cliquer sur Download
Library... à droite (pour démarrer le téléchargement)
JPA
Le fichier [Link]
H I ©
EL
OU
est situé dans le répertoire META-INF de src
M
f E
contient les données sur le L entre nos entités/ et nos
mapping
e
chrde données
tables dans la base
© A
Définition
H I ©
U
correspond à une table d’une base de donn L relationnelle
Eées
O informations
Mquelques
f L
est un objet (Javabean) contenant
E pour le mapping (faire le lien) avec la
r e
indispensables (annotations)
ch
base de donn
© A ées
Une entité
Pour une meilleure organisation
H I ©
U EL
O
f E LM
ch r e
©A
Une entité
Pour une meilleure organisation
H I ©
EL
Création
M OU
f E L
Faire un clic droit sur [Link], aller dans new et choisir JPA
Entity
c hr e
© A
Saisir un nom dans Class name:, ensuite cliquer sur Next
Avec le bouton Add..., ajouter les différents attributs ainsi que leur type
Une entité
public Personne() {
package [Link]; super();
import [Link]; }
import [Link];
import [Link].*; public int getNum() {
return [Link];
/**
* Entity implementation class for
}
H I ©
EL
public void setNum(int num) {
Entity: Personne [Link] = num;
*
O } U
LM
*/ public String getNom() {
@Entity
public class Personne implements
r e f E }
return [Link];
Serializable {
ch public void setNom(String nom) {
@Id ©A
@GeneratedValue (strategy=
}
[Link] = nom;
Une entité
Autres annotations
Annotation désignation
@Entity permet de qualifier la classe comme entité
@Id indique l’attribut qui correspond à la clé primaire de la table
@Table décrit la table désignée par l’entité
@Column définit les propriétés d’une colonne
H I ©
EL
@IdClass indique que l’entité annotée contient une clé composée
U
les champs constituant la clé seront annoté par @Id
O
LM
@GeneratedValue s’applique sur les attributs annotés par @Id
permet la génération automatique de la clé primaire
r e f E
ch
©A
Une entité
Autres annotations
Annotation désignation
@Entity permet de qualifier la classe comme entité
@Id indique l’attribut qui correspond à la clé primaire de la table
@Table décrit la table désignée par l’entité
@Column définit les propriétés d’une colonne
H I ©
EL
@IdClass indique que l’entité annotée contient une clé composée
U
les champs constituant la clé seront annoté par @Id
O
LM
@GeneratedValue s’applique sur les attributs annotés par @Id
permet la génération automatique de la clé primaire
r e f E
// la classe Personne
ch
©A
// la classe PersonnePK
@IdClass([Link]) public class PersonnePK {
@Entity @Id
public class Personne implements private String nom;
Serializable { @Id
@Id private String prenom;
private String nom; // ensuite getters, setters,
@Id constructeur sans parametres et
private String prenom; constructeur avec deux
// ensuite getters, setters et parametres nom et prenoms
constructeur
H & H: Research and Training 17 / 94
Entity Création d’une entité
Une entité
Une entité
O
f E LM
@Table(
ch r e
©A
name="personne",
uniqueConstraints={
@UniqueConstraint(name="nom_prenom", columnNames
={"nom", "prenom"})
}
)
Une entité
H I ©
L’annotation @Transient
U EL
O
LM
L’attribut annoté par @Transient n’aura pas de colonne associée
r e f E
dans la table correspondante à l’entité en base de données.
ch
©A
Étapes
H I ©
Un clic droit sur le projet U EL
O
Aller dans JPA Tools
f E LM
r e
ch Tables from Entities
A
Choisir Generate
©
Étapes
Un clic droit sur le projet
H I ©
Aller dans JPA Tools
U EL
M O
Choisir Generate Entities
f E L from Tables
c h re ensuite les tables à importer
Sélectionner la connexion
Choisir ©
A
le package dans lequel les entités seront importées
Valider
©A
chaque table dans le Data Source Name)
Régénérer les entités
EntityManager
Pour persister les données, il faut
I ©
instancier et utiliser un gestionnaire d’entités pour manipuler les
H
données
U EL
O
f E LM
ch r e
©A
EntityManager
Pour persister les données, il faut
I ©
instancier et utiliser un gestionnaire d’entités pour manipuler les
H
données
U EL
M O
f L
E ?
Gestionnaire d’entités (EntityManager)
ch r e
© A
est une classe Java
EntityManager
I ©
il faut utiliser une fabrique de type EntityManagerFactory
H
U EL
Cette dernière a une méthode createEntityManager() qui
M
permet d’obtenir un EntityManager O
E L
f de la fabrique, il faut utiliser la méthode
r e
Pour obtenir une instance
c h
© A qui prend comme paramètre le nom de l’unité de
statique createEntityManagerFactory() de la classe
Persistence
persistence à utiliser (défini dans le fichier [Link])
EntityManager
Le fichier [Link]
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="[Link]
xmlns:xsi="[Link]
H I ©
EL
xsi:schemaLocation="[Link]
U
persistence [Link]
O
LM
persistence_2_1.xsd">
r e f E
<persistence-unit name="FirstJpaProject">
ch
<class>[Link]</class>
©A
</persistence-unit>
</persistence>
Obtenir l’EntityManager
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
EntityManager
EntityManager
r e f E
<property name="[Link]" value="jdbc:mysql://localhost:3306/jpa" />
<property name="[Link]" value="root" />
ch
<property name="[Link]" value="" />
©A
<property name="[Link]-database" value="MySQL5" />
<property name="[Link]-generation" value="drop-and-create-tables" />
<property name="[Link]-mode" value="both" />
<property name="[Link]" value="FINE" />
</properties>
</persistence-unit>
</persistence>
EntityManager
Valeurs possibles pour ddl-generation
drop-and-create-tables : EclipseLink essayera de
supprimer toutes les tables, puis de les recréer toutes. (très utile
H I ©
pour la phase de développement pendant les tests ou lorsque les
EL
données existantes doivent être effacées.
O U
LM
create-or-extend-tables : EclipseLink essayera de créer
r e f E
des tables. Si la table existe, il ajoutera les colonnes manquantes.
EntityManager
L’insertion
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
// instanciation de l’entité
Personne p = new Personne();
H I ©
EL
[Link]("John");
[Link]("Wick");
O U
f E LM
EntityTransaction transaction = [Link]();
ch r e
[Link](); // début transaction
[Link](p); // persister dans la base de données
©A
[Link](); // valider transaction
// fermer l’EntityManager et la factorie
[Link]();
[Link]();
L’insertion
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
// instanciation de l’entité
Personne p = new Personne();
H I ©
EL
[Link]("John");
[Link]("Wick");
O U
f E LM
EntityTransaction transaction = [Link]();
ch r e
[Link](); // début transaction
[Link](p); // persister dans la base de données
©A
[Link](); // valider transaction
// fermer l’EntityManager et la factorie
[Link]();
[Link]();
La mise à jour
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
// chercher l’élément a modifier
Personne p = [Link]([Link], 10); // on indique la
classe et la valeur de la clé primaire
H I ©
EL
EntityTransaction transaction = [Link]();
[Link]();
O U
LM
if (p == null) {
}
r e E
[Link]("Personne non trouvée");
f
ch
©A
else {
[Link]("Bob"); // faire une modification
[Link](); // enregistrer la modification
}
// valider la transaction
[Link]();
[Link]();
[Link]();
La suppression
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
// chercher l’élément a supprimer
Personne p = [Link]([Link], 10);
EntityTransaction transaction = [Link]();
H I ©
[Link]();
U EL
if (p == null) {
O
f E LM
[Link]("Personne non trouvée");
}
else {
ch r e
©A
// supprimer l’élément
[Link](p);
}
// valider la transaction
[Link]();
[Link]();
[Link]();
H & H: Research and Training 33 / 94
EntityManager Consultation
La recherche
Fonctions de recherche
I ©
find() : cherche et retourne un élément selon la valeur de la clé
H
primaire. Retourne null si la valeur n’existe pas
U EL
O
f E LM
getReference() : fonctionne comme find(). Mais elle
déclenche une exception si la valeur n’existe pas
ch r e
©A
La recherche
Fonctions de recherche
I ©
find() : cherche et retourne un élément selon la valeur de la clé
H
primaire. Retourne null si la valeur n’existe pas
U EL
O
f E LM
getReference() : fonctionne comme find(). Mais elle
déclenche une exception si la valeur n’existe pas
ch r e
©A
On peut aussi définir nos fonctions de recherche en utilisant des
requêtes SQL
La consultation
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
// definir la requete
String str = "select * from Personne";
H I ©
EL
// executer la requete et preciser l’entite concernee
Query query = [Link](str, [Link]
O U
LM
.[Link]);
// recuperer le resultat
r e f E
ch
List <Personne> personnes = (List <Personne> ) query.
©A
getResultList();
for (Personne p : personnes) {
[Link]("nom = "+ [Link]());
}
[Link]();
[Link]();
La recherche
Création de requêtes
createNativeQuery() : permet d’exécuter une requête SQL
createNamedQuery() : permet d’exécuter une requête JPQL
définie par des annotations
H I ©
createQuery() : permet d’exécuter uneE
U L ête JPQL
requ
L MO
r e f E
A ch
©
La recherche
Création de requêtes
createNativeQuery() : permet d’exécuter une requête SQL
createNamedQuery() : permet d’exécuter une requête JPQL
définie par des annotations
H I ©
createQuery() : permet d’exécuter uneE
U L ête JPQL
requ
L MO
Récupération du résultat
r e f E de récupérer le résultat sous forme
getResultList()
d’une liste A
ch : permet
©
getSingleResult() : permet de récupérer un seul élément de
la sélection
getFirstResult() : permet de récupérer le premier élément
de la sélection
H & H: Research and Training 36 / 94
EntityManager Consultation
La consultation
La consultation
La consultation
Les requêtes nommées : exemple (ensuite nous l’utiliserons)
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
Query query = [Link]("findByNomPrenom")
H I ©
;
U EL
O
LM
[Link]("nom", "Wick");
[Link]("prenom", "John");
r e f E
ch
List <Personne> personnes = (List <Personne> ) query
.getResultList();
©A
for (Personne p : personnes) {
[Link]("nom = "+ [Link]());
}
[Link]();
[Link]();
La consultation
Et si on veut définir plusieurs requêtes nommées
@Entity
@NamedQueries({
@NamedQuery(
name="findByNomPrenom",
H I ©
query="SELECT p FROM Personne p WHERE [Link] = :
U EL
nom and [Link] = :prenom"
O
),
f E LM
@NamedQuery(
ch r e
©A
name="findByPrenom",
query="SELECT p FROM Personne p WHERE [Link] =
:prenom"
),
})
public class Personne implements Serializable {
...
H & H: Research and Training 40 / 94
EntityManager Consultation
EntityManager
EntityManager
Attention
La méthode flush() ne prend pas de paramètre
H & H: Research and Training 41 / 94
EntityManager Consultation
EntityManager
EntityManager
Exemple avec utilisation de refresh()
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
//on suppose que John Wick avec un num 10 existe
H I ©
dans la BD
U EL
Personne p = [Link]([Link], 10); O
[Link]("Travolta");
f E LM
[Link](p);
ch r e
©A
[Link]("le nom est " + [Link]());
// imprime Wick
[Link]();
[Link]();
// si on supprime [Link](p); Travolta sera
affiche
EntityManager
Exemple avec utilisation de detach()
EntityManagerFactory emf = Persistence.
createEntityManagerFactory("FirstJpaProject");
EntityManager em = [Link]();
//on suppose que John Wick avec un num 10 existe
H I ©
dans la BD
U EL
Personne p = [Link]([Link], 10); O
[Link]("Travolta");
f E LM
r e
[Link](p); // p n’est plus gere par em
ch
©A
[Link]().begin();
[Link]();
[Link]().commit();
Personne p1 = [Link]([Link], 10);
[Link]("le nom est " + [Link]());
// affiche le nom est Wick
JPQL
Définition
JPQL est un langage de requêtes adapté à la spécification JPA
H I
Inspiré du langage SQL (et HQL : Hibernate Query Language)©
mais adapté aux entités JPA
U EL
M O
f E Lés JPA et pas les tables d’une base
Permet de manipuler les entit
de données
c h re
©desArequêtes de type select, update et delete
Supporte
JPQL
Définition
JPQL est un langage de requêtes adapté à la spécification JPA
H I
Inspiré du langage SQL (et HQL : Hibernate Query Language)©
mais adapté aux entités JPA
U EL
M O
f E Lés JPA et pas les tables d’une base
Permet de manipuler les entit
de données
c h re
©desArequêtes de type select, update et delete
Supporte
On manipule des entités et non pas des tables. Le nom des entités est
sensible à la casse.
JPQL
Exemple :
String str= "Select p from Personne as p";
Query query = [Link](str);
List <Personne> personnes = (List <Personne> ) query
.getResultList();
H I ©
for (Personne p : personnes) {
UEL
O
LM
[Link]([Link]() + " " + p.
getPrenom());
r e f E
}
ch
©A
Explication
JPQL
Remarques
H I ©
La requête JPQL précédente permet de sélectionner un objet
ELseulement quelques
Il est tout de même possible de sélectionner
U
attributs d’un objet
L MO
r e f Eest un tableau contenant les champs
Dans ce cas là, le résultat
A chés
attributs sélectionn
©
Et il est impossible de modifier (ou supprimer) les valeurs de ces
attributs sélectionnées
JPQL
JPQL
JPQL
Explication
La jointure se fait avec join [Link] s
Le reste, c’est du SQL classique
JPQL
JPQL
H I ©
OneToOne : chaque objet d’une première classe est en relation
EL
avec un seul objet de la deuxième classe
O U
OneToMany : chaque objet d’une première classe peut être en
E LM
relation avec plusieurs objets de la deuxième classe (la
f
ch
réciproque est ManyToOne)r e
©A
ManyToMany : chaque objet d’une première classe peut être en
relation avec plusieurs objets de la deuxième classe et
inversement
@Entity
public class Adresse implements
UEL
O public void setCodePostal(String
LM
Serializable { codePostal) {
@Id
r e f E }
[Link] = codePostal;
@Entity
public class Personne implements Serializable {
@Id
private int num;
private String nom;
H I ©
private String prenom;
UEL
O
LM
@OneToOne(cascade={[Link], [Link]})
@JoinColumn(name="rue", referencedColumnName="rue", nullable=false)
private Adresse adresse;
r e f E
ch
©A
// les getters/setters de chaque attribut
@Entity
public class Personne implements Serializable {
@Id
private int num;
private String nom;
H I ©
private String prenom;
UEL
O
LM
@OneToOne(cascade={[Link], [Link]})
@JoinColumn(name="rue", referencedColumnName="rue", nullable=false)
private Adresse adresse;
r e f E
ch
©A
// les getters/setters de chaque attribut
Notation
Personne : entité propriétaire
Adresse : entité inverse
@OneToOne(cascade={[Link], CascadeType.
REMOVE})
H I ©
Explication
UEL
O
f E LM
cascade : ici on cascade les deux opérations PERSIST et
ch r e
REMOVE qu’on peut faire de l’entité propriétaire à l’entité inverse
©A
On peut cascader d’autres opérations telles que DETACH, MERGE,
et REFRESH...
on peut cascader toutes les opérations avec ALL
@JoinColumn(name="rue", referencedColumnName="rue",
nullable=false)
H I ©
EL
Explication
M OU
Pour désigner la colonne E
f L Adresse qui permet de faire la
dans
jointure
chr e
Pour dire
A
©que chaque personne doit avoir une adresse (donc on
ne peut avoir une personne sans adresse)
ManyToOne
Exemple
Si on suppose que plusieurs personnes peuvent avoir la même
adresse
personne1
H I ©
U EL
O
personne2
f E LM
ch r e adresse
© A.. .
personneN
Many To One
H & H: Research and Training 58 / 94
Relation entre entités ManyToOne
ManyToOne
ManyToOne
OneToMany
Exemple
Si on suppose qu’une personne peut avoir plusieurs adresses
I ©
adresse1
H
U EL
O
f E LM adresse2
personne
c h r e .
©A .
.
adresseN
One To Many
OneToMany
Il faut changer
@OneToMany(cascade={[Link],
H I ©
EL
[Link]})
private List <Adresse> adresses = new ArrayList <
O U
Adresse> ();
f E LM
ch r e
©A
On peut aussi définir quand les objets de l’entité inverse (ici Adresse)
seront chargées dans l’entité propriétaire (ici Personne)
OneToMany
OneToMany
©A
EAGER : les objets de l’entité Adresse en relation avec un objet
personne de l’entité Personne seront chargés au même temps.
LAZY (par défaut) : les objets de l’entité Adresse en relation avec
un objet personne de l’entité Personne seront chargés
seulement quand on fait [Link]’).
OneToMany
N’oublions pas de supprimer ce code de l’entité Personne
@OneToOne(cascade={[Link], [Link]})
@JoinColumn(name="rue", referencedColumnName="rue", nullable=
false)
private Adresse adresse;
// les getters/setters de chaque attribut
H I ©
U EL
O
f E LM
ch r e
©A
OneToMany
N’oublions pas de supprimer ce code de l’entité Personne
@OneToOne(cascade={[Link], [Link]})
@JoinColumn(name="rue", referencedColumnName="rue", nullable=
false)
private Adresse adresse;
// les getters/setters de chaque attribut
H I ©
U EL
O
Ensuite
f E LM
ch r e
il faut générer le getter et le setter d’adresses
©A
il faut aussi générer la méthode add et remove qui permettent d’ajouter ou de
supprimer une adresse pour un objet personne (Dans Source, choisir
Generate Delegate Methods).
OneToMany
N’oublions pas de supprimer ce code de l’entité Personne
@OneToOne(cascade={[Link], [Link]})
@JoinColumn(name="rue", referencedColumnName="rue", nullable=
false)
private Adresse adresse;
// les getters/setters de chaque attribut
H I ©
U EL
O
Ensuite
f E LM
ch r e
il faut générer le getter et le setter d’adresses
©A
il faut aussi générer la méthode add et remove qui permettent d’ajouter ou de
supprimer une adresse pour un objet personne (Dans Source, choisir
Generate Delegate Methods).
ManyToMany
Exemple
Une personne peut pratiquer plusieurs sports
Un sport peut être pratiqué par plusieurs personnes
H I ©
personne1
U ELsport1
O
f E LM
personne2
ch r e sport2
© A.. .
.
. .
personneN sportM
Many To Many
H & H: Research and Training 65 / 94
Relation entre entités ManyToMany
ManyToMany
H I ©
EL
Il faut juste changer
O U
On commence par créer une entité Sport
L M
f E
On définit la relation ManyToMany (exactement comme les deux
resoit dans Personne soit dans Sport
relations précédentes)
c h
©A
@Id
private String nom;
private String type;
private static final long serialVersionUID = 1L;
public Sport() {
H I ©
}
super();
U EL
O
LM
public String getNom() {
}
return nom;
r e f E
ch
public void setNom(String nom) {
©A
[Link] = nom;
}
public String getType() {
return type;
}
public void setType(String type) {
[Link] = type;
}
}
LM
EntityTransaction t =em.
[Link]("Wick");
[Link]("John");
r e f E getTransaction();
[Link]();
[Link]("Bob");
ch [Link](p1);
[Link]("Joe");
©A
Sport s1 = new Sport();
[Link](p2);
[Link]();
Sport s2 = new Sport(); [Link]("insertion
Sport s3 = new Sport(); reussie ");
[Link]("football"); [Link]();
[Link]("tennis"); [Link]();
[Link]("box");
[Link]("collectif");
H & H: Research and Training 69 / 94
Relation entre entités ManyToMany
Cas particulier
Cas particulier
Remarques
Remarques
Les relations, qu’on a étudiées, sont unidirectionnelles H I ©
U
C’est à dire on peut faire [Link](); EL
M O
f E L
Mais on ne peut faire [Link]();
chr e
© A
Remarques
Remarques
Les relations, qu’on a étudiées, sont unidirectionnelles H I ©
U
C’est à dire on peut faire [Link](); EL
M O
f E L
Mais on ne peut faire [Link]();
chr e
Solution
© A
Rendre les relations bidirectionnelles
@Id
O U
private String nom;
private String type;
f E LM
r e
private static final long serialVersionUID = 1L;
ch
©A
@ManyToMany(mappedBy="sports")
private List <Personne> personnes = new ArrayList <Personne> ();
// ajouter les getter, setter, add et remove
}
mappedBy
fait référence à l’attribut sports dans la classe Personne
@Entity
public class Personne implements Serializable {
...
public void add(Sport s) {
H I ©
EL
// ajouter this a la liste des personnes de ce sport
[Link](this);
O U
}
[Link](s);
f E LM
ch r e
©A
public void remove(Sport s) {
[Link](this);
[Link](s);
}
La même chose à faire dans Sport pour la liste personnes. Attention aux boucles infinies.
affiche Wick
H & H: Research and Training 74 / 94
Relation entre entités ManyToMany
Remarques
L’association d’héritage
L’association d’héritage
L’association d’héritage
H I ©
Pour indiquer comment transformer les classes mère et filles en tables
UEL
O
Il faut utiliser l’annotation @Inheritance
f E LM
ch r e
©A
L’association d’héritage
H I ©
Tout dans une seule table
EL
M
Dans la classe mère on ajoute OU
f E L
@Inheritance(strategy=[Link] TABLE)
ch r e
© A
L’association d’héritage
Exemple
©
@DiscriminatorValue(value="ENS") dans la classe
Enseignant.
L’association d’héritage
H I ©
Exemple avec une table pour chaque entité
EL
M OU
@Inheritance(strategy=[Link] PER CLASS) :
E Lée en table.
Chaque entité sera transform
f
chr e
© A
@Id
@GeneratedValue (strategy=[Link])
private int num;
H I ©
private NomComplet nomComplet;
UEL
O
public int getNum() {
f E LM
}
return num;
ch r e
©A
public void setNum(int num) {
[Link] = num;
}
public NomComplet getNomComplet() {
return nomComplet;
}
public void setNomComplet(NomComplet nomComplet) {
[Link] = nomComplet;
}
Les évènements
H I ©
Le cycle de vie de chaque objet d’une entité JPA passe par trois
événements principaux
UEL
création (avec persist()) L M
O
r e f E
chflush())
mise à jour (avec
A
© (avec remove())
suppression
Les évènements
Les évènements
Les annotations
@PrePersist : avant qu’une nouvelle entité soit persistée.
@PostPersist : après l’enregistrement de l’entité dans la base
de données.
I ©
@PostLoad : après le chargement d’une entité de la base de
H
données.
UEL
O
f E
enregistrée en base de données. LM
@PreUpdate : avant que la modification d’une entité soit
c: h r e
@PostUpdate A après que la modification d’une entité est
©ée en base de données.
enregistr
@PreRemove : avant qu’une entité soit supprimée de la base de
donnée.
@PostRemove : après qu’une entité est supprimée de la base de
donnée.
H & H: Research and Training 86 / 94
Les méthodes callback
@Id
private int num;
private String nom;
H I ©
private String prenom;
UEL
O
private int nbrMAJ=0; // pour calculer le nombre de
modification
public int getNbrMAJ() {
f E LM
return nbrMAJ;
ch r e
©A
}
public void setNbrMAJ(int nbrMAJ) {
[Link] = nbrMAJ;
}
@PostUpdate
public void updateNbrMAJ() {
[Link]++;
}
// les autres getters, setters et constructeur
H & H: Research and Training 87 / 94
Les méthodes callback
Étapes
Créer un nouveau projet JEE (en Allant dans File, ensuite New
et chercher Dynamic Web Project)
H I ©
Saisir le nom du projet (dans Project name:)
U EL
M O
Dans l’onglet Configuration,
f E L cliquer sur Modify...
ch
Cocher la case JPA r e
et choisir la dernière version de JPA
Cliquer ©
A
sur Next et configurer les options de JPA
Générer le [Link] du projet JEE
Valider
Remarques
H I ©
UEL
Ainsi, on a créé un projet JEE dans lequel on peut créer, utiliser et
O
manipuler des entités JPA
f E LM
ch r e
Sans cette configuration, nous ne pourrons pas utiliser l’API JPA
©A
H I ©
EL
Ajouter JPA
O U
f E LM
ch r e
©A
H I ©
EL
Ajouter JPA
O U
Création d’un projet Maven
f E LM
ch r e
Aller dans File > New et chercher Maven Project
©A
Choisir un projet maven-archetype-webapp
Remplir le champs Group Id par [Link]
Remplir le champs Artifact Id par JeeJpaMavenProject
Valider
H & H: Research and Training 91 / 94
Utilisation de l’API JPA dans un projet Maven
©A
Cocher la case Apache Tomcat vX.X puis cliquer sur Apply
and Close
L
Cliquer sur Order and Export MO
r e f E
A h
Cocher les troisccase Maven Dependencies, Apache Tomcat
vX.X et© JRE System Library
Cliquer sur Apply and Close
Ajouter JPA
Faire un clic droit sur le nom du projet et aller dans Properties
H I ©
Chercher Project Facets
UEL
O
Cocher la case JPA
f E LM
ch r e
Cliquer sur le lien qui apparaı̂t (Further configuration
©A
available...) pour ajouter les données sur EclipseLink et la
connexion
Cliquer sur Apply and Close