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 ...
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 !" rPeolanttiostnannedlaerndSdQeLbasniveaupourcommuniqueravecunSGBD; Compétenc e pourlepireepraercdoennnuoemebnreeunxtrdépvriesleo,pputeiluisrséJpaovuar;lemeilleuret(ADmAélOi)o;rationpossibleenutilisantlepatternDataAccessObject 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 lè 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'taidoanpeanttiroendoebujxepopulationsdontl'expertiésves'exprimedansdetuxdomaines distincts : le d eloppement objet e l'administration des bases de données relationnelles. aDdéamnisnidsetrsagtreaunrsdie(fsfDéoBrreAg)natasnipsapauatxirotipnersin,onrdieténévtseàldoidfpfepésereunrsteest;d partements d Taille du code : Une étude (R.B. Webber) indique aqcopéudpeleilc'taaroctiitscfaeèlvssa.da'riLuuenxsetedonacotprkneapnlgéidcteeesassteietrocseentàpinlrdmtaéaaesirnnenestnectlsqheeueesrjetcusldyhsaqesetstuè'adài'mmlulie4enll0isod%rdubsjeecdsdtouedeentrep 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 iè u t rc r e e d q 'er a r l e it u é r f : réL'qéucrentes(maisnnéoensmesotinsclapsesixques); Peu réutilisable : Une solution maison est rarement ns de l'entre Chtréinventelaroueetentraînepdriesse.ddaééppvpaleeqilcnuoasepbeplspeerionmajuueetxnilteasu,trrleesdtoeansptd;palinctaetisopourlaconception,leet 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): dSteanodmarpdoJs2aEnEtbpeoaurnl'da'ednatpittéat;ionobjet-relationnelsouslaformec pDi'laotuétrpesartympeesssdaegec)o;mposantsexistent(Beansession,bean Expertise reconnue, utilisée par de nombreux professionnels; Succès dû en partie au marketing de Sun; NMéaccersosmiteeduian)coountgernateuuirt(dJ'EOJnBA,Sc,oJû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éutiliseqnuteJlDesBCdépvoeulorplepepuirres;découragéspcette
Hibernate Core Caractéristiques : O da tatio (LuGtiPlLd)';apnobjet-relationnelJavalibreetopen-source Utilisé dans le serveur d'application JBoss; cMoomdèploesidtieonp,rougtirliasmatimatidoenl'oAbPjeItd:ehcéorlilteacgtieo,npJolayvma;orphisme,on our les cGorlalencutliaornitséeftinlees:obpjreotpsodséepuennedavnatris;étéd'adaptationp Aucune manipulation du byte code; Varacrihaitbeilcittéurde'édcehcelalceh:bàondneeusxpneivrformancesenutilisantunee eaux, possibilité d'utiliser un cluster; Langage de requêtes; Support pour les transactions dites "applicatives" : Hibernate offre et uutnilissuepupnorstypstoèumrleesdecovnetreroxtuesoptrtiamnissatcet;ionnelsdelongueduréehttp://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 dutilisation
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éticohnanrgelemHiebnetrndaetel'doeutpiluids'asdoaurpctaetforgeobjet-http://www.hibernate.org/ Décompression des archives; classe our la cMoomdipfiilcaattiioonnedtul'ecxhéecmuitniodne:ajouteprlesarchivesde 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 !!! Ilfaut 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 pprriivvaatteeBSiedt__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; } }
Detachment Retrieve an AuctionItem and create a new persistent Bid Session session = sf.openSession(); Transactiontx=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(); Transactiontx=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; }
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; }