Vous êtes sur la page 1sur 176

SIO 1 Olivier Barais

SIO
Coursn2 Architecture de J ava EE
-
La nouvelle API de persistence : J PA
Olivier Barais
IFSIC
Universitde Rennes 1
barais@irisa.fr
Cours bti partir de :
Cours de Richard Grin
(Universitde Nice)
Livre Hibernate3.0 (Eyrolles)
SIO 2 Olivier Barais
J PA
J PA va sans doute devenir un standard pour
la persistance des objets J ava
Pour plus de prcisions, lire la spcification
ladresse
http://jcp.org/aboutJ ava/communityprocess/
pfd/jsr220/index.html
SIO 3 Olivier Barais
Avertissement
J PA est le plus souvent utilisdans le
contexte dun serveur dapplication (rappel
sur lintro de J EE)
Dans SIO, nous verrons J PA dans le cadre
dune application autonome, en dehors de
tout serveur dapplication
SIO 4 Olivier Barais
Fournisseur de persistance
Comme pour J DBC, lutilisation de J PA ncessite
un fournisseur de persistance qui implmente les
classes et mthodes de lAPI
GlassFish, est limplmentation de rfrence de la
spcification EJ B 3
GlassFishutilise TopLink essentials comme
fournisseur de persistance pour J PA
Dautres implmentations : TopLink, Hibernate
EntityManager, BEA Kodo
SIO 5 Olivier Barais
Plan
Prsentation gnrale
Notion dentits persistantes
Complments sur les entits : identit, associations,
hritage
Gestionnaire de persistance
Langage dinterrogation
SIO 6 Olivier Barais
Prsentation gnrale
SIO 7 Olivier Barais
Entits
Les classes dont les instances peuvent tre
persistantes sont appeles des entits dans la
spcification de J PA (hritage des EJ Bs)
Le dveloppeur indique quune classe est une
entiten lui associant lannotation @Entity
Ne pas oublier dimporter
javax.Persistence.Entity dans les classes entits
(idem pour toutes les annotations)
SIO 8 Olivier Barais
Exemple dentit
/** Sets id of the employee.
* @param id the id's employee
*/
public void setId(final int id) {
this.id=id;
}
/**
* Sets the name.
* @param name of employee.
*/
public void setName(final String name) {
this.name=name;
}
/**
* Gets the name of the employee.
* @return name of the employee.
*/
public String getName() {
return name;
}
/*Computes a string representation of this employee.
* @return string representation.
*/
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("Employee[id=").append(id).append(",
name=").append(getName()).append("]");
return sb.toString();
}}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Define an employee with an id and a name.
*/
@Entity
@Table(name="EMPLOYEES")
public class Employee implements java.io.Serializable{
/**
* Id for serializableclass.
*/
private static final long serialVersionUID =-
2366200007462547454L;
/**
* Id of this employee.
*/
private int id;
/**
* Name of the employee.
*/
private String name;
/**
* Gets the Id of the employee.
* @return the id of the employee.
*/
@Id
public int getId() {
return id;
}
SIO 9 Olivier Barais
Exemple dentit les champs
/**
* Sets the name.
* @param name of employee.
*/
public void setName(final String name) {
this.name=name;
}
/**
* Gets the name of the employee.
* @return name of the employee.
*/
public String getName() {
return name;
}
/*Computes a string representation of this employee.
* @return string representation.
*/
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("Employee[id=").append(id).append(",
name=").append(getName()).append("]");
return sb.toString();
}}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Define an employee with an id and a name.
*/
@Entity
@Table(name="EMPLOYEES")
public class Employee implements
java.io.Serializable{
/**
* Id for serializableclass.
*/
private static final long serialVersionUID =-
2366200007462547454L;
private String name;
SIO 10 Olivier Barais
Exemple dentit lidentificateur
/** Sets id of the employee.
* @param id the id's employee
*/
public void setId(final int id) {
this.id=id;
}
/*Computes a string representation of this employee.
* @return string representation.
*/
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("Employee[id=").append(id).append(",
name=").append(getName()).append("]");
return sb.toString();
}}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Define an employee with an id and a name.
*/
@Entity
@Table(name="EMPLOYEES")
public class Employee implements java.io.Serializable{
/**
* Id for serializableclass.
*/
private static final long serialVersionUID =-
2366200007462547454L;
/**
* Id of this employee.
*/
private int id;
@Id
public int getId() {
return id;
}
SIO 11 Olivier Barais
Exemple dentit une association
@Ent i t y
@NamedQuer y( name=" t ousLesEmpl oyees" , quer y=" SELECT p
FROM Empl oyee p" )
publ i c cl ass Empl oyee implements
j ava. i o. Ser i al i zabl e{

pr i vat e l ong i d;
pr i vat e St r i ng name;
private Entreprise ent;

publ i c Par t i ci pant ( ) {}


publ i c Par t i ci pant ( St r i ng name) {
set Name( name) ;
}
@I d @Gener at edVal ue
( st r at egy=Gener at i onType. AUTO)
publ i c l ong get I d( ) {
r et ur n t hi s. i d;
}
publ i c voi d set I d( f i nal l ong i d) {
t hi s. i d = i d;
}
@ManyToOne
@JoinColumn(name="Ecole_id");
public Entreprise getEnt() {
return ent;
}
public void setEnt
(Entreprise ent) {
this.ent = ent;
}

}
Lassociation inverse
dans la classe Entreprise
SIO 12 Olivier Barais
Fichiers de configuration XML
Les annotations @Entity (et toutes les autres
annotations J PA) peuvent tre remplaces ou/et
surcharges (les fichiers XML lemportent sur les
annotations) par des informations enregistres
dans un fichier de configuration XML
Exemple :
<table-generator name="empgen"
table="ID_GEN" pk-column-
value="EmpId"/>
La suite nutilisera que les annotations
SIO 13 Olivier Barais
Gestionnaire dentits
Classe javax.persistence.EntityManager
Le gestionnaire dentits (GE) est
linterlocuteur principal pour le dveloppeur
Il fournit les mthodes pour grer les entits :
les rendre persistantes,
les supprimer de la base de donnes,
retrouver leurs valeurs dans la base,
etc
SIO 14 Olivier Barais
Contexte de persistance
La mthode persist(objet) de la classe
EntityManager rend persistant un objet
Lobjet est alors grpar le GE :
toute modification apporte lobjet sera
enregistre dans la base de donnes par le GE
Lensemble des entits gres par un GE
sappelle un contexte de persistance
SIO 15 Olivier Barais
Exemple
{ Ent i t yManager Fact or y emf =
Per si st ence.
createEntityManagerFactory( "empl oye
s") ;
Ent i t yManager em=
emf . cr eat eEnt i t yManager ( ) ;
Ent i t yTr ansact i on t x =
em. get Tr ansact i on( ) ;
t x. begi n( ) ;
Empl oyee e1 = new Empl oyee( ) ;
em. per si st ( e1) ;
e1. set Name( " Dupont " ) ;
t x. commi t ( ) ;
SIO 16 Olivier Barais
Exemple (suite)
St r i ng quer ySt r i ng =
" SELECT e FROM Empl oye e "
+ " WHERE e. post e = : post e" ;
Quer y quer y =
em. cr eat eQuer y( quer ySt r i ng) ;
quer y. set Par amet er ( " post e" , " I NGENI EUR" ) ;
Li st <Empl oye> l i st e =
quer y. get Resul t Li st ( ) ;
f or ( Empl oye e : l i st e) {
Syst em. out . pr i nt l n( e. get Nom( ) ) ;
}
em. cl ose( ) ;
emf . cl ose( ) ;
SIO 17 Olivier Barais
Notion dentits persistantes
SIO 18 Olivier Barais
Caractristiques
Seules les entits peuvent tre
renvoyes par une requte (Query)
passes en paramtre dune mthode dun
EntityManager ou dun Query
la fin dune association
rfrences dans une requte J PQL
Une classe entitpeut utiliser dautres classes pour
conserver des tats persistants (MappedSuperclass
ou Embedded tudies plus loin)
SIO 19 Olivier Barais
Conditions pour les classes entits
Une classe entitdoit avoir un constructeur sans
paramtre protected ou public
Elle ne doit pas tre final
Aucune mthode ou champ persistant ne doit tre
final
Si une instance peut tre passe par valeur en
paramtre dune mthode comme un objet
dtach, elle doit implmenter Serializable
Elle doit possder un attribut qui reprsente la cl
primaire dans la BD
SIO 20 Olivier Barais
Convention de nommage JavaBean
Les entits doivent suivre la convention de
nommage des proprits du modle J avaBean pour
celles qui seront sauvegardes dans la base de
donnes
Si une variable dinstance sappelle var, les
modificateurs (getters) et accesseurs (setters)
doivent sappeler setVar et getVar (ou isVar si la
variable a le type boolean)
Les getters et setters doivent tre protected ou
public
SIO 21 Olivier Barais
2 types daccs
Le fournisseur de persistance accdera la valeur
dune variable dinstance
soit en accdant directement la variable dinstance
(par introspection)
soit en passant par ses accesseurs (getter ou setter)
Le type daccs est dterminpar lemplacement
des annotations (au dessus de la variable
dinstance ou au dessus du getter)
SIO 22 Olivier Barais
Vocabulaire J PA
Un champ dsigne une variable dinstance
J PA parle de propritlorsque laccs se
fait en passant par les accesseurs (getter ou
setter)
Lorsque le type daccs est indiffrent, J PA
parle dattribut
SIO 23 Olivier Barais
Choix du type daccs
Le choix doit tre le mme pour toutes les
classes dune hirarchie dhritage (interdit
de mlanger les 2 faons)
En programmation objet il est conseill
dutiliser plutt les accesseurs que les accs
directs aux champs (meilleur contrle des
valeurs) ; cest aussi le cas avec J PA
SIO 24 Olivier Barais
Attributs persistants
Par dfaut, tous les attributs dune entitsont
persistants
Lannotation @Basic indique quun attribut est
persistant mais elle nest donc indispensable que si
on veut prciser des informations sur cette
persistance (par exemple, une rcupration
retarde)
Seuls les attributs dont la variable est transient ou
qui sont annots par @Transient ne sont pas
persistants
SIO 25 Olivier Barais
Cycle de vie dune instance dentit
Linstance peut tre :
nouvelle (new) : elle est cre mais pas associe
un contexte de persistance
gre par un gestionnaire de persistance ; elle a
une identitdans la base de donnes (un objet
peut devenir grpar la mthode persist, ou
merge dune entitdtache, ou si cest une
instance rcupre dans la base par une
requte)
SIO 26 Olivier Barais
Cycle de vie dune instance dentit
dtache : elle a une identitdans la base mais
elle nest plus associe un contexte de
persistance (une entitpeut devenir dtache
la fin dune transaction ou par un passage par
valeur en paramtre dune mthode distante)
supprime : elle a une identitdans la base ;
elle est associe un contexte de persistance et
ce contexte doit la supprimer de la base de
donnes (passe dans cet tat par la mthode
remove)
SIO 27 Olivier Barais
Configuration
La configuration des classes entits suppose
des valeurs par dfaut
Il nest ncessaire dajouter des
informations de configuration que si ces
valeurs par dfauts ne conviennent pas
Par exemple, @Entity suppose que la table
qui contient les donnes des instances de la
classe a le mme nom que la classe
SIO 28 Olivier Barais
Nom de table
Pour donner la table un autre nom que le
nom de la classe, il faut ajouter une
annotation @Table
/**
* Define an employee with an id and a name.
*/
@Entity
@Table(name="EMPLOYEES")
public class Employee implements java.io.Serializable{

}
SIO 29 Olivier Barais
Nom de colonne
Pour donner une colonne de la table un autre nom
que le nom de lattribut correspondant, il faut ajouter
une annotation @Column
Cette annotation peut aussi comporter des attributs
pour dfinir plus prcisment la colonne
Exemple :
@Col umn( name=" AUTRENOM" ,
updat abl e=f al se, l engt h=80)
publ i c St r i ng get Name( ) { . . . }
SIO 30 Olivier Barais
Classes Embeddable
Les entits persistantes ne sont pas les seules
classes persistantes
Il existe aussi des classes insres ou
incorpores (embedded) dont les donnes nont
pas didentitdans la BD mais sont insres dans
une des tables associes une entitpersistante
Par exemple, une classe Adresse dont les valeurs
sont insres dans la table Employe
SIO 31 Olivier Barais
Exemple
@Embeddabl e
publ i c cl ass Adr esse {
pr i vat e i nt numer o;
pr i vat e St r i ng r ue;
pr i vat e St r i ng vi l l e;

}
@Ent i t y
publ i c cl ass Empl oye {
@Embedded pr i vat e Adr esse adr esse;

SIO 32 Olivier Barais


Restrictions
La version actuelle de J PA a plusieurs
restrictions (peut-tre enleves dans une
prochaine version) :
une entitne peut possder une collection
dobjets insrs
un objet insrne peut rfrencer un autre
objet insrni avoir une association avec une
entit
un objet insrne peut tre rfrencpar
plusieurs entits diffrentes
SIO 33 Olivier Barais
Classes insres partages
Si une classe insre est utilise par 2 classes
entits, il est possible que les noms des colonnes
soient diffrentes dans les tables associes aux 2
entits
En ce cas, un champ annotpar @Embedded
peut tre compltpar une annotation
@AttributeOverride, ou plusieurs de ces
annotations insres dans une annotation
@AttributeOverrides
SIO 34 Olivier Barais
Exemple
@Ent i t y
publ i c cl ass Empl oye {
@Embedded
@At t r i but eOver r i des( {
@At t r i but eOver r i de(
name=" numer o" ,
col umn=@col umn( name=" num" ) ) ,
@At t r i but eOver r i de( . . . )
})
pr i vat e Adr esse adr esse;

SIO 35 Olivier Barais


Annotation pour LOB
Lannotation @Lob permet dindiquer
quun attribut est un LOB (Large OBject) :
soit un CLOB (Character LOB, tel un long
rsumde livre), soit un BLOB (Binary
LOB, tel une image ou une squence vido)
Le fournisseur de persistance pourra ainsi
ventuellement traiter lattribut de faon
spciale (utilisation de flots dentres-
sorties par exemple)
Exemple : @Lob private byte[] image
SIO 36 Olivier Barais
Annotation pour numration
Une annotation spciale nest pas ncessaire si un
attribut est de type numration si lnumration
est sauvegarde dans la BD sous la forme des
numros des constantes de lnumration (de 0
n)
Si on souhaite sauvegarder les constantes sous la
forme de la forme dune String qui reprsente le
nom de la valeur de lnumration, il faut utiliser
lannotation @Enumerated
@Enumer at ed( EnumType. STRI NG)
pr i vat e TypeEmpl oye t ypeEmpl oye;
SIO 37 Olivier Barais
Annotation pour les types temporels
3 types temporels dans lnumration TemporalType :
DATE,
TIME,
TIMESTAMP
Correspondent aux 3 types de SQL ou du paquetage java.sql :
Date, Time et Timestamp
Les 2 types temporels du paquetage java.util (Date et Calendar)
ncessitent lannotation @Temporal pour indiquer sil sagit
dune date (un jour), un temps sur 24 heures (heures, minutes,
secondes la milliseconde prs) ou un timeStamp (date + heure
la microseconde prs)
@Tempor al ( Tempor al Type. DATE)
pr i vat e Cal endar dat eEmb;
SIO 38 Olivier Barais
Tables multiples
Il est possible de sauvegarder une entitsur
plusieurs tables
Voir @SecondaryTable dans la
spcification J PA
SIO 39 Olivier Barais
Identitdes entits
SIO 40 Olivier Barais
Clprimaire
Une entitdoit avoir un attribut qui correspond
la clprimaire dans la table associe
La valeur de cet attribut ne doit jamais tre
modifie
Cet attribut doit tre dfini dans lentitracine
dune hirarchie dhritage (uniquement cet
endroit dans toute la hirarchie dhritage)
Une entitpeut avoir une clprimaire composite
(pas recommand)
SIO 41 Olivier Barais
Annotation
Lattribut clprimaire est dsignpar
lannotation @Id
Pour une clcomposite on utilise
@EmbeddedId ou @IdClass
SIO 42 Olivier Barais
Type de la clprimaire
Le type de la clprimaire (ou des champs dune
clprimaire compose) doit tre un des types
suivants :
type primitif J ava
classe qui enveloppe un type primitif
java.lang.String
java.util.Date
java.sql.Date
Ne pas utiliser les types numriques non entiers
SIO 43 Olivier Barais
Gnration automatique de cl
Si la clest de type numrique entier,
lannotation @GeneratedValue indique
que la clprimaire sera gnre
automatiquement par le SGBD
Cette annotation peut avoir un attribut
strategy qui indique comment la clsera
gnre
SIO 44 Olivier Barais
Types de gnration
AUTO : le SGBD choisit (squence, table,) ; cest la
valeur par dfaut
SEQUENCE : il utilise une squence
IDENTITY : il utilise une colonne de type IDENTITY
TABLE : il utilise une table qui contient la prochaine
valeur de lidentificateur
On peut aussi prciser le nom de la squence ou de la
table avec lattribut generator
SIO 45 Olivier Barais
Prcisions sur la gnration
Les annotations @SequenceGenerator et
@TableGenerator permettent de donner plus de
prcisions sur la squence ou la table qui va
permettre de gnrer la cl
Par exemple @SequenceGenerator permet de
prciser la valeur initiale ou le nombre de cls
rcupres chaque appel de la squence
Voir la spcification de J PA pour plus de
prcisions
SIO 46 Olivier Barais
Exemple
@I d
@Gener at edVal ue(
st r at egy = SEQUENCE,
gener at or = " EMP_SEQ" )
publ i c l ong get I d( ) {
r et ur n i d;
}
SIO 47 Olivier Barais
Clcomposite
Pas recommand, mais une clprimaire
peut tre compose de plusieurs colonnes
Peut arriver quand la BD existe djou
quand la classe correspond une table
association (association M:N)
2 possibilits :
@IdClass
@EmbeddedId et @Embeddable
SIO 48 Olivier Barais
Classe pour la clcomposite
Dans les 2 cas, la clprimaire doit tre
reprsente par une classe J ava dont les
attributs correspondent aux composants de
la clprimaire
La classe doit tre public, possder un
constructeur sans paramtre, tre
srialisableet redfinir equals et hashcode
SIO 49 Olivier Barais
@EmbeddedId
@EmbeddedId correspond au cas ola
classe entitcomprend un seul attribut
annot@EmbeddedId
La classe clprimaire est annote par
@Embeddable
SIO 50 Olivier Barais
Exemple avec @EmbeddedId
@Ent i t y
publ i c cl ass Empl oye {
@EmbeddedI d
pr i vat e Empl oyePK empl oyePK
. . .
}
@Embeddabl e
publ i c cl ass Empl oyePK {
pr i vat e St r i ng nom;
pr i vat e Dat e dat eNai ssance;
. . .
}
SIO 51 Olivier Barais
@IdClass
@IdClass correspond au cas ola classe entit
comprend plusieurs attributs annots par @Id
La classe entitest annote par @IdClass qui
prend en paramtre le nom de la classe cl
primaire
La classe clprimaire nest pas annote ; ses
attributs ont les mmes noms et mmes types que
les attributs annots @Id dans la classe entit
SIO 52 Olivier Barais
Exemple avec @IdClass
@Ent i t y
@I dCl ass( Empl oyePK)
publ i c cl ass Empl oye {
@I d pr i vat e St r i ng nom;
@I d Dat e dat eNai ssance;
. . .
}
publ i c cl ass Empl oyePK {
pr i vat e St r i ng nom;
pr i vat e Dat e
dat eNai ssance;
. . .
}
Rq:
@IdClass existe
pour assurer une
compatibilitavec
la spcification
EJ B 2.0
Il vaut mieux
utiliser
@EmbeddedId
SIO 53 Olivier Barais
Associations
SIO 54 Olivier Barais
Gnralits
Une association peut tre uni ou
bidirectionnelle
Elle peut tre de type 1:1, 1:N, N:1 ou M:N
Les associations doivent tre indiques par
une annotation sur la proprit
correspondante, pour que J PA puisse les
grer correctement
SIO 55 Olivier Barais
Exemple
@ManyToOne
publ i c Depar t ement get Depar t ement ( ) {

}
SIO 56 Olivier Barais
Associations bidirectionnelles
Le dveloppeur est responsable de la
gestion correcte des 2 bouts de lassociation
Un des 2 bouts est dit propritaire de
lassociation
SIO 57 Olivier Barais
Bout propritaire
Pour les associations autres que M:N ce bout
correspond la table qui contient la cltrangre
qui traduit lassociation
Pour les associations M:N le dveloppeur peut
choisir arbitrairement le bout propritaire
Lautre bout (non propritaire) est qualifipar
lattribut mappedBy qui donne le nom de
lassociation correspondante dans le bout
propritaire
SIO 58 Olivier Barais
Exemple
Dans la classe Employe :
@ManyToOne
publ i c Depar t ement get Depar t ement ( ) {
r et ur n depar t ement ;
}
Dans la classe Departement :
@OneToMany( mappedBy=" depar t ement " )
publ i c Col l ect i on<Empl oye> get Empl oyes( ) {
r et ur n empl oyes;
}
SIO 59 Olivier Barais
Persistance des objets associs
Lorsquun objet o est rendu persistant (mthode
persist), les objets rfrencs par o devraient tre
rendus eux-aussi persistants
Ce concept sappelle la persistance par
transitivit
Ca serait un comportement logique : un objet nest
pas vraiment persistant si une partie des valeurs de
ses proprits nest pas persistante
SIO 60 Olivier Barais
Pas si simple
Maintenir une cohrence automatique des
valeurs persistantes nest pas si simple en
cas de persistance par transitivit
Par exemple, que se passe-t-il si un objet
supprimest rfrencpar un autre objet ?
SIO 61 Olivier Barais
Le choix de J PA
Par dfaut, J PA neffectue pas de persistance par
transitivit
Ce comportement permet plus de souplesse, et un
meilleur contrle de lapplication sur ce qui est
rendu persistant
Pour que les objets associs un objet persistant
deviennent automatiquement persistants, il faut
lindiquer dans les informations de mappingde
lassociation (attribut cascade)
SIO 62 Olivier Barais
Attribut cascade
Les annotations qui dcrivent les associations
entre objets peuvent avoir un attribut cascade pour
indiquer que certaines oprations de GE doivent
tre appliques aux objets associs
Ces oprations sont persist, remove, refresh et
merge
Par dfaut, aucune opration nest applique
transitivement
SIO 63 Olivier Barais
Exemples
@OneToMany(
cascade=CascadeType. PERSI ST)
@OneToMany(
cascade={CascadeType. PERSI ST,
CascadeType. MERGE})
SIO 64 Olivier Barais
Association 1:1
Annotation @OneToOne
Reprsente par une cltrangre dans la
table qui correspond au ctpropritaire
Exemple :
@OneToOne
publ i c Adr esse get Adr esse( ) {

}
SIO 65 Olivier Barais
Associations 1:N et N:1
Annotations @OneToMany et
@ManyToOne
Reprsente par une cltrangre dans la
table qui correspond au ctpropritaire
(obligatoirement le ctMany)
SIO 66 Olivier Barais
Exemple
cl ass Empl oye {
. . .
@ManyToOne
publ i c Depar t ement get Depar t ement ( ) {

}
}
cl ass Depar t ement {

@OneToMany( MappedBy=" depar t ement " )


publ i c Li st <Empl oye> get Empl oyes( ) {

}
}
SIO 67 Olivier Barais
Association M:N (1)
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 colonnes cls trangres sont les
concatnations de la table rfrence, de _
et de la colonne Id de la table rfrence
SIO 68 Olivier Barais
Association M:N (2)
Si les valeurs par dfaut ne conviennent pas,
le ctpropritaire doit comporter une
annotation @JoinTable
Lautre ctdoit toujours comporter
lattribut mappedBy
SIO 69 Olivier Barais
@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
colonnes de la table qui rfrencent les cls
primaires du ctpropritaire de lassociation
Attribut inverseJoinColumns donne les noms des
colonnes de la table qui rfrencent les cls
primaires du ctqui nest pas propritaire de
lassociation
SIO 70 Olivier Barais
Exemple
@ManyToMany
@J oi nTabl e(
name=" EMP_PROJ ET"
j oi nCol umns=@J oi nCol umn( name=" mat r " )
i nver seJ oi nCol umns=
@J oi nCol umn( name=" codePr oj et " )
)
publ i c Col l ect i on<Pr oj et > get Pr oj et s( ) {
@ManyToMany( mappedBy=" pr oj et s" )
publ i c Col l ect i on<Empl oye> get Emps( ) {
(classe Employe)
(classe Projet)
SIO 71 Olivier Barais
Rcupration des entits associes
Lorsquune entitest rcupre depuis la base de
donnes par une requte (Query) ou par un find,
est-ce que les entits associes doivent tre elles
aussi rcupres ?
Si elles sont rcupres, est-ce que les entits
associes ces entits doivent elles aussi tre
rcupres ?
On voit que le risque est de rcuprer un trs
grand nombre dentits qui ne seront pas utiles
pour le traitement en cours
SIO 72 Olivier Barais
EAGER ou LAZY
J PA laisse le choix de rcuprer ou non
immdiatement les entits associes, suivant les
circonstances
Il suffit de choisir le mode de rcupration de
lassociation (LAZY ou EAGER)
Une requte sera la mme, quel que soit le mode de
rcupration
Dans le mode LAZY les donnes associes ne sont
rcupres que lorsque cest vraiment ncessaire
SIO 73 Olivier Barais
Rcupration retarde (LAZY)
Dans le cas oune entitassocie nest pas
rcupre immdiatement, J PA remplace
lentitpar un proxy , objet qui permettra
de rcuprer lentitplus tard si besoin est
Ce proxy contient la clprimaire qui
correspond lentitnon immdiatement
rcupre
SIO 74 Olivier Barais
Comportement par dfaut de J PA
Par dfaut, J PA ne rcupre immdiatement que
les entits associes par des associations dont le
but est One (une seule entitlautre bout) :
OneToOne et ManyToOne (mode EAGER)
Pour les associations dont le but est Many (une
collection lautre bout), OneToMany et
ManyToMany, par dfaut, les entits associes ne
sont pas rcupres immdiatement (mode LAZY)
SIO 75 Olivier Barais
type de rcupration des entits associes
Lattribut fetch dune association permet dindiquer
une rcupration immdiate des entits associes
(FetchType.EAGER) ou une rcupration retarde
(FetchType.LAZY) si le comportement par dfaut ne
convient pas
Exemple :
@OneToMany( mappedBy=" depar t ement " ,
f et ch=Fet chType. EAGER)
publ i c Col l ect i on<Empl oye>
get Empl oyes( )
SIO 76 Olivier Barais
Mode de rcupration des attributs
Le mode de rcupration par dfaut est le mode
EAGER pour les attributs (ils sont chargs en
mme temps que lentit)
Si un attribut est dun type de grande dimension
(LOB), il peut aussi tre marqupar
@Basic(fetch=FetchType.LAZY) (utiliser avec
parcimonie)
Cette annotation nest quune suggestion au GE,
quil peut ne pas suivre
SIO 77 Olivier Barais
Hritage
SIO 78 Olivier Barais
Stratgies
A ce jour, les implmentations de J PA doivent
obligatoirement offrir 2 stratgies pour la traduction de
lhritage :
une seule table pour une hirarchie dhritage
(SINGLE_TABLE)
une table par classe ; les tables sont jointes pour reconstituer
les donnes (JOINED)
La stratgie une table distincte par classe concrte
est seulement optionnelle (TABLE_PER_CLASS)
SIO 79 Olivier Barais
Une table par hirarchie
Sans doute la stratgie la plus utilise
Valeur par dfaut de la stratgie de traduction de
lhritage
Elle est performante et permet le polymorphisme
Mais elle induit beaucoup de valeurs NULL dans
les colonnes si la hirarchie est complexe
SIO 80 Olivier Barais
Exemple
@Ent i t y
@I nher i t ance( st r at egy=
I nher i t anceType. SI NGLE_TABLE)
publ i c abst r act cl ass Per sonne {}
@Ent i t y
@Di scr i mi nat or Val ue( " E" )
publ i c cl ass Empl oye ext ends Per sonne {

}
A mettre dans la classe
racine de la hirarchie
Employepar dfaut
SIO 81 Olivier Barais
Nom de la table
Si on choisit la stratgie une seule table
pour une arborescence dhritage la table
a le nom de la table associe la classe
racine de la hirarchie
SIO 82 Olivier Barais
Colonne discriminatrice (1)
Une colonne de la table doit permettre de diffrencier
les lignes des diffrentes classes de la hirarchie
dhritage
Cette colonne est indispensable pour le bon
fonctionnement des requtes qui se limitent une
sous-classe
Par dfaut, cette colonne se nomme DTYPE et elle est
de type Discriminator.STRINGde longueur 31 (autres
possibilits pour le type : CHAR et INTEGER)
SIO 83 Olivier Barais
Colonne discriminatrice (2)
Lannotation @DicriminatorColumn permet de
modifier les valeurs par dfaut
Ses attributs :
name
discriminatorType
columnDefinition fragment SQL pourvcrer la colonne
length longueur dans le cas ole type est STRING (31
par dfaut)
SIO 84 Olivier Barais
Exemple
@Ent i t y
@I nher i t ance
@Di scr i mi nat or Col umn(
name=" TRUC" ,
di scr i mi nat or Type=" STRI NG" , l engt h=5)
publ i c cl ass Machi n {

}
SIO 85 Olivier Barais
Valeur discriminatrice
Chaque classe est diffrencie par une
valeur de la colonne discriminatrice
Cette valeur est passe en paramtre de
lannotation @DiscriminatorValue
Par dfaut cette valeur est le nom de la
classe
SIO 86 Olivier Barais
Une table par classe
Ncessite des jointures pour retrouver les
proprits dune instance dune classe
Une colonne discriminatrice permet de
simplifier certaines requtes
SIO 87 Olivier Barais
Exemple
@Ent i t y
@I nher i t ance( st r at egy=
I nher i t anceType. J OI NED)
publ i c abst r act cl ass Per sonne {}
@Ent i t y
@Di scr i mi nat or Val ue( " E" )
publ i c cl ass Empl oye ext ends Per sonne {

}
A mettre dans la classe
racine de la hirarchie
Employepar dfaut
SIO 88 Olivier Barais
Une table par classe concrte
Stratgie seulement optionnelle
Pas recommandcar le polymorphisme est plus
complexe obtenir (voir premier cours)
Chaque classe concrte correspond une seule
table totalement spare des autres tables
Toutes les proprits de la classe, mme celles qui
sont hrites, se retrouvent dans la table
SIO 89 Olivier Barais
Exemple
@Ent i t y
@I nher i t ance( st r at egy=
I nher i t anceType. TABLE_PER_CLASS)
publ i c abst r act cl ass Per sonne {. . . }
@Ent i t y
@Tabl e( name=EMPLOYE)
publ i c cl ass Empl oye ext ends Per sonne {

}
SIO 90 Olivier Barais
Entitabstraite
Une classe abstraite peut tre une entit
(annote par @Entity)
Son tat sera persistant et sera utilispar les
sous-classes entits
Comme toute entit, elle pourra dsigner le
type retour dune requte (query) pour une
requte polymorphe
SIO 91 Olivier Barais
Complments
Lannotation @Entity ne shrite pas
Les sous-classes entits dune entitdoivent
tre annote par @Entity
Une entitpeut avoir une classe mre qui
nest pas une entit; en ce cas, ltat de
cette classe mre ne sera pas persistant
SIO 92 Olivier Barais
Classe mre persistante
Une entitpeut aussi avoir une classe mre dont
ltat est persistant, sans que cette classe mre ne
soit une entit
En ce cas, la classe mre doit tre annote par
@MappedSuperclass
Cette classe mre ne pourra pas tre renvoye par
une requte, ne pourra pas tre passe en
paramtre dune mthode dun EntityManager ou
dun Query et ne pourra tre la fin dune
association
SIO 93 Olivier Barais
Gestionnaire dentits
(Entity Manager), GE
SIO 94 Olivier Barais
Principe de base
La persistance des entits nest pas
transparente
Une instance dentitne devient persistante
que lorsque lapplication appelle la mthode
approprie du gestionnaire dentit(persist
ou merge)
Cette conception a tvoulue par les
concepteurs de lAPI par souci de flexibilit
et pour permettre un contrle fin de
lapplication sur la persistance des entits
SIO 95 Olivier Barais
Unitde persistance
Cest une configuration nomme qui
contient les informations ncessaires
lutilisation dune base de donnes
Elle est associe un ensemble de classes
entits
SIO 96 Olivier Barais
Configuration des units de persistance
Dans un environnent non grpar un serveur
dapplications, les informations sur une unitde
persistance sont donnes dans un fichier
persistence.xml situdans un sous-rpertoire etc
dun des rpertoires du classpath
Les informations indiquent comment se connecter
la base de donnes, ainsi que dautres
informations, comme les noms des classes entits
SIO 97 Olivier Barais
Contexte de persistance
Un contexte de persistance est un ensemble
dentits qui vrifie la propritsuivante : il ne
peut exister 2 entits diffrentes qui reprsentent
des donnes identiques dans la base
Un contexte de persistance est grpar un
gestionnaire dentits qui veille ce que cette
propritsoit respecte
Un contexte de persistance ne peut appartenir qu
une seule unitde persistance
Une unitde persistance peut contenir plusieurs
contextes de persistance
SIO 98 Olivier Barais
Contexte de persistance
Cest la responsabilitde lapplication de
sassurer quune entitnappartient quun
seul contexte de persistance
Sinon, 2 entits de 2 contextes de
persistance diffrents pourraient
correspondre des donnes identiques dans
la base de donnes
SIO 99 Olivier Barais
Contexte de persistance
Quand une entitest incluse dans un
contexte de persistance (persist ou merge),
ltat de lentitest automatiquement
sauvegarddans la base au moment de la
validation (commit) de la transaction
SIO 100 Olivier Barais
Classe EntityManager
Elle reprsente un GE
Types de GE
GE grpar le container (uniquement disponible dans
un serveur dapplications)
dlimitpar les transactions (TRANSACTION)
peut survivre une fin de transaction (EXTENDED) ;
ncessite un beansession avec tat (stateful)
GE grpar lapplication (seul type disponible en
dehors dun serveur dapplications) ; pas dlimitpar
les transactions
Nous ne verrons que le deuxime type de GE dans
ce cours (Voir loption ABC en Master 2 pour les
autres)
SIO 101 Olivier Barais
GE non grpar le conteneur
En dehors dun serveur dapplication, cest
lapplication qui dcide de la dure de vie
dun GE
La mthode createEntityManager() de la
classe EntityManagerFactory crun GE
Le GE est supprimavec la mthode close()
de la classe EntityManager
SIO 102 Olivier Barais
Fabrique de GE
La classe Persistence permet dobtenir une
fabrique de gestionnaire dentits par la mthode
createEntityManagerFactory
2 variantes surcharges de cette mthode :
1 seul paramtre qui donne le nom de lunitde
persistance (dfinie dans le fichier persistence.xml)
Un 2me paramtre de type Map qui contient des
valeurs qui vont craser les proprits par dfaut
contenues dans persistence.xml
SIO 103 Olivier Barais
Mthodes de EntityManager
voi d per si st ( Obj ect entit)
<T> T mer ge( T entit)
voi d r emove( Obj ect entit)
<T> T f i nd( Cl ass<T> classeEntit,
Obj ect clPrimaire)
<T> T get Ref er ence( Cl ass<T>
classeEntit, Obj ect clPrimaire)
voi d f l ush( )
voi d set Fl ushMode( Fl ushModeType
flushMode)
SIO 104 Olivier Barais
Mthodes de EntityManager
voi d l ock( Obj ect entit,
LockModeType lockMode)
voi d r ef r esh( )
voi d cl ear ( )
bool ean cont ai ns( Obj ect entit)
Quer y cr eat eQuer y( St r i ng requte)
Quer y cr eat eNamedQuer y( St r i ng nom)
SIO 105 Olivier Barais
Mthodes de EntityManager
Quer y cr eat eNat i veQuer y( St r i ng
requte)
Quer y cr eat eNat i veQuer y( St r i ng
requte, Cl ass classeRsultat)
voi d j oi nTr ansact i on( )
voi d cl ose( )
bool ean i sOpen( )
Ent i t yTr ansact i on get Tr ansact i on( )
SIO 106 Olivier Barais
flush
Toutes les modifications effectues sur les entits
du contexte de persistance gres par le GE sont
enregistres dans la BD lors dun flush du GE
Au moment du flush, le GE tudie ce quil doit
faire pour chacune des entits quil gre et il lance
les commandes SQL adaptes pour modifier la
base de donnes (I NSERT, UPDATE ou
DELETE)
SIO 107 Olivier Barais
flush
Un flush est automatiquement effectuau
moins chaque commit de la transaction en
cours
Une exception
TransactionRequiredException est leve
si la mthode flush est lance en dehors
dune transaction
SIO 108 Olivier Barais
flush
Soit X une des entits gre, avec une association
de X vers une entitY
Si cette association est note avec
cascade=persist ou cascade=all, Y est elle aussi
flushe
Sinon, si Y est new ou removed, une exception
IllegalStateException sera leve et la transaction
est invalide (rollback)
Sinon, si Y est dtache et X possde
lassociation, Y est flushe ; si Y est la
propritaire, le comportement est indfini
SIO 109 Olivier Barais
Mode de flush
Normalement (mode FlushMode.AUTO) un flush des
entits concernes par une requte est effectuavant la
requte pour que le rsultat tienne compte des
modifications effectues en mmoire sur ces entits
Il est possible d'viter ce flush avec la mthode
setFlushMode :
em.setFlushMode(FlushMode.COMMIT);
En ce cas, un flush ne sera lancqu'avant un commit
Il est possible de modifier ce mode pour une seule requte
(voir Query)
SIO 110 Olivier Barais
persist
Une entitnouvelle devient une entitgre
Ltat de lentitsera sauvegarddans la BD au
prochain flush ou commit
Aucune instruction ne sera ncessaire pour faire
enregistrer dans la base de donnes les
modifications effectues sur lentitpar
lapplication ; en effet le GE conserve toutes les
informations ncessaires sur les entits quil gre
SIO 111 Olivier Barais
persist(A)
Si A est nouvelle entit, elle devient gre
Si A tait djgre, persist est ignore mais
lopration persist cascade sur les entits associes
si lassociation a lattribut CascadeType.PERSIST
Si A est supprime, elle devient gre
Si A est dtache, une IllegalArgumentException est
lance
Ne peut tre utilisque dans le contexte dune
transaction
SIO 112 Olivier Barais
remove
Une entitgre devient supprime
Les donnes correspondantes seront
supprimes de la BD
SIO 113 Olivier Barais
remove(A)
Ignore si A est nouvelle ou supprime
Si A est nouvelle, lopration cascade sur les
associations qui ont lattribut
CascadeType.REMOVE
Si A est gre, elle devient supprime
Si A est dtache, une IllegalArgumentException est
lance
Ne peut tre utilisque dans le contexte dune
transaction
SIO 114 Olivier Barais
refresh
Le GE peut synchroniser avec la BD une entit
quil gre en rafraichissant son tat en mmoire
avec les donnes actuellement dans la BD
em.refresh(entite);
Les donnes de la BD sont copies dans lentit
Utiliser cette mthode pour sassurer que lentita
les mmes donnes que la BD
Peut tre utile pour les transactions longues
SIO 115 Olivier Barais
refresh(A)
Ignore si A est nouvelle ou supprime
Si A est nouvelle, lopration cascade
sur les associations qui ont lattribut
CascadeType.REFRESH
Si A est dtache, une
IllegalArgumentException est lance
SIO 116 Olivier Barais
find
La recherche est polymorphe : l'entit
rcupre peut tre de la classe passe en
paramtre ou d'une sous-classe
Exemple :
Ar t i cl e p =
em. f i nd( Ar t i cl e. cl ass, 128) ;
peut renvoyer un article de n'importe quelle
sous-classe de Article (Stylo, Ramette,)
SIO 117 Olivier Barais
lock(A)
Le fournisseur de persistance gre les accs
concurrents aux donnes de la BD
reprsentes par les entits avec une
stratgie optimiste
lock permet de modifier la manire de grer
les accs concurrents une entitA
Sera tudiplus loin dans la section sur la
concurrence
SIO 118 Olivier Barais
En dehors dune transaction
Les mthodes suivantes (read only) peuvent tre
lances en dehors dune transaction :
find, getReference, refresh et requtes (query)
Les mthodes persist, remove, merge peuvent
tre excutes en dehors dune transaction mais
elles seront enregistres pour un flush ds quune
transaction est active
Les mthodes flush, lock et modifications de
masse (executeUpdate) ne peuvent tre lances en
dehors dune transaction
SIO 119 Olivier Barais
Entitdtache (1)
Une application distribue sur plusieurs
ordinateurs peut utiliser avec profit des
entits dtaches
Une entitgre par un GE peut tre
dtache de son contexte de persistance
Elle peut ainsi tre transfre en dehors de
la porte du GE
SIO 120 Olivier Barais
Entitdtache (2)
Une entitdtache peut tre modifie
Pour que ces modifications soient
enregistres dans la BD, il est ncessaire de
rattacher lentitun GE par la mthode
merge
SIO 121 Olivier Barais
merge(A)
Si A est une entitdtache, son tat est copi
dans une entitgre A qui a la mme identit
que A (si A nexiste pas dj, il est cr) ; merge
renvoie A
Si A est nouvelle, une nouvelle entitgre A est
cret ltat de A est copidans A
Si A est djgre, merge est ignore mais merge
cascade pour tous les associations avec
lattribut CascadeType.MERGE
Si A est supprime, une
IllegalArgumentException est lance
SIO 122 Olivier Barais
merge(A)
Attention, la mthode merge nattache pas A
Elle retourne une entitgre qui a la mme
identitdans la BD que lentitpasse en
paramtre mais a nest pas le mme objet
SIO 123 Olivier Barais
Requtes - J PQL
SIO 124 Olivier Barais
Chercher par identit
find et getReference (de EntityManager)
permettent de retrouver une entiten
donnant son identitdans la BD
Elles prennent 2 paramtres de type
Class<T> pour indiquer le type de lentit
recherche (le rsultat renvoysera de cette
classe ou d'une sous-classe)
Object pour indiquer la clprimaire
SIO 125 Olivier Barais
getReference
getReference renvoie une rfrence vers
une entit, sans que cette entitne soit
ncessairement initialise
Le plus souvent il vaut mieux utiliser find
SIO 126 Olivier Barais
getReference
getReference peut tre (rarement) utilise pour
amliorer les performances quand une entitnon
initialise peut tre suffisante, sans que lentitentire
soit retrouve dans la base de donnes
Par exemple, pour indiquer une association dont le but
est unique (OneToOneou ManyToOne) :
Depar t ement dept =
em. get Ref er ence( Depar t ement . cl ass, 10) ;
Empl oye emp. set Depar t ement ( dept ) ;
SIO 127 Olivier Barais
tapes pour rcuprer des donnes
Souvent il est ncessaire de rechercher des
donnes sur des critres plus complexes
que la simple identit
Les tapes sont alors les suivantes :
1. Dcrire ce qui est recherch(langage J PQL)
2. Crer une instance de type Query
3. Initialiser la requte (paramtres,
pagination)
4. Lancer lexcution de la requte
SIO 128 Olivier Barais
Langage J PQL
Le langage J PQL (Java Persistence Query
Language) permet de dcrire ce que
lapplication recherche
Il ressemble beaucoup SQL
SIO 129 Olivier Barais
Requtes sur les entits objet
Les requtes travaillent avec le modle
objet et pas avec le modle relationnel
Les identificateurs dsignent les classes et
leurs proprits et pas les tables et leurs
colonnes
Les seules classes qui peuvent tre
explicitement dsignes dans une requte
(clause from) sont les entits
SIO 130 Olivier Barais
Alias
Le texte des requtes utilise beaucoup les
alias de classe
Les proprits des classes doivent tre
prfixes par les alias
Une erreur frquente du dbutant est
doublier les alias en prfixe
SIO 131 Olivier Barais
Type du rsultat
Un select peut renvoyer
une (ou plusieurs) expression entit, par
exemple un employ
une (ou plusieurs) expression valeur , par
exemple le nom et le salaire dun employ
SIO 132 Olivier Barais
Exemples de requtes
sel ect e f r omEmpl oye as e
sel ect e. nom, e. sal ai r e f r omEmpl oye e
sel ect e f r omEmpl oye e wher e
e. depar t ement . nom= Di r ect i on
sel ect d. nom, avg( e. sal ai r e) f r om
Depar t ement d j oi n d. empl oyes e
gr oup by d. nomhavi ng count ( d. nom) >
5
SIO 133 Olivier Barais
Nombre dlments du rsultat
Pour le cas oune seule valeur ou entitest
renvoye, le plus simple est dutiliser la
mthode getSingleResult() ; elle renvoie un
Object
SIO 134 Olivier Barais
Nombre dlments du rsultat
Pour le cas oune plusieurs valeurs ou entits
peuvent tre renvoyes, il faut utiliser la mthode
getResultList()
Elle renvoie une liste raw(pas gnrique) des
rsultats, instance de java.util.List
Un message davertissement sera affichdurant la
compilation si le rsultat est rangdans une liste
gnrique (Liste<Employe> par exemple)
SIO 135 Olivier Barais
Type du rsultat
Le type des lments de la liste est Object si la clause
select ne comporte quune seule expression, ou
Object[] si elle comporte plusieurs expressions
Exemple :
t ext e = " sel ect e. nom, e. sal ai r e f r om
Empl oye as e" ;
quer y = em. cr eat eQuer y( t ext e) ;
Li st <Obj ect [ ] > l i st e =
( Li st <Obj ect [ ] >) quer y. get Resul t Li st ( ) ;
f or ( Obj ect [ ] i nf o : l i st e) {
Syst em. out . pr i nt l n( i nf o[ 0] + " gagne
" + i nf o[ 1] ) ;
}
SIO 136 Olivier Barais
Navigation
Il est possible de suivre les associations dans
les requtes avec la notation pointe (la OCL)
Par exemple, la requte suivante donne les
noms des employs qui travaillent dans le
dpartement qualit:
sel ect e. nomf r omEmpl oye as e wher e
e. depar t ement . nom= ' Qual i t '
SIO 137 Olivier Barais
Interface Query
Reprsente une requte
Une instance de Query est obtenue par les
mthodes createQuery, createNativeQuery
ou createNamedQuery de linterface
EntityManager
SIO 138 Olivier Barais
Mthodes de Query (1)
Li st get Resul t Li st ( )
Obj ect get Si ngl eResul t ( )
i nt execut eUpdat e( )
Quer y set MaxResul t s( i nt nbResul t at s)
Quer y set Fi r st Resul t ( i nt
posi t i onDepar t )
Quer y set Fl ushMode( Fl ushModeType
modeFl ush)
SIO 139 Olivier Barais
Mthodes de Query (2)
Quer y set Par amet er ( St r i ng nom,
Obj ect val eur )
Quer y set Par amet er ( St r i ng nom, Dat e
val eur , Tempor al Type t ypeTempor el )
Quer y set Par amet er ( St r i ng nom,
Cal endar val eur , Tempor al Type
t ypeTempor el )
SIO 140 Olivier Barais
Types temporels
On a vu que les 2 types java temporels du
paquetage java.util (Date et Calendar)
ncessitent une annotation @Temporal
Ils ncessitent aussi un paramtre
supplmentaire pour la mthode
setParameter
SIO 141 Olivier Barais
Exemple
@Tempor al ( Tempor al Type. DATE)
pr i vat e Cal endar dat eEmb;
em. cr eat eQuer y(
"sel ect e f r omempl oye e"
+ " wher e e. dat eEmb bet ween ?1 and ?2")
. set Par amet er ( 1, debut ,
Tempor al Type. DATE)
. set Par amet er ( 2, f i n,
Tempor al Type. DATE)
. get Resul t Li st ( ) ;
SIO 142 Olivier Barais
Types de requte
Requtes dynamiques dont le texte est donne en
paramtre de createQuery
Requtes natives particulires un SGBD (pas
portables) ; requte SQL (pas J PQL) avec tables et
colonnes (pas classes et proprits)
Requtes nommes dont le texte est donne dans
une annotation de la classe concerne et dont le
nom est passen paramtre de
createNamedQuery ; une requte nomme peut
tre dynamique ou native
SIO 143 Olivier Barais
Paramtres des requtes
Un paramtre peut tre dsignpar son numro
(?n) ou par son nom (:nom)
Les valeurs des paramtres sont donnes par les
mthodes setParameter
Les paramtres sont numrots partir de 1
Un paramtre peut tre utilisplus dune fois dans
une requte
Lusage des paramtres nomms est recommand
(plus lisible)
SIO 144 Olivier Barais
Exemples
Quer y quer y = em. cr eat eQuer y( "sel ect
e f r omEmpl oye as e wher e e. nom=
?1") ;
quer y. set Par amet er ( 1, " Dupond" ) ;
Quer y quer y = em. cr eat eQuer y( "sel ect
e f r omEmpl oye as e wher e e. nom=
: nom") ;
quer y. set Par amet er ( "nom", "Dupond") ;
SIO 145 Olivier Barais
Mode de flush
Normalement (mode FlushMode.AUTO) un flush des
entits concernes par une requte est effectuavant la
requte pour que le rsultat tienne compte des
modifications effectues en mmoire sur ces entits
Pour une requte il est possible d'viter ce flush avec la
mthode setFlushMode :
quer y. set Fl ushMode( Fl ushMode. COMMI T) ;
SIO 146 Olivier Barais
J PQL in a nutshell
SIO 147 Olivier Barais
Clauses dun select
select : type des objets ou valeurs renvoyes
from: oles donnes sont rcupres
where : slectionne les donnes
group by : regroupe des donnes
having : slectionne les groupes (ne peutexister
sans clause group by)
order by : ordonne les donnes
Les mots-cls select, from, distinct, join,sont
insensibles la casse
SIO 148 Olivier Barais
Polymorphisme dans les requtes
Toutes les requtes sont polymorphes : un
nom de classe dans la clause fromdsigne
cette classe et toutes les sous-classes
Exemple :
sel ect count ( a) f r omAr t i cl e as a
compte le nombre dinstances de la classe
Article et de tous les sous-classes de
Article
SIO 149 Olivier Barais
Expression de chemin
Les requtes peuvent contenir des expressions
de chemin pour naviguer entre les entits
Une navigation doit correspondre une
association dclare du modle objet (les
annotations @OneToOne, @OneToMany, )
SIO 150 Olivier Barais
Exemple
Si e est un alias pour Employe,
e.departement dsigne le dpartement dun
employ
e.projets dsigne la collection de projets
auxquels participe un employ
SIO 151 Olivier Barais
Rgles pour les expressions de chemin
Une navigation peut tre chane une
navigation prcdente la condition que la
navigation prcdente ne donne quune
seule entit(OneToOne ou ManyToOne)
SIO 152 Olivier Barais
Exemples
e.departement.nom dsigne le nom du
dpartement dun employ
e.projets.nom est interdit car e.projets
est une collection
Pour avoir les noms des projets auxquels
participent les employs, il faut utiliser une
jointure pour partir dun alias pour Projet :
p.nom
SIO 153 Olivier Barais
distinct
Dans une clause select, indique que les
valeurs dupliques sont limines (la
requte ne garde quune seule des valeurs
gales)
Exemple :
sel ect di st i nct e. depar t ement
f r omEmpl oye e
SIO 154 Olivier Barais
new
Il est possible de renvoyer des instances dune
classe dont le constructeur prend en paramtre des
informations rcupres dans la base de donnes
La classe doit tre dsigne par son nom complet
(avec le nom du paquetage)
Exemple :
sel ect new p1. p2. Cl asse( e. nom,
e. sal ai r e) f r omEmpl oye e
SIO 155 Olivier Barais
Clauses where et having
Ces clauses peuvent comporter les mots-
cls suivants :
[NOT] LIKE, [NOT] BETWEEN, [NOT] IN
AND, OR, NOT
[NOT] EXISTS
ALL, SOME/ANY
IS [NOT] EMPTY, [NOT] MEMBER OF
SIO 156 Olivier Barais
Exemple
sel ect d. nom, avg( e. sal ai r e)
f r omDepar t ement d j oi n
d. empl oyes e
gr oup by d. nom
havi ng count ( d. nom) > 3
SIO 157 Olivier Barais
having
Restriction : la condition doit porter sur
lexpression de regroupement ou sur une fonction
de regroupement portant sur lexpression de
regroupement
Par exemple, la requte suivante provoque une
exception :
sel ect d. nom, avg( e. sal ai r e)
f r omDepar t ement d j oi n d. empl oyes e
gr oup by d. nom
havi ng avg( e. sal ai r e) > 1000
SIO 158 Olivier Barais
Sous-requte (1)
Les clauses where et having peuvent contenir
des sous-requtes
Exemple :
sel ect e f r omEmpl oye e
wher e e. sal ai r e >= (
sel ect e2. sal ai r e f r omEmpl oye e2
wher e e2. depar t ement = 10)
SIO 159 Olivier Barais
Sous-requte (2)
{ALL | ANY | SOME} (sous-requte) fonctionne
comme dans SQL
Exemple :
sel ect e f r omEmpl oye e
wher e e. sal ai r e >= ALL (
sel ect e2. sal ai r e f r omEmpl oye e2
wher e e2. depar t ement =
e. depar t ement )
SIO 160 Olivier Barais
Sous-requte synchronise
Une sous-requte peut tre synchronise avec une
requte englobante
Exemple :
sel ect e f r omEmpl oye e
wher e e. sal ai r e >= ALL (
sel ect e2. sal ai r e f r omEmpl oye e2
wher e e2. depar t ement =
e. depar t ement )
SIO 161 Olivier Barais
Sous-requte - exists
[not]exists fonctionne comme avec SQL
Exemple :
sel ect emp f r omEmpl oye e
wher e exi st s (
sel ect ee f r omEmpl oye ee
wher e ee = e. epouse)
SIO 162 Olivier Barais
J ointure
Une jointure permet de combiner plusieurs entits
dans un select
Il existe plusieurs types de jointures :
jointure interne (jointure standard join)
jointure externe (outer join)
jointure avec rcupration de donnes en mmoire (join
fetch)
Il est aussi possible dutiliser plusieurs entits
dans une requte grce la navigation
SIO 163 Olivier Barais
Exemples
sel ect p. nomf r omEmpl oye e j oi n
e. pr oj et s p
sel ect e. depar t ement . nomf r omEmpl oye e
sel ect p. nomf r omEmpl oye e j oi n
e. par t i ci pat i ons par t j oi n pr oj et s p
sel ect d. nomf r omEmpl oye e,
Depar t ement d wher e d = e. depar t ement
SIO 164 Olivier Barais
J ointure de plusieurs entits
On ne peut joindre plus de 2 entits en donnant un
chemin incluant plus de 2 .
La requte suivante provoquera une exception :
sel ect sel ect e, p f r omEmpl oye e j oi n
e. par t i ci pat i ons. pr oj et p
La requte correcte :
sel ect sel ect e, p f r omEmpl oye e j oi n
e. par t i ci pat i ons par t s j oi n
par t s. pr oj et p
SIO 165 Olivier Barais
J ointure externe
sel ect e, d f r omEmpl oye e l ef t
j oi n e. depar t ement d
affichera aussi les employs qui ne sont pas
associs un dpartement
SIO 166 Olivier Barais
join fetch
Permet dviter le problme des N + 1 selects
Lentitplacdroite de fetch join sera rcupre
en mme temps que lentitde la clause select
Le select SQL gnrsera une jointure externe qui
rcuprera les donnes de toutes les entits
associes en mme temps que les donnes des
entits principales de la requte
SIO 167 Olivier Barais
Exemple
sel ect e f r omEmpl oye e j oi n
f et ch e. depar t ement
Cette requte rcuprera tous les employs
mais, en plus, lappel de la mthode
getDepartement() ne provoquera aucune
interrogation de la base de donnes puisque
le join fetch aura djchargtous les
dpartements des employs
Lexemple suivant prchargeles collections
de participations aux projets
SIO 168 Olivier Barais
Exemple
St r i ng t ext eQuer y = " sel ect e "
+ " f r omEmpl oye as e "
+ " j oi n f et ch e. par t i ci pat i ons";
Quer y quer y =
em. cr eat eQuer y( t ext eQuer y) ;
l i st eEmpl oyes =
( Li st <Empl oye>) quer y. get Resul t Li st ( ) ;
SIO 169 Olivier Barais
Fonctions
Pour plus dinformations, consultez la
spcification J PA
Fonctions de chanes de caractres : concat,
substring, trim, lower, upper, length, locate
(localiser une sous-chane dans une autre)
Fonctions arithmtiques : abs, sqrt, mod, size
(dune collection)
Fonctions de date : current_date, current_time,
current_timestamp
Fonctions de regroupement : count, max, min, avg
SIO 170 Olivier Barais
Travail avec les collections
Une expression chemin dun select peut dsigner
une collection
Exemples :
depar t ement . empl oyes
f act ur e. l i gnes
La fonction size donne la taille de la collection
La condition is [not] empty est vraie si la
collection est [nest pas] vide
La condition [not] member of indique si une
entitappartient une collection
SIO 171 Olivier Barais
Exemples
sel ect d f r omDepar t ement wher e
e. empl oyes i s empt y
sel ect e f r omEmpl oye e wher e
: pr oj et member of
e. par t i ci pat i ons. pr oj et
SIO 172 Olivier Barais
Parcours dune collection
La requte suivante ne donnera pas tous les
produits lis une facture ; elle provoquera une
exception lexcution
sel ect di st i nct f . l i gnes. pr odui t
f r omFact ur e as f
En effet, il est interdit de composer une expression
de chemin en partant dune expression qui dsigne
une collection (f.lignes)
SIO 173 Olivier Barais
Parcours dune collection
Solution : utiliser un join dans le fromavec un alias (
l dans lexemple ci-dessous) pour dsigner un
lment qui parcourt la collection :
sel ect di st i nct l . pr odui t f r om
Fact ur e as f j oi n f . l i gnes as l
Lautre solution, in , une ancienne syntaxe hrite
dEJ B 2, nest pas recommande
SIO 174 Olivier Barais
Enchanement des mthodes
Les mthodes setParameter, setMaxResults renvoient
le Query modifi
On peut donc les enchaner
Exemple :
em. cr eat eQuer y( t ext eQuer y)
. set Par amet er ( nomPar am, val eur Par am)
. set MaxResul t s( 30)
. get Resul t Li st ( ) ;
SIO 175 Olivier Barais
Pagination du rsultat
Query setMaxResults(int n) : indique le
nombre maximum de rsultats retrouver
Query setFirstResult(int n) : indique la
position du 1er rsultat retrouver
(numrotpartir de 0)
SIO 176 Olivier Barais
Merci pour votre attention

Vous aimerez peut-être aussi