Você está na página 1de 45

JPA

Java Persistence API

Laurent Broto
IRIT/ENSEEIHT

du 7 au 17 F evrier 2012

1 / 45

Copyright (c) 2010 Daniel Hagimont & Laurent Broto. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation ; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

2 / 45

Le mapping Objet/Relationnel
Contexte
Le mod` ele relationnel a fait ses preuves pour stocker des donn ees Le mod` ele objet a fait ses preuves pour programmer

Question
Quel est le lien entre les deux mondes

R eponses
Syst` emes de base de donn ees orient ees objet (O2) : ca na pas

vraiment perc e
Autre approche : mapping objet/relationnel
3 / 45

Le mapping Objet/Relationnel
Une classe correspond ` a une table dans une base de donn ees Une instance de classe correspond ` a un tuple dans une base de

donn ees
Plusieurs probl` emes se posent : les transactions les propri et es objets (h eritage, association, . . . ) objets complexes (image, chiers, . . . ) Un standard : JPA (Java Persistence API) utilisation massive des annotations utilisation de POJO/POJI : on garde la puissance objet
nest pas sans poser de probl` eme (h eritage, association, . . . )

anciennement faisant partie des EJB (de type entity ) Occupe la partie mod` ele du sch ema MVC
4 / 45

Pr esentation de JPA
Une classe = Une table (en premi` ere approche) Une variable de classe = Une colonne de la table sauf les champs transient ou annot e @Transient Mapping des types de classes avec les types disponibles dans la

base de donn ees


probl` eme de portabilit e : JDBC ne sut pas Syntaxe annotation : @Entity et @Id
la cl e primaire

un constructeur vide obligatoire des getters et des setters


instrumentation du code

Une gestionnaire de persistence permet de manipuler les Entity utilis e dans un bean Session (pattern Facade) ou dans un client g er e par le container
5 / 45

Un entity simple
@Entity public class Etudiant { @Id i n t numero ; S t r i n g nom ; } @Stateless public class GestionEtudiant { @PersistenceContext p r i v a t e E n t i t y M a n a g e r em ; p u b l i c v o i d a d d A S t u d e n t ( i n t numero , S t r i n g nom ) E t u d i a n t e=new E t u d i a n t ( ) ; e . numero=numero ; e . nom=nom ; em . p e r s i s t ( e ) ; } }
6 / 45

Dans la base de donn ees


cours=> \d Liste des relations Sch ema | Nom | Type | Propri etaire --------+----------+-------+-------------public | etudiant | table | cours (1 ligne) cours=> \d etudiant Table public.etudiant Colonne | Type | Modificateurs ---------+------------------------+--------------numero | integer | non NULL nom | character varying(255) | Index : "etudiant_pkey" PRIMARY KEY, btree (numero)

7 / 45

La gestion des Entity


Notion dattachement un bean est attach e quand on vient de le r ecup erer ou de le merger jusqua la n de la transaction courante (en premi` ere approche) tant quon reste dans le container dEJB Le contexte de persistance contient lensemble des beans attach es (en premi` ere approche) se comporte comme un cache vis ` a vis de la BD Se manipule gr ace ` a lEntityManager avec ses m ethodes

persist merge refresh ush remove


8 / 45

rends un POJO annot e @Entity persistant r e-attache un bean d etach e met ` a jour un bean ` a partir de la base de donn ees synchronisation forc ee du contexte et de la BD supprime un entity (du contexte et de la BD)

La gestion des Entity


nd createQuery createNativeQuery createNamedQuery M ethodes de Query executeUpdate getResultList getSingleResult setParameter
9 / 45

trouve un bean dans la BD ` a partir par sa PK et le met dans le contexte cr eer une requete EJB-QL cr eer une requete SQL cr eer une requete nomm ee

ex ecute une requ ete update ou delete ex ecute un select et renvoi une List ex ecute un select qui renvoi un seul r esultat assigne un param` etre nomm e

Recherche dun etudiant


@Stateless public class GestionEtudiant { @PersistenceContext p r i v a t e E n t i t y M a n a g e r em ; ... p u b l i c E t u d i a n t findByPK ( i n t numero ) { r e t u r n ( E t u d i a n t )em . f i n d ( E t u d i a n t . c l a s s , numero ) ; } p u b l i c E t u d i a n t findByName ( S t r i n g name ) { r e t u r n ( E t u d i a n t )em . c r e a t e Q u e r y ( s e l e c t e from E t u d i a n t w h e r e e . nom=+name ) . g e t S i n g l e R e s u l t ( ) ; } }

