Crs orm

635 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
635
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
38
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Crs orm

  1. 1. ´Developpement Web - Object Relational Mapping and Hibernate ´ Developpement Web - Object Relational Mapping and Hibernate Jean-Michel Richer jean-michel.richer@univ-angers.fr http://www.info.univ-angers.fr/pub/richer M1/M2 Informatique 2010-2011 1 / 58
  2. 2. ´Developpement Web - Object Relational Mapping and Hibernate Plan Plan 1 Introduction 2 JOBYME 3 Hibernate 4 Bibliographie 2 / 58
  3. 3. ´Developpement Web - Object Relational Mapping and Hibernate Plan ORM et Hibernate Objectifs • se familiariser avec l’ORM • le mettre en oeuvre sans framework (jobyme) • le mettre en oeuvre en utilisant Hibernate 3 / 58
  4. 4. ´Developpement Web - Object Relational Mapping and Hibernate Introduction Introduction Introduction 4 / 58
  5. 5. ´Developpement Web - Object Relational Mapping and Hibernate Introduction Que’est-ce que l’ORM ? ORM ´ L’ORM ou Object Relational Mapping a pour but d’etablir la correspondance entre ´ • une table de la base de donnees ` • et une classe du modele objet 5 / 58
  6. 6. ´Developpement Web - Object Relational Mapping and Hibernate Introduction Pourquoi l’ORM ? ´ ´ Necessite de l’ORM ` ´ ´ ` • le modele logique des donnees est different du modele de classe ´ ´ ´ • reutilisabilite du code pour effectuer les operation de base : • DAO • CRUD 6 / 58
  7. 7. ´Developpement Web - Object Relational Mapping and Hibernate Introduction Rappel CRUD CRUD ` ensemble des fonctions a implanter dans un BD relationnelle : ´ Operation SQL Create INSERT Read (Retrieve) SELECT Update UPDATE Delete (Destroy) DELETE 7 / 58
  8. 8. ´Developpement Web - Object Relational Mapping and Hibernate Introduction Pourquoi l’ORM ? Comparaison Objet et Relationnel ´ La representation sous forme Relationnelle n’entre pas en ´ correspondance avec la representation Objet ´ • Objet : notions d’heritage et de polymorphisme • Objet : pas d’identifiant (pointeur) ´ ´ • Objet : les relations n:m sont modelisees par des containers 8 / 58
  9. 9. ´Developpement Web - Object Relational Mapping and Hibernate Introduction ORM et Java ORM et Java ´ ´ ` Inconvenients lies a Java • choix important de solutions et outils / API ´ • evolution des API suivant les versions : ´ • difficulte d’apprentissage ´ • difficulte de configuration 9 / 58
  10. 10. ´Developpement Web - Object Relational Mapping and Hibernate Introduction ORM et Java ORM, Java et JDBC la JDBC (Java DataBase Connectivity) a apporte une´ ` ´ standardisation au niveau de l’acces des bases de donnees, mais : ´ ´ • il faut ecrire le code pour realiser le CRUD ´ • et realiser le mapping entre tables et objets 10 / 58
  11. 11. ´Developpement Web - Object Relational Mapping and Hibernate Introduction ORM et Java Solutions existantes • API standard : JDO (Java Data Objects + POJO) • API : Hibernate + POJO • API complexes : EJB Entity Frameworks de persistance : http://fr.wikipedia.org (Hibernate, Cayenne, EJB3, ... 11 / 58
  12. 12. ´Developpement Web - Object Relational Mapping and Hibernate Introduction ORM et Java Comparaison JDO et Hibernate • JDO est un standard et Hibernate une solution Open Source • JDO peut traiter la persistance des BD Objets ou XML (possible depuis Hibernate 3) ˆ • JDO propose un langage de requete JDOQL / HSQL • JDO modifie les POJO alors que ce n’est pas le cas d’Hibernate 12 / 58
  13. 13. ´Developpement Web - Object Relational Mapping and Hibernate Introduction ORM et Java JDO • www.oracle.com • http://db.apache.org/jdo/index.html Hibernate • http://www.hibernate.org/ 13 / 58
  14. 14. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME JOBYME JOBYME 14 / 58
  15. 15. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME JOBYME ´ Definition JOBYME • Java Orm BY ME ´ ´ • tentative de generation automatique de l’ORM (Code Java + CRUD) ´ ´ • lecture de la BD (MySQL) et generation du code correspondant 15 / 58
  16. 16. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Etude de cas Etude de cas ´ ´ On desire modeliser la relation : Client, Commande, Produit (Customer, Command, Product). 16 / 58
  17. 17. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Conventions de nommage ´ Conventions de nommage des entites ´ ` ´ • tout en minuscule, separation par caractere souligne ( ) ˆ ´ • table : meme nom que l’entite (customer) ´ ´ ` • attributs : prefixes par les 2 premiers caracteres de la ` ´ table et caractere souligne (cu ) • toujours un identifiant (cu id) • minimiser la longueur des champs • faire en sorte que leurs noms soient explicites 17 / 58
  18. 18. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Cas de la table commande Cas de la table commande champ ˆ role type index co id identifiant integer PK co date ´ date creation date NX co total price prix total float co cu id identifiant client integer NX 18 / 58
  19. 19. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Conventions de nommage Conventions de nommage des relations n/m ´ ´ • par ordre alphabetique du nom des entites / tables ` ` ` • nom : 4 premieres lettres de la premiere table, 4 premieres lettres ´ ` ´ • prefixe : premieres lettres des entites 19 / 58
  20. 20. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Cas de la relation commande / produit Relation commande / produit : commprod champ ˆ role type index cp id identifiant integer PK cp co id identifiant commande integer NX co pr id identifiant produit integer NX cp qty ´ quantite integer 20 / 58
  21. 21. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME JOBYME ´ Installation de la base de donnees ´ Mettre en place la base de donnees commands.sql sous MySQL : • nom de la base : commands • identifiant de connexion : commuser • mot de passe : commpass 21 / 58
  22. 22. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Mapping Objet / Relationnel Mise en correspondance objet / tuple ´ ´ realisee au travers d’un fichier de description des tables ´ ´ ` ´ nomme mapping.xml place a la racine du projet. On decrit le ´ nom de la table et le nom de la classe associee : • table : nom de la table • class : nom de la classe ´ • prefix : prefixe du nom de table 22 / 58
  23. 23. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Mapping Objet / Relationnel Mise en correspondance relation / attribut ´ on decrit ensuite les relations : • type : type de relation (one-to-one, one-to-many) • attribute : nom de l’attribut ´ • class : nom de la classe associee ´ ` • crud : liste des operations a effectuer (create,retrieve*,update,delete) (*) en cascade 23 / 58
  24. 24. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME DTD du Mapping DTD Mapping Objet / Relationnel 1 <?xml version="1.0" encoding="utf-8" ?> 2 <!ELEMENT mappings (mapping+) > 3 <!ELEMENT mapping (relation*) > 4 <!ATTLIST mapping table CDATA #REQUIRED > 5 <!ATTLIST mapping class CDATA #REQUIRED > 6 <!ATTLIST mapping prefix CDATA #REQUIRED > 7 <!ELEMENT relation EMPTY > 8 <!ATTLIST relation type CDATA #REQUIRED > 9 <!ATTLIST relation attribute CDATA #REQUIRED > 10 <!ATTLIST relation class CDATA #REQUIRED > 11 <!ATTLIST relation crud CDATA #REQUIRED > 12 24 / 58
  25. 25. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Exemple Customer, Command, Product 25 / 58
  26. 26. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Mapping Mapping Objet / Relationnel 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mappings SYSTEM "mappings.dtd"> 3 <mappings> 4 <mapping table="command" class="Command" prefix="co"> 5 <relation type="one-to-one" attribute="customer" class="Customer" 6 crud="retrieve" /> 7 <relation type="one-to-many" attribute="commprods" class="Commprod" 8 crud="create,retrieve*,update,delete" /> 9 </mapping> 10 11 <mapping table="customer" class="Customer" prefix="cu"> 12 <relation type="one-to-many" attribute="commands" class="Command" 13 crud="retrieve" /> 14 </mapping> 15 16 <mapping table="commprod" class="Commprod" prefix="cp"> 17 <relation type="one-to-one" attribute="product" class="Product" 18 crud="retrieve" /> 19 </mapping> 20 21 <mapping table="product" class="Product" prefix="pr" /> 22 </mappings> 23 26 / 58
  27. 27. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME ` ´ ´ ´ Modele objet genere La classe Command 1 public class Command extends PersistentObject 2 implements PersistentInterface { 3 4 protected int id; 5 protected String date; 6 protected int cuId; 7 protected float totalPrice; 8 protected int nbCmdlines; 9 // relational fields 10 protected Customer customer; 11 protected List<Commprod> commprods; 12 } 27 / 58
  28. 28. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME ` ´ ´ ´ Modele objet genere La classe Customer 1 public class Customer extends PersistentObject 2 implements PersistentInterface { 3 4 protected int id; 5 protected String firstName; 6 protected String lastName; 7 protected String email; 8 protected String password; 9 protected int rights; 10 // relational fields 11 protected List<Command> commands; 12 } 28 / 58
  29. 29. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Persistance Mise en place de la persistance 29 / 58
  30. 30. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Persistance Mise en place de la persistance 30 / 58
  31. 31. ´Developpement Web - Object Relational Mapping and Hibernate JOBYME Utilisation de JOBYME Utiliser JOBYME ´ dans le repertoire du projet lancer : ant ´ ´ • compile le generateur ´ ´ ` • genere les classes a partir du fichier de mapping • lance un test sommaire 31 / 58
  32. 32. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Hibernate Hibernate 32 / 58
  33. 33. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Hibernate Hibernate • framework ORM pour Java (BD Relationnelles et Objet) ˆ • requetes pour CRUD (HQL Hibernate Query Language) • utilisation des POJOs (Plain Old Java Objects) • configuration au travers de fichiers XML ou d’annotations ` • tres fortement configurable ` ` • tres difficile a maˆtriser ! ı 33 / 58
  34. 34. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Historique Hibernate ` • 2001 par Gavin King, alternative a EJB2 • 2003 version 2 qui devient un standard incontournable ´ • integration JBOSS (RedHat) • 2010 version 3 : annotations 34 / 58
  35. 35. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate Utilisation des mappings • par convention l’extension est .hbm.xml ´ • on definit un fichier par classe / table ˆ ´ • placer le fichier de mapping dans le meme repertoire que le fichier de classe 35 / 58
  36. 36. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate fichier Mapping NomClasse.hbm.xml • permet de faire le lien entre les champs de la table et ceux de la classe ˆ ´ ´ ´ • doit etre declare dans le repertoire de la classe example Product ´ ´ Product.hbm.xml declare dans com.mysite.model 36 / 58
  37. 37. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ` ´ Modele de declaration 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping 3 PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.commands.model"> 6 7 <class name="Product" table="product"> 8 <id name="id" type="integer" column="pr id"> 9 <generator class="native"/> 10 </id> 11 <property name="label" column="pr label"/> 12 <property name="stock" type="int" column="pr stock"/> 13 <property name="price" type="float" column="pr price"/> 14 </class> 15 16 </hibernate-mapping> 17 37 / 58
  38. 38. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate Structure du mapping 1 <hibernate-mapping package="PackageName"> 2 <class 3 name="ClassName" 4 table="tableName" 5 lazy="true|false" 6 polymorphism="implicit|explicit" 7 where="arbitrary sql where condition" 8 rowid="rowid" 9 subselect="SQL expression" 10 ... 11 > 12 ... 13 </hibernate-mapping> 38 / 58
  39. 39. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate Structure du Mapping • PackageName : nom du package ou se trouve la classe • ClassName : nom de la classe Java ´ • tableName : nom de la table de la base de donnees ` ` ´ ´ • autres parametres a definir selon la base de donnees et l’environnement 39 / 58
  40. 40. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ´ Definition des champs de la table ´ • id : permet de definir l’identifiant de la table • property : champ simple ´ ´ • composite-id : cle composee • timestamp : champ de type date/heure 40 / 58
  41. 41. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate Structure d’un identifiant 1 <id 2 name="propertyName" 3 type="typename" 4 column="column name" 5 unsaved-value="null|any|none|undefined|id value" 6 access="field|property|ClassName"> 7 node="element-name|@attribute-name|element/@attribute|." 8 9 <generator class="generatorClass"/> 10 </id> 11 41 / 58
  42. 42. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ´ Definition d’un identifiant • name : nom du champ de la classe • type : integer, long, float, string, character, timestamp, binary, ... • column : nom du champ dans la table ´ ´ ´ • generator : methode de generation de l’identifiant 42 / 58
  43. 43. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ´ ´ ´ Methode de generation d’un identifiant ´ ´ • assigned : l’utilisateur est responsable de la generation ´ • native : la base de donnees est responsable de la ´ ´ generation 43 / 58
  44. 44. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ´ ´ Structure d’une propriete 1 <property 2 name="propertyName" 3 column="column name" 4 type="typename" 5 update="true|false" 6 insert="true|false" 7 formula="arbitrary SQL expression" 8 access="field|property|ClassName" 9 lazy="true|false" 10 unique="true|false" 11 not-null="true|false" 12 index="index name" 13 unique key="unique key id" 14 length="L" 15 precision="P" 16 scale="S" 17 /> 44 / 58
  45. 45. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Mapping Hibernate ´ ´ ´ Definition d’une propriete • name, type, column ˆ ´ • update, insert : indique que le champ doit etre ajoute lors ´ ` d’une modification ou insertion (defaut a vrai) ´ • formula : expression SQL qui permet de definir le champ ` ´ • lazy : acces aux objets associes 45 / 58
  46. 46. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate ´ Strategies de chargement Fetching ´ • concerne le chargement des objets lies par des relations ` ´ • probleme complexe pour assurer l’efficacite Exemple : chargement d’un client Faut-il charger toutes les commandes lors du chargement du client ? 46 / 58
  47. 47. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate ´ Strategies de chargement Fetching strategies ´ ´ Hibernate definit 4 strategies de chargement • Immediate • Lazy : ne charge pas tout ´ ˆ ´ • Eager : on specifie quels objets doivent etre charges • Batch 47 / 58
  48. 48. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Utiliser Hibernate Utilisation de Hibernate ´ • definir un fichier de configuration ´ ´ • demarrer Hibernate requiert la creation d’une SessionFactory 48 / 58
  49. 49. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Fichier de configuration Fichier de configuration hibernate.cfg.xml ´ ` ` ` ´ • definit les parametres d’acces a la base de donnees ´ • definit ou trouver les fichiers de mapping (ressource) ` ˆ ´ ´ • doit etre place dans le repertoire src du projet 49 / 58
  50. 50. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Configuration d’Hibernate Fichier de configuration hibernate.cfg.xml 1 <hibernate-configuration> 2 <session-factory> 3 <!-- Database connection settings --> 4 <property name="connection.driver class">com.mysql.jdbc.Driver< 5 /property> 6 <property name="connection.url">jdbc:mysql://localhost:3306/commands< 7 /property> 8 <property name="connection.username">commuser</property> 9 <property name="connection.password">commpass</property> 10 <!-- JDBC connection pool (use the built-in) --> 11 <property name="connection.pool size">1</property> 12 <!-- SQL dialect --> 13 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 14 <!-- Enable Hibernate’s automatic session context management --> 15 <property name="current session context class">thread</property> 16 <!-- Disable the second-level cache --> 17 <property name="cache.provider class">org.hibernate.cache. 18 NoCacheProvider</property> 19 <!-- Echo all executed SQL to stdout --> 20 <property name="show sql">true</property> 21 <mapping resource="com/mysite/model/command.hbm.xml"/> 22 </session-factory> 23 </hibernate-configuration> 24 25 50 / 58
  51. 51. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate SessionFactory classe HibernateUtil • obtenir une instance de SessionFactory ´ • realise l’initialisation de la connexion 51 / 58
  52. 52. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate HibernateUtil HibernateUtil.java 1 import org.hibernate.SessionFactory; 2 import org.hibernate.cfg.Configuration; 3 import static java.lang.System.err; 4 5 public class HibernateUtil { 6 private static final SessionFactory sessionFactory; 7 static { 8 try { 9 // Create the SessionFactory from hibernate.cfg.xml 10 sessionFactory = new Configuration().configure().buildSessionFactory() 11 ; 12 } catch (Exception ex) { 13 // Make sure you log the exception, as it might be swallowed 14 err.println("Initial SessionFactory creation failed." + ex.getMessage( 15 )); 16 throw new ExceptionInInitializerError(ex.getMessage()); 17 } 18 } 19 20 public static SessionFactory getSessionFactory() { 21 return sessionFactory; 22 } 23 } 52 / 58
  53. 53. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Librairies .jar Librairies Hibernate ´ Mettre dans le repertoire WEB-INF/lib ou lib : • l’ensemble des fichiers de Hibernate lib/required ´ • ajouter egalement slf4j-simple http://www.slf4j.org/ 53 / 58
  54. 54. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate HibernateUtil Application ´ Mettre en place la configuration JAVA pour realiser un test avec Hibernate 54 / 58
  55. 55. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Hibernate et annotations Annotations ` ´ Hibernate integre un mecanisme d’annotation qui permet de remplacer les fichiers de mapping par des commentaires dans le code. L’objectif est de ´ • ne pas separer le code Java du fichier de mapping ` ` • de maniere a configurer Hibernate automatiquement 55 / 58
  56. 56. ´Developpement Web - Object Relational Mapping and Hibernate Hibernate Exemple d’annotations Annotations 1 import org.hibernate.annotations.Index; 2 @Entity 3 @Table(name="ARTIST") 4 @NamedQueries({ 5 @NamesQuery(name="com.oreilly.hh.artistByName", 6 query="from Artist as artist where upper(artist.name)=upper(:name)") 7 }) 8 public class Artist { 9 @Id 10 @Column(name="ARTIST ID") 11 @GeneratedValue(strategy=GenerationType.AUTO) 12 private Integer id; 13 14 @Column(name="NAME",nullable=false,unique=true) 15 @Index(name="ARTIST NAME",columnNames={"NAME"}) 16 private String name; 17 18 @ManyToMany 19 @JoinTable(name="TRACK ARTISTS", 20 joinColumns={@JoinColumn(name="TRACK ID")}, 21 inverseJoinColumns={@JoinColumn(name="ARTIST ID")}) 22 private Set<Track> tracks; 23 24 } 56 / 58
  57. 57. ´Developpement Web - Object Relational Mapping and Hibernate Bibliographie Bibliographie Bibliographie 57 / 58
  58. 58. ´Developpement Web - Object Relational Mapping and Hibernate Bibliographie Bibliographie, sitographie • Hibernate Quickly, Patrick Peak, Nick Heudecker, Manning, 2006 • Hibernate in Action, Christian Bauer, Gavin King, Manning, 2005 • Harnessing Hibernate, James Elliot, Tim O’Brien, Ryan Fowler, O’Reilly, 2008 • www.hibernate.org 58 / 58

×