Vous êtes sur la page 1sur 79

JPA: Java Persistence API

version 2.1

Licence Pro 2013


Olivier Perrin
Universit de Lorraine

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Plan
ORM
Entits
Associations
Comportement
Requtes
Mise en uvre

Olivier Perrin, Universit de Lorraine LicencePro, 2013

ORM
=
Object Relational Mapping

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

ORM rsout la diffrence entre modle Objet et modle


Relationnel
les donnes sont dans la BDD relationnelle: oriente tables,
nuplets, colonnes
lapplication travaille avec des classes, des objets, pas des nuplets ou
des colonnes

Autres possibilits: Hibernate, JDO,


Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA ?
Standard offert par JavaEE/JavaSE
Framework ORM
Persistance transparente
POJO
Respecte les concepts OO

Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA: les besoins


Simplifier le modle de persistance
Modle de persistance lger
Support de modlisation complexe

hritage, polymorphisme

ORM standard et efficace


optimis pour les SGBD relationnels
annotations standardises

Requtes
Plusieurs supports de persistance

notion de persistence unit (persistence.xml)


Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA 2.1
Entits
Types de base

Strings, integers, floats, decimals

Classes embeddable amliores


par exemple une adresse
embeddables imbriques; embeddables avec associations

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

table simple, sous-classe, table par classe (optionnel)


Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA 2.1: nouveauts


Collections
collections de strings, integers, floats, decimals, ...
collections de classes embeddable

Listes tries de manire persistante


Support amlior de Map
Options supplmentaires pour les associations
cl trangre one-to-many unidirectionnelle
table de jointure pour one-to-one, one-to-many/many-to-one

JPQL
Gestion des caches
Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA 2.1: nouveauts (cont.)


Jointures avec conditions ON
Invocation de fonctions de la BDD
Mises jour/suppression en srie
Casts dans les clauses FROM et WHERE
Options pour la gnration de schmas

Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA 2.1: nouveauts (cont.)


public List obtainActiveEmployeeCount() {

TypedQuery<Object[]> qry = em.createQuery("SELECT j.title, count(e) "


+ "FROM Jobs j LEFT JOIN j.employees e ON e.status = 'ACTIVE' "


+ "WHERE j.salary >= 50000 GROUP BY j.title", Object[].class);











}

List data = new ArrayList();


if (!qry.getResultList().isEmpty()) {

List<Object[]> tdata = qry.getResultList();

for (Object[] t : tdata) {


HashMap resultMap = new HashMap();


resultMap.put("title", t[0]);


resultMap.put("count", t[1]);


data.add(resultMap);

}
}
return data;

Olivier Perrin, Universit de Lorraine LicencePro, 2013

10

JPA 2.1: nouveauts (cont.)


SELECT e FROM Employee e WHERE FUNCTION(aboveTaxBracket, e.salary)

CriteriaBuilder builder = em.getCriteriaBuilder();


CriteriaUpdate<Employee> q = builder.createCriteriaUpdate(Employee.class);
Root<Employee> e = q.from(Employee.class);
q.set(e.get("status"), "ACTIVE")

.where(builder.equal(e.get("status"), "INACTIVE"));
Query criteriaUpd = em.createQuery(q);
criteriaUpd.executeUpdate();

SELECT b.attr1, b.attr2


FROM EntityA a JOIN TREAT(a.referenceToEntityB as EntityBType) b

Olivier Perrin, Universit de Lorraine LicencePro, 2013

11

Entits

Olivier Perrin, Universit de Lorraine LicencePro, 2013

JPA: annotations
Ensemble dannotations permettant de dfinir les entits

relations
attributs
cl
associations

Deux possibilits pour dfinir le mapping


annotations
ou fichier de mapping

Olivier Perrin, Universit de Lorraine LicencePro, 2013

13

14

Entit
Plain Old Java Object (POJO)

cre avec le mot-cl new comme toute autre instance Java

Peut contenir des attributs persistants ou non

tat non persistant accessible grce lannotation @Transient

Peut tendre dautres entits ou des classes qui ne sont pas


des entits
Srializable

pas besoin de soccuper des transferts dobjets

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

AUTO: le SGBD choisit (valeur par dfaut)


SEQUENCE: il utilise une squence SQL
IDENTITY: il utilise un gnrateur de type IDENTITY (auto increment
dans MySQL par exemple)
TABLE: il utilise une table qui contient la prochaine valeur de lidentificateur

Olivier Perrin, Universit de Lorraine LicencePro, 2013

18

19

Attributs
Paramtrage en utilisant lannotation @Column
Attributs de @Column

name(): nom de lattribut


