La lecture en ligne est gratuite
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres
Télécharger Lire

cours-ORM-08

De
20 pages
Cedric Dumoulin - master 2 IPINT Cedric Dumoulin - master 2 IPINTTA1 – O-R Mapping - Hibernate TA1 – O-R Mapping - HibernateCedric Dumoulin - master 2 IPINTTA1 – O-R Mapping - Hibernate TA1 – O-R Mapping - HibernateDESS IPINT - 2004/2005 - Cours TA1 Mardi 26 octobre 2004PlanSolutions pour le niveau de • Le niveau de persistance;• Les solutions de niveau de persistance;persistance• Développement avec hibernate;Introduction à Hibernate• Langage de requêtes;Cedric Dumoulin / Gautier KoscielnyModule Technologies AvancéesDESS IPINT – 2004/2005Cedric.dumoulin@lifl.fr3Solutions maison pour le niveau de Le niveau de persistance persistance• Coût élevé du développement de la gestion de la persistance des données; • Sérialisation Java "Do it yourself !"– Moyen peu coûteux de rendre persistant une instance de classe • À l'exécution, les opérations d'accès au niveau de Java;persistance sont les plus coûteuses en terme de – Dépend de la version de la classe et du compilateur Java;performance; – Non accessible à distance, non portable;• Problématique actuelle : – Pas de niveau transactionnel, pas de niveau d'intégrité.– Le développement objet domine aujourd'hui en entreprise; • JDBC (Java Database Connectivity) "Do it yourself !"– La majeure partie des données critiques pour l'activité d'une – Pont standard de bas niveau pour communiquer avec un SGBD relationnel en SQL;organisation est entreposée dans des systèmes de gestion de bases de données relationnelles ...
Voir plus Voir moins
Solutions pour le niveau de persistance Introduction à Hibernate Cedric Dumoulin / Gautier Koscielny Module Technologies Avancées DESS IPINT  2004/2005
Cedric.dumoulin @lifl.fr
Le niveau de persistance Coût élevé du développement de la gestion de la persistance des données; À l'exécution, les opérations d'accès au niveau de persistance sont les plus coûteuses en terme de performance; Problématique actuelle : Le développement objet domine aujourd'hui en entreprise; La majeure partie des données critiques pour l'activité d'une organisation est entreposée dans des systèmes de gestion de bases de données relationnelles (SGBD/RDMBS); Pour combler ce vide, il est primordial d'utiliser des outils de gestion de la persistance qui offre une adaptation objet-relationnel (O-R mapping) et qui génère le code pour les objets du domaine de l'application ;
4
Plan Le niveau de persistance; Les solutions de niveau de persistance; Développement avec hibernate; Langage de requêtes;
3
Solutions maison pour le niveau de persistance Sérialisation Java "Do it yourself !"  Moyen peu coûteux de rendre persistant une instance de classe Java; Dépend de la version de la classe et du compilateur Java; Non accessible à distance, non portable; Pas de niveau transactionnel, pas de niveau d'intégrité. JDBC (Java Database Connectivity) "Do it yourself !" rPeolantti ostnannedl aernd  SdQe Lbas niveau pour communiquer avec un SGBD ; Compétenc e pour le pire ep raer cdoen nnuoem ebnr eeunxt rdépvriesleo,p puteiluisrsé  Jpaovuar; le meilleur et (ADmAélOi)o;ration possible en utilisant le pattern Data Access Object Trop coûteux en temps de développement; codes et objets difficiles à maintenir. 5
Inconvénients des solutions maison
t t-r P e r la o t b io nn m e e l  n o é r c g e a ss n i i t s e a u ti n o e n c n o e o l p : érLa'taidoanp eanttiroen  doebujxe populations dont l'expertiésve s'exprime dans detu x domaines distincts : le d eloppement objet e l'administration des bases de données relationnelles. aDdéamnis nidsetrs agtreaunrsd ie(fsfD éoBrreAg)na tasn ipsapauatxir otipnersin,o nrdieténévts e àld oidfpfepéser eunrst eest; d partements d Taille du code : Une étude (R.B. Webber) indique aqcopéudpel eilc' taaroctiitscfa eèlvss  a.d a'riLuuenx s eted onacotprkneapn lgéidcteeesa ss te i etroc seentàpi  nlrdmtaéaae sirnnenestne  ctlsqhee ue esrj etcu s ldyhsaqese t stuè' adài'mmlu lie4enll  0iso d%rdubs je  ecdsdt ou ed  e entrep es exper n cessaire au e lignes !
Plan
Le niveau de persistance; Les solutions de niveau de persistance; Développement avec hibernate 2.1.6; Langage de requêtes;
6
8
Inconvénients des solutions maison
u iture de code pour sauver l'état des objets dans une base de don com l e et s P o u t rc r e e   d q 'er a r l e it u é r  f : réL'qéucrentes (mais nnéoens  mesotins clapsesixques); Peu réutilisable : Une solution maison est rarement ns de l'entre Cht  réinvente la roue et entraînep driesse . ddaééppvpaleeqilcnuoasepbe plspe eri onmajuueetxnil teasu,t rrlee sdt oeansptd;p alinctaetiso pour la conception, le et e Cloisonnement des informations : Il arrive qu'une solution maison crée des "silos" de données dans une organisation entravant la libre circulation des informations entre les départements et les unités fonctionnelles;
Les outils de persistance
7
Une solution idéale pour l'accès aux données libère les développeurs d'écrire du code bas niveau et permet de décrire des modèles d'objets complexes tout en conservant de bonnes performances et une variabilité d'échelle. Comment ? En simplifiant la conception du modèle de données et l'adaptation objet-relationnel avec des outils automatiques; En générant un niveau de persistance de grande qualité, flexible qui réduit les coûts liés au test et au débogage; En intégrant le code généré avec un système de gestion de cache pour assurer de bonnes performances et une intégrité des données sans programmation additionnelle. 9
Solutions pour le niveau de persistance (EJB 2) EJB 2 (Enterprise Java Bean): dSteanodmarpdo Js2aEnEt  bpeoaurn l'da'ednatpittéat;ion objet-relationnelsous la forme c pDi'laotuét rpesa rt ympeesss daeg ec)o;mposants existent (Beansession, bean Expertise reconnue, utilisée par de nombreux professionnels; Succès dû en partie au marketing de Sun; NMéaccersosmitee duian)  cooun tgernateuuirt  (dJ'EOJnBA, Sc,o JûBteosusx) ;(Websphere, Weblogic, Nécessite des descripteurs de déploiement propriétaires; Déception en ce qui concerne les performances et le support technique (heureusement, ce n'est pas le cas de JOnAS); Demande un temps d'apprentissage non négligeable de la spécification J2EE avant de développer; Ce qui explique ar complexité utilis eqnute  JlDesB Cd épvoeulor plep epuirres; découragésp cette 
Hibernate Core Caractéristiques :  O da tatio (LuGtiPl Ld)';apn objet-relationnelJava libre et open-source Utilisé dans le serveur d'application JBoss; cMoomdèploes idtieo np,r ougtirliasmatimatidoen  l'oAbPjeIt d:e  hcéorlilteacgtieo, np Jolayvma;o rphisme, on  our les cGorlalencutliaornitsé  efti nlee s: obpjreotpso dsée puenned avnatris;é té d'adaptationp Aucune manipulation du byte code; Varacrihaitbeilcittéu rde' édceh celalceh:bàondneeusx  pneivrformances en utilisant une e eaux, possibilité d'utiliser un cluster; Langage de requêtes; Support pour les transactions dites "applicatives" : Hibernate offre et uutnil issue pupno rsty pstoèumr lee sd ec ovnetreroxtue so ptrtiamnissatcet;ionnels de longue durée http://hibernate.bluemars.net/4.html
10
12
Solutions pour le niveau de persistance (EJB 3 - JPA)  Java Persistance Api ( JPA )  Standard Java pour la persistance Plusieurs implémentations existent Prend le meilleur des solutions passées:  EJB 2, hibernate, ORM Utilise les annotations Java <5 Simple dutilisation
Hibernate Annotations Implément i ation n  c de e   i Java Pers sta HibernateCoreAp ( JPA ) au dessus de Requiert Java 5 Fonctionne aussi avec EJB 3  Livré avec le serveur JBoss EJB 3.0 Standard actuel
11
13
Plan Le niveau de persistance; Les solutions de niveau de persistance; Développement avec hibernate core 3.4; Langage de requêtes;
Installation de Hibernate Core ion rTeéllaéticohnanrgelemHiebnetr ndaet e l'doeutpilu ids' asdoaurpctaetforgeobjet-http://www.hibernate.org/ Décompression des archives; classe our la cMoomdipfiilcaattiioonn  edt ul 'ecxhéecmuitni odne :  ajout epr les archives de hibernate-3.x/lib qui sont nécessaires; Configuration de hibernate  via un fichier de propriétés "hibernate.properties" (old)  ou "hibernate.cfg.xml" à placer dans le chemin de classes.
14
16
Hibernate Core Fournit un mapping Objet / BD Relationnel Ne fournit pas la base de données !!!  Il faut installer une BD et configurer Hibernate Prend en charge les accès à la base Masque les requêtes SQL Fournit un mapping standard des objets vers les tables de la base Mais reste paramétrable
Fichier de configuration Hibernate hibernate.cfg.xml <?xml version='1.0' encoding='utf- 8 ' ? > <!DOCTYPE hibernate -configuration PUBLIC "-//Hibernate/ Hibernate Configuration DTD 3.0//EN" "http:// hibernate.sourceforge.net/hibernate-configuration -3.0.dtd"> <hibernate-configuration> <session -factory> <!-- Database connection settings -- > <property name= "connection.driver_class" >org.hsqldb.jdbcDriver< /property > <property name= "connection.url" >jdbc : hsqldb :data/tutorial</property> <property name= "connection.username">sa</property > <property name= "connection.password "></ property> <!-- JDBC connection pool (use the built- in ) -- > <property name= "connection.pool_size">1</ property > <!-- SQL dialect -- > <property name= "dialect" >org.hibernate.dialect.HSQLDialect </property > <!-- Echo all executed SQL to stdout -- > <property name= "show_sql ">true </ property> <!-- Drop and r e-create the database schema on startup - -> <!--property name ="hbm2ddl.auto">create< /property-- > <mapping resource= "Event.hbm.xml"/> <mapping resource= "Person.hbm.xml"/> </session-factory > </hibernate-configuration >
15
18
Exemple Hibernate
Persistent Class Default public class Aucti { onItem constructor private Long id; _ Get/set pairs pprriivvaattee  BSiedt  __sbuicdcs;essfulBid Collection private String _description; property is an public Long getId() { interface type } return _id; Identifier private void setId(Long id) { id = id;  _ property } public String getDescription() { _ return description; } public void setDescription(String desc) { _ description=desc; } … }
19
21
Auction Object Model
XML Mapping Readable <class name=“AuctionItem” table=“AUCTION_ITEM”> metadata <id name=“id” column=“ITEM_ID”> Column / table <generator class=“native”/> mappings <<p/riod>perty name=description” column=DESCR”/> Surrogate key <many-to-one name=“successfulBid” _ _ generation column=“SUCCESSFUL BID ID”/> strategy <set name=“bids” Collection cascade=all” lazy=true”> metadata <key column=“ITEM ID”/> _ Fetching <one-to-many class=“Bid”/> strategies </set> </class>
20
22
Dirty Checking Retrieve an AuctionItem and change description Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); AuctionItem item =  (AuctionItem) session.get(ActionItem.class, itemId); item.setDescription(newDescription); tx.commit(); session.close();
Detachment Retrieve an AuctionItem and create a new persistent Bid Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); tx.commit(); session.close(); item.setDescription(newDescription); Session session2 = sf.openSession(); Transaction tx = session2.beginTransaction(); session2.update(item); tx.commit(); session2.close();
23
25
Transitive Persistence Retrieve an AuctionItem and create a new persistent Bid Bid bid = new Bid(); bid.setAmount(bidAmount); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); bid.setItem(item); item.getBids().add(bid); tx.commit(); session.close();
Décrire le mapping dans la classe Comment décrire le mapping dans la classe elle-même ? xdoclet  utilise des tags javadoc  old fashion annotations java à préférer
24
30
Avec XDoclet
Spécification de la classe User /** * Cette balise permet d'apparier automatiquement une instance  de la classe "User" à une ligne de la table "Users " *  @hibernate.class table=" Users" * * * Représente un Utilisateur */ public class User { /* aucune balise particulière pour les membres privés de la classe User */ private String userID; private String userName ; private String password; private String emailAddress; private Date lastLogon; private Set contacts; private Set books; private Address address;
31
33
Spécification d'objets persistants tags embarqués Définition d'une classe Java classique; Adjonction de méta-informations embarquées dans les commentaires (identique à javadoc) de ma classe et des méthodes (pas pour les champs); Utilisation de l'outil xdoclet pour convertir ces informations en descripteurs XML de méta-informations hibernate; Ces informations embarquées dans le code sont appelées balises HibernateDoclet; Xdoclet définit différents jeux de balises embarquées pour différents outils; Nous verrons plus tard les balises J2EE. http://xdoclet.sourceforge.net/tags/hibernate-tags.html
Spécification des accesseurs /** * @hibernate.property column="EmailAddress" type="string" * @return String */ public String getEmailAddress () { return emailAddress; } /** * @hibernate.property column="LastLogon" type="date" * @return Date */ public Date getLastLogon() {return lastLogon;} /** * @hibernate.property column="Name" type="string" * @return String */ public String getUserName () {return userName;}
32
34
Cas particulier de la clé primaire /** * Balise "hibernate.id" : * pour définir la clé primaire * attribut de génération de clé "generator-class" obligatoire * valeurs possibles : assigned/native/uuid.hex/uuid.string/ * increment/identity/sequence/hilo/seqhilo/foreign * @hibernate.id generator-class="assigned" type="string" * column="LogonID" * @return String */ public String getUserID() { return userID; }
Associations 1..n /** * @hibernate.set * role="contacts" * table="Contacts" * cascade="all" * readonly="true" * @hibernate.collection-key column ="User_ID" * @hibernate.collection-one-to-many * class="dbdemo.Contact" * @return java.util.Set */ public Set getContacts() { return contacts; }
35
37
Association 1..1 /** * class: nom de la classe associée * cascade: all/none/save-update /delete * constrained: existe-il une contrainte de clé étrangère * foreign-key: nom de la contrainte de clé étrangère  * * @hibernate.one-to-one * class="dbdemo.Address" * @return dbdemo.Address  */ public Address getAddress() { return address; }
Associations n..m /** * @hibernate.set * role="books" * table="Book User Link" _ _ * cascade="all" * readonly="true" * @hibernate.collection-key column ="UserID" * @hibernate.collection-many-to-many * class="dbdemo.Book" * column ="BookID" * @return java.util.Set */ public Set getBooks() { return books; }
36
38
Un pour Un
Permettre à tous d'accéder à la lecture
Pour chaque accès à la bibliothèque, YouScribe donne un accès à une personne dans le besoin