Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
7 / 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)
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
10 / 45
11 / 45
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 !
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
13 / 45
@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
15 / 45
16 / 45
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
19 / 45
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
22 / 45
@ 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
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
Durabilit e
une transaction commit ee ne peut etre remise en cause
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
28 / 45
@TransactionAttribute(TransactionAttributeType.REQUIRED)
29 / 45
@TransactionAttribute(TransactionAttributeType.REQUIRES NEW)
30 / 45
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
31 / 45
@TransactionAttribute(TransactionAttributeType.NOT SUPPORTED)
32 / 45
@TransactionAttribute(TransactionAttributeType.MANDATORY)
33 / 45
@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
(performances)
38 / 45
Le pattern Facade
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
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
42 / 45
<? 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
44 / 45
Conclusion
JPA permet dabstraire la base de donn ees Des annotations sont introduites pour d ecrire les liens entre les
WAR
le programmeur doit sp ecier manuellement les entities pr esents dans ce chier
45 / 45