Académique Documents
Professionnel Documents
Culture Documents
version 2.1
Plan
ORM
Entits
Associations
Comportement
Requtes
Mise en uvre
ORM
=
Object Relational Mapping
ORM
Object/Relational Mapping
Beaucoup dapplications ont besoin dune couche de
persistance
accs des donnes persistantes stockes dans un SGBD
gestion des donnes persistantes dans le SGBD
JPA ?
Standard offert par JavaEE/JavaSE
Framework ORM
Persistance transparente
POJO
Respecte les concepts OO
hritage, polymorphisme
Requtes
Plusieurs supports de persistance
JPA 2.1
Entits
Types de base
Associations
one-to-one, one-to-many/many-to-one, many-to-many
collections en utilisant java.util.Collection, Set, List, ou Map
paramtrage avec @JoinColumn, @JoinTable,
Hritage
JPQL
Gestion des caches
Olivier Perrin, Universit de Lorraine LicencePro, 2013
10
11
Entits
JPA: annotations
Ensemble dannotations permettant de dfinir les entits
relations
attributs
cl
associations
13
14
Entit
Plain Old Java Object (POJO)
15
Mapping simple
Client
id: Long
prnom: String
nom: String
tlphone: String
email: String
age: Integer
dateNaissance: Date
Relationnel
@Entity
public class Client {
@Id
private Long id;
private String prnom;
private String nom;
private String tlphone;
private String email;
private Integer age;
private Date dateNaissance;
// constructeurs/setter/getter
}
Java
Olivier Perrin, Universit de Lorraine LicencePro, 2013
16
Rgles
Pour quune classe puisse tre persistante, il faut
quelle soit identifie comme une entit (entity) en utilisant
lannotation @java.persistence.Entity
quelle possde un attribut identifiant en utilisant lannotation
@javax.persistence.Id
quelle ait un constructeur sans argument
@Entity
public class Client {
@Id
private Long id;
private String prnom;
private String nom;
private String tlphone;
private String email;
private Integer age;
private Date dateNaissance;
// constructeurs/setter/getter
}
Olivier Perrin, Universit de Lorraine LicencePro, 2013
Cl primaire
Une entit doit avoir un attribut qui correspond la cl
primaire de la table associe
La valeur de cet attribut ne doit jamais tre modifie
Lattribut cl primaire est dsign par lannotation @Id
Pour une cl composite, on utilise @EmbeddedId ou
@IdClass
Le type de la cl primaire doit tre dun des types suivants:
type primitif Java
classe qui enveloppe un type primitif
java.lang.String
java.util.Date
java.sql.Date
17
Cl primaire (cont.)
Possibilit de gnrer automatiquement les cls
Si la cl est de type numrique
@GeneratedValue indique que la cl sera automatiquement
gnre par le SGBD
lannotation peut avoir un attribut strategy qui indique comment
la cl sera gnre
18
19
Attributs
Paramtrage en utilisant lannotation @Column
Attributs de @Column
desc rClient
+-----------+--------------+------+
| Field
| Type
| Null |
+-----------+--------------+------+
| ID
| bigint(20)
| NO |
| PRENOM
| varchar(255) | NO |
| NOM
| varchar(30) | NO |
| TELEPHONE | varchar(15) | YES |
| MAIL
| varchar(255) | YES |
| AGE
| int(11)
| YES |
+-----------+--------------+------+
20
Annotations supplmentaires
@Temporal
on peut ajouter lannotation pour prciser le type dun attribut
@Temporal(TemporalType.DATE) private Date
dateNaissance;
on a le choix entre DATE, TIME, TIMESTAMP
@Transient
toutes les informations dune classe nont pas besoin dtre
persistantes
par exemple, lge
@Transient private Integer age;
21
Cl composite
Relation existante avec cl multi-attributs
Relation avec association N-M (Many-to-Many)
2 possibilits
@IdClass: correspond plusieurs attributs Id dans la classe entit
@EmbeddedId et @Embeddable: un seul attribut Id dans la classe
entit
22
23
@EmbeddedId
Correspond au cas o la classe entit comprend un seul
attribut annot @EmbeddedId
La classe cl primaire est annote par @Embeddable
@Entity
public class Client {
@EmbeddedId
private ClientPK clientPK;
}
@Embeddable
public class ClientPK {
private String nom;
private Date dateNaissance;
24
@IdClass
Correspond au cas o la classe entit comprend plusieurs
attributs annots par @Id
La classe entit est annote par @IdClass qui prend en
paramtre le nom de la classe cl primaire
La classe cl primaire nest pas annote
ses attributs ont les mmes noms et mmes types que les attributs
annots @Id dans la classe entit
@Entity
@IdClass(ClientPK)
public class Client {
@Id private String nom;
@Id private Date dateNaissance;
Associations
Associations
Une association peut tre uni- ou bi-directionnelle
Cardinalits: 1-1, 1-N, N-1, M-N
Elles sont dfinies grce une annotation sur la proprit
correspondante
// Association entre Client et Commandes
@OneToMany
public Collection<Commande> getCommandes() {
return commandes;
}
26
Associations bidirectionnelles
Le dveloppeur est responsable de la gestion des deux
bouts de lassociation
Un des bouts est le propritaire de l'association
Propritaire
pour les associations autres que M-N, ce bout correspond la
table qui contient la cl trangre qui traduit lassociation
pour les associations M-N, le dveloppeur choisit le bout
propritaire (de manire arbitraire)
lautre bout (non propritaire) est qualifi par lattribut mappedBy
qui donne le nom de lassociation correspondante dans le bout
propritaire
27
Association 1-1
Annotation @OneToOne
Reprsente la cl trangre dans la table
// Association entre Client et Adresse
@OneToOne
public Adresse getAdresse() {
28
29
@OneToMany(mappedBy = c)
Set<Commande> commandes;
}
@Entity
public class Commande {
@Id
private int id;
@ManyToOne
Client c;
}
Client
id
Commande
id
ClientId
30
@ManyToOne
Adresse adr;
}
Client
id
adrId
Adresse
id
Entit Client
@OneToMany(mappedBy=client)
public Set<Commande> commandes;
Entit Commande
@ManyToOne public Client client;
Exemple 2
Entit Client
@OneToMany(mappedBy=client, cascade=ALL)
public Set<Commande> commandes;
Entit Commande
@ManyToOne
@JoinColumn(name=client_id)
public Client client;
Olivier Perrin, Universit de Lorraine LicencePro, 2013
31
Associations M-N
Annotation @ManyToMany
Reprsente par une table association
Les valeurs par dfaut
le nom de la table association est la concatnation des 2 tables,
spares par _
les noms des attributs cls trangres sont les concatnations de la
table rfrence, de _ et de lattribut Id de la table rfrence
32
33
@ManyToMany
Collection<Telephone> noTels;
}
@Entity
public class Telephone {
@Id
private int id;
@ManyToMany(mappedBy=noTels)
Collection<Client> clients;
}
Client
id
Telephone
id
Client_Telephone
clients_id
noTels_id
@ManyToMany
@JoinTable(name=Client_Telephone,
joinColumns=@JoinColumn(name=clients_id),
inverseJoinColumns=@JoinColumn(name=noTels_id))
Collection<Telephone> noTels;
}
34
35
Identificateurs drivs
En JPA 1.0
identificateurs qui sont lis une association
ncessitent un attribut additionnel de cl trangre
mapping dupliqu
@Entity
public class Part {
@Id Integer partNo;
@Column (name=SUPP_ID)
@Id Integer suppId;
@ManyToOne
@JoinColumn(name=SUPP_ID,insertable=false, updatable=false)
Supplier supplier;
36
@Entity
public class Supplier {
@Id long suppId;
String name;
}
public class PartId {
String partNo; // mapping vers nom de lattribut @Id
long supp;
// mapping vers nom de lattribut @Id et type de Supplier PK
}
@Entity
@IdClass(PartId.class)
public class Part {
@Id String partNo;
@Id @ManyToOne Supplier supp;
}
Olivier Perrin, Universit de Lorraine LicencePro, 2013
37
38
39
Niveaux multiples
@Embeddable
public class Adresse {
String rue;
String ville;
String cp;
...
}
40
41
Listes tries
@Entity public class CarteCredit {
@Id long numCarte;
@OneToOne Personne proprioCarte;
...
@OneToMany
@OrderColumn
List<TransactionCarte> transactions;
}
42
43
Maps
@Entity public class VideoStore {
@Id Integer storeId;
Adresse emplacement;
...
@ElementCollection Map<Film, Integer> stock;
}
@Entity public class Film {
@Id String titre;
@String metteurEnScene;
...
}
Comportement
Comportement
Persistance des entits associes
lorsquun objet o est rendu persistant, les objets rfrencs par o
devraient tre rendus persistants
persistance par transitivit
comportement logique, mais
complexe !
cohrence
par exemple, que se passe-t-il si un objet supprim est rfrenc par un
autre objet ?
45
Comportement (cont.)
Attribut cascade
permet de propager les effets dune opration sur les entits
associes
valeurs possibles:
@OneToMany(cascade=CascadeType.PERSIST)
@OneToMany(cascade=CascadeType.PERSIST,
orphanRemoval=true)
46
Comportement (cont.)
Rcupration des entits associes
lorsquune entit est rcupre (requte), est-ce quon rcupre
aussi les entits associes ?
et si on rcupre les entits associes, est-ce que lon rcupre les
entits associes des entits associes ?
et si !
47
Comportement (cont.)
LAZY
pour les associations avec des hirarchies importantes
dans ce cas, lentit associe nest pas rcupre immdiatement
JPA remplace lentit par un proxy qui permettra de rcuprer
lentit plus tard si besoin
le proxy contient la cl primaire
Par dfaut
JPA est en mode EAGER pour 1-1 et N-1
JPA est en mode LAZY pour 1-N et M-N
48
Interfaces principales
EntityManagerFactory
utilise pour crer des entity managers
une seule entity manager factory par persistence unit
EntityManager
Query, TypedQuery
49
Requtes
JPQL
51
Requtes
Requtes statiques
@NamedQuery, @NamedNativeQuery
Requtes dynamiques
52
Requtes statiques
Dfinition
@NamedQuery(name=clientParCodePostal,
query = SELECT c FROM Client c WHERE
c.adresse.codePostal = :cp)
@Entity public class Client {
Utilisation
// Utilisation
public List rechercheClientParCodePostal(int cp) {
return em.createNamedQuery(clientCodePostal)
.setParameter(cp, cp)
.setMaxResults(20)
.get
}
53
54
Requtes dynamiques
public List rechercheAvecNom (String nom) {
return em.CreateQuery (
SELECT c FROM Client c +
WHERE c.nom LIKE :nomClient)
.setParameter(nomClient, nom)
.setMaxResults(10)
.getResultList();
}
55
Polymorphisme
Toutes les requtes sont polymorphes
Oui, et alors ?
Un nom de classe dans la partie FROM dsigne aussi bien
lentit dsigne que ses sous-classes !
Exemple
56
Expressions de chemins
On peut utiliser ces expressions pour naviguer entre les
entits
Si e est un alias pour Employe
e.departement dsigne le dpartement dun employ
e.projets dsigne la collection de projets auxquels participe
lemploy
57
58
Jointures
Trois types
jointure interne
jointure externe
jointure avec rcupration des donnes en mmoire (join fetch)
Exemples
59
60
Update, delete
UPDATE Employe e
SET e.salaire = e.salaire * 1.1
WHERE e.departement.nom = Informatique
DELETE
FROM Client c
WHERE c.status = inactif
AND c.commandes IS EMPTY
AND c.solde = 0
61
Mise en uvre
partir dun client JavaSE
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("EmployeService");
EntityManager em = emf.createEntityManager();
Collection employes =
em.createQuery("SELECT e FROM Employe e").getResultList();
62
Entity Manager
Cest lui qui est charg de grer le cycle de vie des entits
quivalent de Hibernate Session ou JDO PersistenceManager
4 oprations principales
persist()
insre une entit dans la base
remove()
supprime une entit de la base
merge()
synchronise ltat des entits dtaches
refresh()
recharge ltat des entits partir de la base
63
persist(), merge()
persist()
public Commande creerCommande(Client c) {
Commande cmde = new Commande(c);
// Aprs lappel persist(), ltat de lentit passe
// transient managed.
// Au prochain commit, linstance sera insre dans la
// base de donnes
entityManager.persist(cmde);
return cmde;
}
merge()
la mthode merge() retourne une copie gre (managed) de
lentit (pralablement dtache)
les modifications sur ltat persistant sont appliques linstance
gre
64
PrePersist/PostPersist
avant ou aprs que lobjet soit persistant
PreUpdate/PostUpdate
avant ou aprs la mise jour des attributs de lobjet
PreRemove/PostRemove
avant ou aprs la suppression de lobjet
PostLoad
aprs que lobjet ait t charg depuis la base de donnes
Olivier Perrin, Universit de Lorraine LicencePro, 2013
65
Entits dtaches
Entit qui a sa propre existence mais dont la
synchronisation avec la BD nest pas garantie
Exemple
une entit est dtache
elle est transmise la couche cliente et modifie par celle-ci
lentit est rattache afin que son nouvel tat soit enregistr dans la
BD
66
Entity manager
il effectue les oprations du cycle de vie sur les entits
il gre un persistence context
67
<provider>
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
</provider>
<class>s3.Client</class>
<properties>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/testDB"/>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.password" value=""/>
<property name="toplink.target-database" value="MySQL5"/>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
68
69
70
71
72
Transactions
Types de transactions
Il existe 2 types de transactions
transactions JTA
plus de fonctionnalits que les transactions JDBC
elles peuvent travailler avec plusieurs bases de donnes
74
Entity transaction
Si on nutilise pas un serveur dapplications (par ex.
Glassfish), on doit utiliser linterface
javax.persistence.EntityTransaction
Une instance de EntityTransaction sobtient par appel de la
mthode getTransaction() en EntityManager
public interface EntityTransaction {
public void begin();
public void commit();
public void rollback();
public void setRollbackOnly();
public boolean getRollbackOnly();
public void isActive();
}
75
76
Exemple
EntityManager em;
try{
em.getTransaction().begin()
em.getTransaction().commit();
} finally{
em.close();
}
Rollback/commit
En cas de rollback
rollback dans la base de donnes
le contexte de persistance est vid, i.e. toutes les entits sont
dtaches
les instances dentits Java gardent les valeurs quelles avaient au
moment du rollback
le plus souvent, il faut relancer les requtes pour viter davoir des
entits avec des valeurs incorrectes
En cas de commit
les modifications effectues sur les entits gres sont enregistres
dans la base de donnes
les modifications sont enregistres dans la base, mme si elles ont
t effectues avant le dbut de la transaction
77
OPTIMISTIC ( = READ )
OPTIMISTIC_FORCE_INCREMENT ( = WRITE )
PESSIMISTIC_READ
public void calculCharges() {
Compte cpt = em.find(Compte.class, cptId);
PESSIMISTIC_WRITE
// calcul des charges
PESSIMISTIC_FORCE_INCREMENT
int charge = ... ;
if (charge > 0) {
em.refresh(cpt, PESSIMISTIC_WRITE);
double solde = cpt.getSolde();
cpt.setSolde(solde - charge);
}
}
Olivier Perrin, Universit de Lorraine LicencePro, 2013
78
Dans JPA 2
79