10 / 45

Association entre beans


Comment repr esenter lassociation entre deux classes ? lier un etudiant ` a sa cit eU lier un etudiant ` a des cours 3 possibilit es en fonction des cardinalit es combien de beans peuvent se trouver de chaque c ot e de lassociation 1 etudiant est reli e` a 1 cit eU 1 cit e U est reli ee ` a plusieurs etudiants 1 etudiant est reli e` a plusieurs cours 1 cours est reli e` a plusieurs etudiants On retrouve les cardinalit es UML Annotations d edi ees

11 / 45

Association entre beans


Annotation @OneToOne @OneToMany @ManyToOne @ManyToMany Cardinalit e 1-1 1-* *-1 *-* Annote un(e) Object Collection<T> Object Collection<T>

Strat egie de chargement dune collection ` a la demande ( fetch=FetchType.LAZY ) lors de lacc` es ` a un champs
attention lors du d etachement dun bean !

` a la vol ee ( fetch=FetchType.EAGER ) lors du chargement du bean


peut etre du temps perdu si pas dacc` es au champ

Une Collection peut etre un Set pas de doublons permis une List (ArrayList, . . . ) un seul par bean si la strat egie de chargement est EAGER
12 / 45

Entity associ es simple

@Entity p u b l i c c l a s s CiteU { @Id p u b l i c S t r i n g name ; } @Entity p u b l i c c l a s s Cours { @Id p u b l i c S t r i n g name ; }

13 / 45

Entity associ es simple

@Entity public class Etudiant { @Id i n t numero ; S t r i n g nom ; @ManyToOne CiteU c i t e U ; @ManyToMany L i s t <Cours > c o u r s ; }

14 / 45

Dans la base de donn ees


Liste des relations Sch ema | Nom | Type | Propri etaire --------+----------------+-------+-------------public | citeu | table | cours public | cours | table | cours public | etudiant | table | cours public | etudiant_cours | table | cours Table public.citeu Colonne | Type | Modificateurs ---------+------------------------+--------------name | character varying(255) | non NULL Index : "citeu_pkey" PRIMARY KEY, btree (name) R ef erenc e par : TABLE "etudiant" CONSTRAINT "fkc55d557c559b2832" FOREIGN KEY (citeu_name) REFERENCES citeu(name) Table public.cours Colonne | Type | Modificateurs ---------+------------------------+--------------name | character varying(255) | non NULL Index : "cours_pkey" PRIMARY KEY, btree (name) R ef erenc e par : TABLE "etudiant_cours" CONSTRAINT "fk42cf0ce7e360ffd2" FOREIGN KEY (cours_name) REFERENCES cours(name)

15 / 45

Dans la base de donn ees


Table public.etudiant Colonne | Type | Modificateurs ------------+------------------------+--------------numero | integer | non NULL nom | character varying(255) | citeu_name | character varying(255) | Index : "etudiant_pkey" PRIMARY KEY, btree (numero) Contraintes de cl es e trang` eres : "fkc55d557c559b2832" FOREIGN KEY (citeu_name) REFERENCES citeu(name) R ef erenc e par : TABLE "etudiant_cours" CONSTRAINT "fk42cf0ce7d2b8ee93" FOREIGN KEY (etudiant_numero) REFERENCES etudiant(numero) Table public.etudiant_cours Colonne | Type | Modificateurs -----------------+------------------------+--------------etudiant_numero | integer | non NULL cours_name | character varying(255) | non NULL Contraintes de cl es e trang` eres : "fk42cf0ce7d2b8ee93" FOREIGN KEY (etudiant_numero) REFERENCES etudiant(numero) "fk42cf0ce7e360ffd2" FOREIGN KEY (cours_name) REFERENCES cours(name)

16 / 45

Association entre beans


Navigabilit e explicite param` etre mappedBy
@Entity p u b l i c c l a s s CiteU { @Id p u b l i c S t r i n g name ; @OneToMany ( mappedBy= c i t e U ) p u b l i c L i s t <E t u d i a n t > e t u d i a n t s ; } @Entity p u b l i c c l a s s Cours { @Id p u b l i c S t r i n g name ; @ManyToMany ( mappedBy= c o u r s ) p u b l i c L i s t <E t u d i a n t > e t u d i a n t s ; }
17 / 45