unique(): la valeur est-elle unique ?
nullable(): accepte une valeur nulle ?
insertable(): autorise ou non lattribut tre mis jour
columnDefinition(): dfinition DDL de lattribut
table(): lorsque lattribut est utilis dans plusieurs tables
length(): longueur max
precision(): prcision pour les valeurs numriques

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Relation Clients revisite


@Entity
@Table(name = "rClient")
public class Client {
@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;
@Column(nullable = false) private String prnom;
@Column(nullable = false, length = 30) private String nom;
@Column(length = 15) private String tlphone;
@Column(name = "MAIL") private String email;
private Integer age;

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 |
+-----------+--------------+------+

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Dans les 2 cas, la cl doit tre reprsente par une classe


Java
les attributs correspondent aux composants de la cl
la classe doit tre publique
la classe doit avoir un constructeur sans paramtre
la classe doit tre srializable et redfinir equals et hashcode

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;

public class ClientPK {


private String nom;
private Date dateNaissance;

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Associations

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;
}

Support de Collection, Set, List, Map

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

27

Association 1-1
Annotation @OneToOne
Reprsente la cl trangre dans la table
// Association entre Client et Adresse
@OneToOne
public Adresse getAdresse() {

Olivier Perrin, Universit de Lorraine LicencePro, 2013

28

29

Associations 1-N et N-1


Annotations @OneToMany et @ManyToOne
Reprsente par une cl trangre dans la table qui
correspond au ct propritaire (obligatoirement le ct
Many)
@Entity
public class Client {
@Id
private int id;

@OneToMany(mappedBy = c)
Set<Commande> commandes;
}

@Entity
public class Commande {
@Id
private int id;

@ManyToOne
Client c;
}

Client
id

Commande
id
ClientId

Olivier Perrin, Universit de Lorraine LicencePro, 2013

30

Associations 1-N et N-1 (cont.)


@ManyToOne
@Entity
public class Client {
@Id
private int id;

@ManyToOne
Adresse adr;
}
Client
id
adrId

Adresse
id

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Associations 1-N et N-1 (cont.)


Exemple 1

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

32

33

Associations M-N (cont.)


@Entity
public class Client {
@Id
private int id;

@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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Associations M-N (cont.)


Si le mapping par dfaut ne convient pas, on peut le
surcharger avec lannotation @JoinTable
Lautre ct doit toujours comporter lattribut mappedBy
@Entity
public class Client {
@Id
private int id;

@ManyToMany
@JoinTable(name=Client_Telephone,
joinColumns=@JoinColumn(name=clients_id),
inverseJoinColumns=@JoinColumn(name=noTels_id))
Collection<Telephone> noTels;
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

34

Associations M-N (cont.)


@JoinTable
donne des informations sur la table association qui va reprsenter
lassociation
attribut name donne le nom de la table
attribut joinColumns donne les noms des attributs de la table qui
rfrencent les cls primaires du ct propritaire de lassociation
attribut inverseJoinColumns donne les noms des attributs de la
table qui rfrencent les cls primaires du ct qui nest pas
propritaire de lassociation

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;

Olivier Perrin, Universit de Lorraine LicencePro, 2013

36

Identificateurs drivs (2)


En JPA 2.1

les identificateurs sont drivs des associations

@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

Collections de types simples


@Entity
public class Personne {
@Id protected String nss;
protected String nom;
protected Date dateNaissance;
...
@ElementCollection
protected Set<String> surnoms;
}
@Entity
public class Personne {
@Id protected String nss;
protected String nom;
protected Date dateNaissance;
...
@ElementCollection
@CollectionTable(name=ALIAS)
protected Set<String> surnoms;
}
Olivier Perrin, Universit de Lorraine LicencePro, 2013

38

Collections de types embeddable


@Embeddable
public class Adresse {
String rue;
String ville;
String cp;
...
}
@Entity public class Millionaire extends Personne {
...
@ElementCollection protected Set<Adresse> maisonVacances;
...
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

39

Niveaux multiples
@Embeddable
public class Adresse {
String rue;
String ville;
String cp;
...
}

@Embeddable public class InfoContact {


@Embedded Adresse adresse;
...
}
@Entity public class Employe {
@Id int empId;
String nom;
InfoContact contact;
...
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

40

Embeddable avec associations


@Embeddable
public class InfoContact {
@Embedded Adresse adresse;
@OneToMany Set<Telephone> telephones;
...
}
@Entity public class Employe {
@Id int empId;
String nom;
InfoContact contact;
...
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

41

Listes tries
@Entity public class CarteCredit {
@Id long numCarte;
@OneToOne Personne proprioCarte;
...
@OneToMany
@OrderColumn
List<TransactionCarte> transactions;
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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;
...
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Comportement

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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 ?

JPA neffectue pas de persistance par transitivit par dfaut


plus de souplesse
possibilit davoir la persistance par transitivit avec cascade

Olivier Perrin, Universit de Lorraine LicencePro, 2013

45

Comportement (cont.)
Attribut cascade
permet de propager les effets dune opration sur les entits
associes
valeurs possibles:

PERSIST, REMOVE, REFRESH, MERGE, ALL

@OneToMany(cascade=CascadeType.PERSIST)

Par dfaut, aucune opration nest applique transitivement


En JPA 2.0, suppression automatique des orphelins

@OneToMany(cascade=CascadeType.PERSIST,
orphanRemoval=true)

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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 !

JPA laisse le choix de rcuprer ou non les entits


associes
on peut choisir le mode de rcupration: LAZY ou EAGER
EAGER: immdiat
LAZY: la demande

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

48

Interfaces principales
EntityManagerFactory
utilise pour crer des entity managers
une seule entity manager factory par persistence unit

EntityManager

utilis pour grer le contexte de persistance


criture/lecture des entits dans/de la base de donnes

oprations: persist, remove, find, refresh, createQuery,..

Query, TypedQuery

utilises pour la configuration des requtes, la dfinition des


paramtres et lexcution des requtes

Olivier Perrin, Universit de Lorraine LicencePro, 2013

49

Requtes
JPQL

Olivier Perrin, Universit de Lorraine LicencePro, 2013

51

Requtes
Requtes statiques

@NamedQuery, @NamedNativeQuery

Requtes dynamiques

dfinition de la requte lexcution

EntityManager permet de crer et excuter les requtes

createNamedQuery, createQuery, createNativeQuery

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Recherche par identifiant


find et getReference permettent de retrouver une
entit en donnant son Id
Elles ont deux paramtres
Class<T> pour indiquer le type de lentit recherche
Object pour indiquer la cl primaire

public void supprimeCommande(Long commandeId) {


Commande cmde = entityManager.find(Commande.class, commandeId);
entityManager.remove(cmde);
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

53

Requtes statiques (2)


Paramtrage
@NamedQuery(
name=clientParNom,
queryString=SELECT c FROM Client c +
WHERE c.nom LIKE :nomClient
)

@PersistenceContext public EntityManager em;


List clients =
em.createNamedQuery(clientParNom)
.setParameter(nomClient,Marchand)
.getResultList();

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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();
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

select count(a) from Articles as a


dnombre le nombre dinstances de la classe Articles et de toutes
les sous-classes de Articles

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

On peut chaner les navigations condition que la


navigation prcdente ne renvoie pas un ensemble
e.departement.nom dsigne le nom du dpartement de lemploy
e.projets.nom renvoie une erreur !

Olivier Perrin, Universit de Lorraine LicencePro, 2013

57

58

Jointures
Trois types

jointure interne
jointure externe
jointure avec rcupration des donnes en mmoire (join fetch)

Exemples

select p.nom from Employe e join e.projets p


select d.nom from Employe e, Departement d where
d=e.departement
select e.departement.nom from Employe e

Pas plus de 2 niveaux dans une expression de chemin pour


une jointure

select e,p from Employe e join e.participations.projet p

renvoie une exception

select e,p from Employe e join e.participations pa join


pa.projet p est ok
Olivier Perrin, Universit de Lorraine LicencePro, 2013

Requtes avec cl compose


public class MagasinPK implements Serializable {
private String codeVille;
private String codeMagasin;
public void setCodeVille(String v) {
codeVille = v;
}
public String getMagasinVille() {
return (codeVille);
}
public void setCodeMagasin(String c) {
codeMagasin = c;
}
public String getCodeMagasin() {
return (codeMagasin);
}
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

59

Requtes avec cl compose (cont.)


@Entity
@IdClass(MagasinPK.class)
public class Magasin {
@Id @Column(name=NomMagasin) public String magasinCode;
@Id public String villeCode;
...
}

PersistenceContext EntityManager em;


MagasinPK pk = new MagasinPK();
pk.setCodeMagasin(CSIN05);
pk.setCodeVille(JRE07);
Magasin m = em.find(Magasin.class, pk);

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Les mises jour doivent tre excutes dans une


transaction

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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();

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

64

Agir sur le cycle de vie dune entit


Une application peut tre notifie avant ou aprs chaque
action sur une entit (chargement, persistance, mise jour,
suppression) grce aux mthodes callback
Annotations

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

Lentit doit implanter Serializable


Elle devient dtache lors dun commit/rollback/close
Elle devient dtache lorsquelle est srialise
Olivier Perrin, Universit de Lorraine LicencePro, 2013

66

Entity Manager et Persistence context


Persistence context
reprsente un ensemble dentits gres lexcution
dire quune entit est gre (dans ltat managed) signifie quelle
appartient un persistence context donn
les entits qui appartiennent un persistence context ont un
comportement commun

Entity manager
il effectue les oprations du cycle de vie sur les entits
il gre un persistence context

Olivier Perrin, Universit de Lorraine LicencePro, 2013

67

Entity Manager et Persistence Unit


Toutes les entits gres par un Entity Manager sont
dfinies grce une unit de persistance (Persistence Unit)
Une unit de persistance dfinit
toutes les entits
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
le mappingname="testPU"
vers la basetransaction-type="RESOURCE_LOCAL">
de donnes
<persistence-unit

<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>

Un fichier persistence.xml dfinit une ou plusieurs units


de persistance

Olivier Perrin, Universit de Lorraine LicencePro, 2013

68

JPQL version 2.1


Support des nouveaux mappings (collections)
Oprateurs et fonctions dans les SELECT
Expressions case, coalesce, nullif
Possibilit dagir sur le polymorphisme
Paramtres pour les collections dans les expressions IN

Olivier Perrin, Universit de Lorraine LicencePro, 2013

69

JPQL version 2.1 (cont.)


Nouveaux oprateurs

INDEX pour les listes ordonnes


SELECT t FROM CreditCard c JOIN c.transactions t
WHERE c.cardHolder.name = 'John Doe' AND INDEX(t) < 10

KEY, VALUE, ENTRY pour les Maps


// Stock est de la forme Map<Film, Integer>
SELECT v.emplacement.rue, KEY(i).titre, VALUE(i)
FROM VideoStore v JOIN v.stock i
WHERE KEY(i).metteurEnScene LIKE '%Hitchcock%'AND VALUE(i) > 0

CASE, COALESCE, NULLIF pour les expressions case


UPDATE Employe e SET e.salaire =
CASE e.evaluation
WHEN 1 THEN e.salaire * 1.05
WHEN 2 THEN e.salaire * 1.02
ELSE e.salaire * 0.95
END
Olivier Perrin, Universit de Lorraine LicencePro, 2013

70

JPQL version 2.1 (cont.)

TYPE pour restreindre les choix ds au polymorphisme


SELECT e FROM Employe e
WHERE TYPE(e) IN :empTypes

Olivier Perrin, Universit de Lorraine LicencePro, 2013

71

JPQL version 2.1 (cont.)


API Criteria
API pour construire dynamiquement des requtes
Typage fort
Utilisation des generics de Java
Supports de la navigation base sur les objets ou les
chanes de caractres
Query q = em.createQuery(SELECT a FROM Comptes);
QueryBuilder qb = em.getQueryBuilder();
CriteriaQuery cq = qb.create();
Root<Compte> compte = cq.from(Compte.class);
cq.select(compte).where().orderBy();
Query q = em.createQuery(cq);
List<Compte> liste = q.getResultList();
Olivier Perrin, Universit de Lorraine LicencePro, 2013

72

Transactions

Olivier Perrin, Universit de Lorraine LicencePro, 2013

Types de transactions
Il existe 2 types de transactions

transactions locales une ressource


fournies par JDBC
associes une seule base de donnes

transactions JTA
plus de fonctionnalits que les transactions JDBC
elles peuvent travailler avec plusieurs bases de donnes

Dans JavaSE, transactions locales

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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();
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

75

76

Exemple
EntityManager em;

try{
em.getTransaction().begin()

em.getTransaction().commit();
} finally{
em.close();
}

Olivier Perrin, Universit de Lorraine LicencePro, 2013

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

Olivier Perrin, Universit de Lorraine LicencePro, 2013

77

JPA version 2.1: concurrence


Dans JPA 1.0, verrouillage optimiste
Dans JPA 2.0, possibilit dobtenir un verrouillage pessimiste

moins performant mais plus sr !

Nouveaux modes de verrouillage:

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

JPA version 2.1: cache


Gestion fine du cache L2 (absent de JPA 1)

important pour les serveurs dapplications

Fournir des donnes sans induire un accs la base

configurable: dure de vie, stratgie lecture/criture,

Dans JPA 2

cache L1 activ par dfaut (niveau EntityManager)


assure la cohrence dune donne au sein dune session

cache L2 activable volont (niveau EntityManagerFactory)


rsultats de requtes
requtes

possibilit de bypasser le cache si besoin (USE/BYPASS/REFRESH)


possibilit de contrler le cache (invalider tout ou partie du cache)

Olivier Perrin, Universit de Lorraine LicencePro, 2013

79