H eritage entre beans


Comment repr esenter lh eritage entre deux classes ? le mod` ele relationnel ne le permet pas de mani` ere directe 3 possibilit es dans la base de donn ees 1. Tout stocker dans une seule table en rajoutant des informations
les tables peuvent devenir tr` es grosses

2. Chaque bean a sa table et les tables se r ef erencent par des jointures


les requ etes sont plus complexes

3. Chaque bean a sa table, les tables ne contiennent que les beans associ es et des informations sont rajout ees aux tables
mix des deux approches pr ec edentes

3 param` etres de lannotation @Inheritance d edi ees 1. strategy=InheritanceType.SINGLE TABLE (strat egie par d efaut) 2. strategy=InheritanceType.JOINED 3. strategy=InhreitanceType.TABLE PER CLASS
18 / 45

H eritage : SINGLE TABLE

@Entity p u b l i c c l a s s Personne { @Id p u b l i c S t r i n g nom ; } @Entity p u b l i c c l a s s Etudiant extends Personne { i n t numero ; }

19 / 45

Dans la base de donn ees


Liste des relations Sch ema | Nom | Type | Propri etaire --------+----------+-------+-------------public | personne | table | cours Table public.personne Colonne | Type | Modificateurs ---------+------------------------+--------------dtype | character varying(31) | non NULL nom | character varying(255) | non NULL numero | integer | Index : "personne_pkey" PRIMARY KEY, btree (nom)

20 / 45

H eritage : JOINED

@ I n h e r i t a n c e ( s t r a t e g y=I n h e r i t a n c e T y p e . JOINED ) @Entity p u b l i c c l a s s Personne { @Id p u b l i c S t r i n g nom ; } @Entity p u b l i c c l a s s Etudiant extends Personne { i n t numero ; }

21 / 45

Dans la base de donn ees


Liste des relations Sch ema | Nom | Type | Propri etaire --------+----------+-------+-------------public | etudiant | table | cours public | personne | table | cours Table public.personne Colonne | Type | Modificateurs ---------+------------------------+--------------nom | character varying(255) | non NULL Index : "personne_pkey" PRIMARY KEY, btree (nom) R ef erenc e par : TABLE "etudiant" CONSTRAINT "fkc55d557c8f70db70" FOREIGN KEY (nom) REFERENCES personne(nom) Table public.etudiant Colonne | Type | Modificateurs ---------+------------------------+--------------numero | integer | non NULL nom | character varying(255) | non NULL Index : "etudiant_pkey" PRIMARY KEY, btree (nom) Contraintes de cl es e trang` eres : "fkc55d557c8f70db70" FOREIGN KEY (nom) REFERENCES personne(nom)

22 / 45

H eritage : TABLE PER CLASS

@ I n h e r i t a n c e ( s t r a t e g y=I n h e r i t a n c e T y p e . TABLE PER CLASS ) @Entity p u b l i c c l a s s Personne { @Id p u b l i c S t r i n g nom ; } @Entity p u b l i c c l a s s Etudiant extends Personne { i n t numero ; }

23 / 45

Dans la base de donn ees


Liste des relations Sch ema | Nom | Type | Propri etaire --------+----------+-------+-------------public | etudiant | table | cours public | personne | table | cours Table public.personne Colonne | Type | Modificateurs ---------+------------------------+--------------nom | character varying(255) | non NULL Index : "personne_pkey" PRIMARY KEY, btree (nom) Table public.etudiant Colonne | Type | Modificateurs ---------+------------------------+--------------nom | character varying(255) | non NULL numero | integer | non NULL Index : "etudiant_pkey" PRIMARY KEY, btree (nom)

24 / 45

Les transactions
Toutes les m ethodes des EJB ou des Entity sont transactionnelles transaction au sens BD (begin,commit,rollback) Commit ees par d efaut sauf en cas dException Les transactions respectent les propri et es ACID Atomicit e
toutes les m ethodes se passent bien, ou aucune ne se fait

Consistance
le contenu de la BD doit etre coh erent ` a lissue de la transaction

Isolation
si deux transactions sont concurrentes, leur modication leur sont

invisibles avant le commit

Durabilit e
une transaction commit ee ne peut etre remise en cause

Probl` eme : gestion des appels de m ethode cascad es


25 / 45

Exemple
@Stateless p u b l i c c l a s s ManipuleCompteBancaire { p u b l i c v o i d v i r e m e n t ( Compte s r c , Compte d s t , i n t montant ) { s r c . d e b i t e ( montant ) ; d s t . c r e d i t e ( montant ) ; log ( transaction terminee ) ; } public void log ( String s t r ) { l o g . addATuple ( s t r ) ; } }

26 / 45

Les transactions
Atomicit e le d ebit et le cr edit doivent tous les deux marcher ou aucun Consistance si une contrainte dit que les compte doivent avoir un montant > 0, ` a lissue de la transaction, le montant doit etre > 0 Isolation si une transaction consulte le montant du compte d ebit e, elle doit voir soit le montant avant le d ebut du virement soit le montant apr` es Durabilit e les nouveaux montants doivent etre enregistr es dans la base de donn ees lors du commit

27 / 45

Les transactions

Probl` eme : si lop eration de log ne se passe pas bien, veut on

r eellement rollbacker la transaction ?


On voudrait pouvoir sp ecier de mani` ere plus ne quelle m ethode

prends part ou non ` a la transaction courante


On voudrait pour sp ecier si le r esultat dune m ethode est

important ou non pour la transaction courante


Deux mani` eres de g erer les transactions manuellement : tout est explicite automatiquement : des annotations permettent de sp ecier la fonction que prendra une m ethode dans une transaction

28 / 45

Les transactions : REQUIRED

@TransactionAttribute(TransactionAttributeType.REQUIRED)

29 / 45

Les transactions : REQUIRES NEW

@TransactionAttribute(TransactionAttributeType.REQUIRES NEW)

30 / 45

Les transactions : SUPPORTS

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

31 / 45

Les transactions : NOT SUPPORTED

@TransactionAttribute(TransactionAttributeType.NOT SUPPORTED)

32 / 45

Les transactions : MANDATORY

@TransactionAttribute(TransactionAttributeType.MANDATORY)

33 / 45

Les transactions : NEVER

@TransactionAttribute(TransactionAttributeType.NEVER)

34 / 45

Exemple
@Stateless p u b l i c c l a s s ManipuleCompteBancaire { p u b l i c v o i d v i r e m e n t ( Compte s r c , Compte d s t , i n t montant ) { s r c . d e b i t e ( montant ) ; d s t . c r e d i t e ( montant ) ; log ( transaction terminee ) ; } @ T r a n s a c t i o n A t t r i b u t e ( T r a n s a c t i o n A t t r i b u t e T y p e . NOT SUPPORTED) public void log ( String s t r ) { l o g . addATuple ( s t r ) ; } }

35 / 45

Les transactions

` grain encore plus n : gestion des transactions manuelles A BMT (Bean Managed Transaction) : API JTA (Java Transaction API) ` laide du gestionnaire de transaction A une instance UserTransaction obtenu par injection de d ependance (@Ressource) begin() commit() rollback() d ebut de transaction validation de la transaction annulation de la transaction

36 / 45

Exemple
@Stateless @ T r a n s a c t i o nM a na ge m en t ( T r a n s a c t i o n M a n a g e m e n t T y p e . BEAN) p u b l i c c l a s s ManipuleCompteBancaire { @Resource p r i v a t e U s e r T r a n s a c t i o n ut ; p u b l i c v o i d v i r e m e n t ( Compte s r c , Compte d s t , i n t montant ) { ut . begin ( ) ; try { s r c . d e b i t e ( montant ) ; d s t . c r e d i t e ( montant ) ; u t . commit ( ) ; } catch ( Exception e ) { ut . r o l l b a c k ( ) ; } finally { log ( transaction terminee ) ; } } public void log ( String s t r ) { l o g . addATuple ( s t r ) ; } } 37 / 45

Les transactions
Niveaux disolation couramment d enis ReadUncommitted
peut lire des modications non valid ees (dirty read)

ReadCommitted
ne peut lire que des modications valid ees

RepeatableRead
Une transaction qui lit plusieurs fois lit la m eme valeur

Serializable
Lectures et ecritures exclusives, le plus restrictif

TRANSACTION READ COMMITTED est ad equate pour la

plupart des applications


TRANSACTION SERIALIZABLE est trop p enalisant

(performances)
38 / 45

Le pattern Facade

Objectif : simplication de linterface des entity pour fournir une

interface simple au client


Association dun EJB Stateless, la Facade, ` a un ou plusieurs Entity Les m ethodes m etiers applicables ` a lentity sont encapsul ees dans

le bean Facade
Limite la bande utilis ee traitements plus rapides Par exemple : s election des Entity dans un ResultSet : gain de performance ajout dun etudiant en passant en param` etre sa cit e U et un tableau de cours : simplication de linterface

39 / 45

JBOSS

40 / 45

Mise en uvre avec JBoss


D enir un chier data-source. Il doit se terminer par -ds.xml ce chier d enit une base de donn ees, user, mot de passe et driver JDBC il doit se trouver dans le r epertoire $JBOSS HOME/server/<server>/deploy La base de donn ees doit etre pr ealablement cr e ee La data source utilis ee pour les EJB est d enie dans le chier

persistence.xml
Plusieurs data-source peuvent etre d enie dans le chier persistence.xml Mettre le driver JDBC dans

$JBOSS HOME/server/<server>/deploy
41 / 45

Exemple de chier data-source


< d a t a s o u r c e s> < l o c a l t x d a t a s o u r c e> < j n d i name> c o u r s</ j n d i name> <c o n n e c t i o n u r l> j d b c : p o s t g r e s q l : // l o c a l h o s t : 5 4 3 2 / c o u r s </ c o n n e c t i o n u r l> < d r i v e r c l a s s> org . p o s t g r e s q l . D r i v e r </ d r i v e r c l a s s> <u s e r name> c o u r s</ u s e r name> <p a s s w o r d> c o u r s</ p a s s w o r d> <c o n n e c t i o n p r o p e r t y name= a u t o R e c o n n e c t > true </ c o n n e c t i o n p r o p e r t y> </ l o c a l t x d a t a s o u r c e> </ d a t a s o u r c e s>

42 / 45

Exemple de chier persistence.xml

<? xml v e r s i o n = 1 . 0 e n c o d i n g=UTF8 ?> < p e r s i s t e n c e x m l n s= h t t p : // j a v a . s u n . com/ xml / n s / p e r s i s t e n c e x m l n s : x s i= h t t p : //www . w3 . o r g /2001/XMLSchemai n s t a n c e x s i : s c h e m a L o c a t i o n= h t t p : // j a v a . s u n . com/ xml / n s / p e r s i s t e n c e h t t p : // j a v a . s u n . com/ xml / n s / p e r s i s t e n c e / p e r s i s t e n c e 1 0 . x s d v e r s i o n = 1 . 0 > < p e r s i s t e n c e u n i t name= c o u r s t r a n s a c t i o n t y p e=JTA> < p r o v i d e r>o r g . h i b e r n a t e . e j b . H i b e r n a t e P e r s i s t e n c e</ p r o v i d e r> < j t a data s o u r c e> j a v a : / c o u r s</ j t a data s o u r c e> < p r o p e r t i e s> < p r o p e r t y name= h i b e r n a t e . hbm2ddl . a u t o v a l u e= u p d a t e /> </ p r o p e r t i e s> </ p e r s i s t e n c e u n i t> </ p e r s i s t e n c e>

43 / 45

Packaging
2 m ethodes : avant EJB 3.1 et apr` es Ancienne m ethode (< Java EE 6)
les Servlets, pages HTML et JSP dans un chier WAR les EJB et les entities JPA dans un chier JAR
le chier persistence.xml sera dans le r epertoire META-INF de ce JAR

le tout dans un chier EAR M ethode EJB3.1 tout est dans le chier WAR
le chier persistence.xml sera dans le r epertoire WEB-INF de ce WAR le chier persistence.xml devra contenir la liste des entities JPA ` a

d eployer <class>entity.MyEntity</class> dans la balise persistence-unit

44 / 45

Conclusion
JPA permet dabstraire la base de donn ees Des annotations sont introduites pour d ecrire les liens entre les

beans au sein des POJO


liens horizontaux (relations n-m) liens verticaux (h eritages) Les relations etaient naturellement pr esentes dans le SGBD

relationnel, lh eritage a et e rajout e


aucun nest compl` etement satisfaisant Le requ etage peut se faire maintenant en SQL natif cela introduit des probl` emes de mapping entre les tables et les beans Le packaging a et e simpli e gr ace ` a lutilisation unique du chier

WAR
le programmeur doit sp ecier manuellement les entities pr esents dans ce chier
45 / 45

Você também pode gostar