Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

Embed Size (px)

Citation preview

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    1/90

    Mapping Objet Relationnelavec Hibernate

    M.Youssfi

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    2/90

    Introduction

    :UseridUser=1

    login=root

    pass=root

    email=

    ville=

    :User

    idUser=2

    login=toto

    pass=toto

    email=

    ville=

    :User

    idUser=3

    login=you

    pass=you

    email=ville=

    Users:Collection

    Base de donnes relationnelle

    Applicationoriente objet

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    3/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    4/90

    Introduction

    Hibernate s'occupe du transfert des objetsJava dans les tables de la base de donnes

    En plus, il permet de requter les donnes

    et propose des moyens de les rcuprer. Il peut donc rduire de manire

    significative le temps de dveloppement quiaurait t autrement perdu dans unemanipulation manuelle des donnes viaSQL et JDBC

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    5/90

    But de Hibernate

    Le ut Hi ernate est e i rer e ve oppeur e95 pourcent des tches de programmation lies lapersistance des donnes communes.

    Hibernate assure la portabilit de votre application si

    vous changer de SGBD. Hibernate n'est probablement pas la meilleuresolution pour les applications centres sur lesdonnes qui n'utilisent que les procdures stockespour implmenter la logique mtier dans la base dedonnes,

    Il est le plus utile dans les modles mtier orientsobjets dont la logique mtier est implmente dans lacouche Java dite intermdiaire.

    Hibernate propose au dveloppeur des mthodesdaccs aux bases de donnes plus efficace ce quidevrait rassurer les dveloppeurs.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    6/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    7/90

    Premire Application Prparer le projet:

    Au premier lieu,nous avons besoinde tlchargerHibernate et de

    copier des bichiers.jar dans le rperoirelib de votre projet:

    Pour travailler avecune base dedonnes MySQL,

    nous aurons besoingalement duconnecteur JDBC deMySQL

    Hibernate

    Pilote JDBC MySQL

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    8/90

    Exemple dapplication

    Supposant que nous avonsbesoin de grer laparticipation des personnes des runions.

    Une personne participe plusieurs runions et chaquerunion concerne plusieurspersonnes.

    On va sintresser tout

    dabord au cas dune classe etpar la suite nous reviendronssur le mapping desassociations entre les classes.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    9/90

    Classe Reunionpackage gest;import java.util.Date;public class Reunion {private Long idReunion;private Date dateReunion;

    private String titreReunion;

    public Reunion(){}public Date getDateReunion() {

    return dateReunion;}public void setDateReunion(Date

    dateReunion) {this.dateReunion =dateReunion;

    }

    public Long getIdReunion() {

    return idReunion;

    }

    public void setIdReunion(Long

    idReunion) {this.idReunion = idReunion;

    }

    public String getTitreReunion() {

    return titreReunion;

    }public void setTitreReunion(StringtitreReunion) {

    this.titreReunion = titreReunion;

    }

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    10/90

    Fichier de mapping de la classe Reunion

    La structure basique dun fichier de mappingressemble cel:

    [Contenu]

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    11/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    12/90

    Nom et emplacement du fichier demapping de la classe Reunion

    Pour respecter les rgles de nommage, lefichier est nomm : Reunion.hbm.xml

    Il devrait tre plac au mme endroit de la

    classe Reunion: +lib

    +src

    +gest Reunion.java Reunion.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    13/90

    Configurer Hibernate

    Nous avons maintenant une classepersistante et son fichier de mapping. Il esttemps de configurer Hibernate.

    Avant a, nous avons besoin d'une base dedonnes. Lancer MySQL et crer une base de

    donnes Nomme GEST_REUNIONS .

    La structure de cette base de donnes seracre automatiquement par Hibernate lorsde lexcution de lapplication

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    14/90

    Configurer Hibernate Hibernate est la couche de votre application qui se

    connecte cette base de donnes, donc il a besoin des informations de connexion. Les connexions sont tablies travers un pool de

    connexions JDBC, que nous devons aussi configurer. Pour la configuration d'Hibernate, nous pouvons

    utiliser un simple fichier hibernate.properties, un fichier hibernate.cfg.xml ou mme une configuration complte par

    programmation. La plupart des utilisateurs prfrent le fichier de

    configuration XML

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    15/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    16/90

    Configurer Hibernate : Hibernate.cfg.xml (Suite)

    1

    org.hibernate.dialect.MySQLDialect

    thread

    org.hibernate.cache.NoCacheProvider

    truecreate

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    17/90

    Emplacement du fichier Hibernate.cfg.xml

    Ce fichier doit tre plac dans laracine du classpath.

    Cest--dire dans le rpertoire src +lib

    +src

    Hibernate.cfg.xml +gest

    Reunion.java Reunion.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    18/90

    Application Test Il est temps de charger et de stocker quelques objets

    Reunion, mais d'abord nous devons complter laconfiguration avec du code d'infrastructure.

    Nous devons dmarrer Hibernate. Ce dmarrageinclut la construction d'un objet SessionFactory global

    et le stocker quelque part facile d'accs dans le codede l'application.

    Une SessionFactory peut ouvrir des nouvellesSessions.

    Une Session reprsente une unit de travail laSessionFactory est un objet global instanci une seulefois.

    Nous crerons une classe d'aide HibernateUtil quis'occupe du dmarrage et rend la gestion des Sessionsplus facile. Voici son implmentation :

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    19/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    20/90

    Configurer le systme de logs Nous avons finalement besoin de configurer le systme de

    "logs". Cette opration nest pas obligatoire. Mais elle permet au

    dveloppeur dafficher sur une sortie les messages fournispar Hibernate lors de son excution.

    Ce qui permet de rendre transparente la couche logicielle deHibernate. Hibernate utilise commons-logging et vous laisse le choix

    entre log4j et le systme de logs du JDK 1.4. La plupart des dveloppeurs prfrent log4j copiez log4j.properties de la distribution d'Hibernate (il est

    dans le rpertoire etc/) dans votre rpertoire src. Ce fichier contient une configuration du systme de logs quipeut tre personnalise par lutilisateur.

    L'infrastructure est complte et nous sommes prts effectuer un travail rel avec Hibernate.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    21/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    22/90

    Aprs Excution Les messages suivants saffichent dans la sortie standard

    Hibernate: select max(ID_REUNION) from REUNIONS Hibernate: insert into REUNIONS (DATE_REUNION,

    titreReunion, ID_REUNION) values (?, ?, ?) La structure de la table Reunions serait cre. Et un enregistrement est insr dans la base de donnes.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    23/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    24/90

    Afficher dans la mthode mainpublic static void main(String[] args) {

    ReunionManager gestManager = new ReunionManager(); //gestManager.addReunion("conseil",new Date());

    //gestManager.addReunion("Compte rendue",new Date());//gestManager.addReunion("dlibration",new Date());

    List listR=gestManager.listReunions(); Iterator lesR=listR.iterator();

    while(lesR.hasNext()){Reunion r=(Reunion)lesR.next();System.out.println(r.getIdReunion()+"--"

    +r.getTitreReunion()+"--"+r.getDateReunion());

    }HibernateUtil.getSessionFactory().close();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    25/90

    Mapper les associations

    Nous avons mapp une classe d'uneentit persistante vers une table.

    Partons de l et ajoutons quelquesassociations de classe. D'abord nous ajouterons des

    personnes notre application, et

    stockerons une liste de runionsauxquelles ils participent.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    26/90

    Mapper les associations

    Rappelons le problme : Une Runion concerneplusieurs personnes et une personne peut participer plusieurs runions.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    27/90

    Association Unidirectionnelle basesur un Set

    Si on suppose que dans notre problme, nous auronsbesoin de savoir pour chaque Personne charge, quellessont les diffrentes runions aux quelles il a particip.

    Il est claire que notre association peut tre modliseunidirectionnelle.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    28/90

    Mapper la classe Personne Une personne est caractrise

    par les attributs privs: Son identifiant Son nom

    Son prnom et son age.

    Une collection Set derunions.

    Les autres mthodes sont desaccesseurs et les mutateurs.

    Sans oublier le constructeurpar dfaut.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    29/90

    Personne.java

    package gest;import java.util.*;public class Personne {

    private Long idPersonne;

    private String nomPersonne;private String prenomPersonne;private int age;private Setreunions=new HashSet();.

    // getters and setters.

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    30/90

    Fichier de mapping de la classePersonne : Personne.hbm.xml

    Avant dcrire notre fichier xml de mapping, il estimportant de savoir ce stade, comment serait modlisernotre problme dans une base de donnes relationnelle.

    Nous avons une association plusieurs plusieurs nonporteuse de proprit.

    Le schma de la base de donnes relationnelle serait lesuivant :

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    31/90

    Fichier de mapping de la classePersonne : Personne.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    32/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    33/90

    Mthode pour ajouter une nouvellePersonne

    public void addPersonne(String nom, String prenom,int age) {Session session =

    HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    Personne p = new Personne();p.setNomPersonne(nom);p.setPrenomPeronne(prenom);p.setAge(age);session.save(p);

    session.getTransaction().commit();}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    34/90

    Mthode pour ajouter Une runion une personne

    public void addReunionToPersonne(Long idPersonne, Long idReunion) {Session session =

    HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    // Charger une personnePersonne p = (Personne) session.load(Personne.class, idPersonne);// Charger une runion

    Reunion r = (Reunion) session.load(Reunion.class, idReunion);// Ajouter la runion r la collection reunions de la personne p

    p.getReunions().add(r);

    session.getTransaction().commit();}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    35/90

    Aprs le chargement d'une personne et d'une runion,modifiez simplement la collection en utilisant lesmthodes normales de la collection.

    Ici, nous utilisons la mthode add de la collection SETpour ajouter la runion la collection reunions de

    lobjet personne. Comme vous pouvez le voir, il n'y a pas d'appel

    explicite update() ou save(), Hibernate dtecteautomatiquement que la collection a t modifie et abesoin d'tre mise jour.

    Ceci est appel la vrification sale automatique("automatic dirty checking"),

    Mthode pour ajouter Une runion une personne

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    36/90

    et vous pouvez aussi l'essayer en modifiant le nom oula proprit date de n'importe lequel de vos objets.

    Tant qu'ils sont dans un tatpersistant, c'est--dire,lis une Session Hibernate particulire (c--d qu'ilsont juste t chargs ou sauvegards dans une unit

    de travail), Hibernate surveille les changements etexcute le SQL correspondant. Le processus de synchronisation de l'tat de la

    mmoire avec la base de donnes la fin d'une unitde travail, est appel flushing.

    Dans notre code, l'unit de travail s'achve par uncommit (ou rollback) de la transaction avec la base dedonnes - comme dfini par notre option thread deconfiguration pour la classe CurrentSessionContext.

    Mthode pour ajouter Une runion une personne

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    37/90

    public Personne getPersonne(Long idPersonne) {Session session =

    HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    Personne p = (Personne) session.load(Personne.class,idPersonne);return p;}

    Mthode qui retourne une personnecharge en utilisant son identifiant

    Avec cette mthode, nous allons vrifier que si oncharge une personne, hibernate chargeautomatiquement tous les objets Reunion de cettepersonne dans la collection reunions.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    38/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    39/90

    Tester Notre travail

    2- Afficher toutes les runions

    List listR=gestManager.listReunions();

    Iterator lesR=listR.iterator();

    while(lesR.hasNext()){Reunion r=(Reunion)lesR.next();

    System.out.println(r.getIdReunion()+"--"

    +r.getTitreReunion()+"--"

    +r.getDateReunion()

    );

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    40/90

    Tester Notre travail

    3- Crer des personnes

    gestManager.addPersonne("Jihad","hassan",25);gestManager.addPersonne("mandari","latifa",22);

    gestManager.addPersonne("Talal","yassine",23);

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    41/90

    Tester Notre travail

    4- Ajouter des runions auxpersonnes

    gestManager.addReunionToPersonne(new Long(1),new Long(1));

    gestManager.addReunionToPersonne(new Long(2),new Long(1));

    gestManager.addReunionToPersonne(new Long(3),new Long(1));

    gestManager.addReunionToPersonne(new Long(1),new Long(2));

    gestManager.addReunionToPersonne(new Long(3),new Long(2));

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    42/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    43/90

    Association bidirectionnelle Dans lexemple prcdent, nous avons

    mapp lassociation entre la classe Personneet Reunion dans un seul sens.

    Ce qui nous permet dajouter des runions

    une personne, et en chargeant une personne,on peut connatre toutes les runionsauxquelles a particip cette personne.

    Si nous souhaitons galement crer unerunion et lui ajouter des personne,

    et si nous voulions quune fois quon chargeune runion, on veut connatre toutes lespersonnes qui participent cette runion, Ilfaudrait galement mapper lassociation entreles deux classe dans lautre sens.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    44/90

    Association bidirectionnelle

    Dans ce cas lassociation se traduit par : Cration dune collection dans la classe Personne qui

    permet de stocker les runions. Cette collection a tdj cre dans le cas prcdent. Nous avons appel

    cette collection reunions et elle est de type Set. Cration dune collection dans la classe Reunion qui

    permet dassocier des personnes une runion. Cettecollection est de type Set et sera appele personnes.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    45/90

    Association bidirectionnelle

    Nous allons faire fonctionner l'associationentre une personne et une runion partirdes deux cts en Java.

    Bien sr, le schma de la base de donnesne change pas, nous avons toujours unepluralit many-to-many.

    Une base de donnes relationnelle est plus

    flexible qu'un langage de programmationorient objet, donc elle n'a pas besoin dedirection de navigation

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    46/90

    Association bidirectionnelle

    D'abord, ajouter une collection departicipants la classe Reunion :

    private Set personnes = new HashSet();

    public Set getPersonnes() {return personnes;

    }

    public void setPersonnes(Set personnes)

    {

    this.personnes = personnes;

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    47/90

    Association bidirectionnelle

    Maintenant mapper ce ct del'association aussi, dans

    Reunion.hbm.xml.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    48/90

    Travailler avec des liens bidirectionnels

    Beaucoup de dveloppeurs programment de maniredfensive et crent des mthodes de gestion de lienpour affecter correctement les deux cts, par exempledans Person :

    protected Set getReunions() {

    return reunions;}protected void setReunions(Set reunions)

    { this.reunions = reunions;}public void addReunion(Reunion reunion)

    { this.getReunions().add(reunion);reunion.getPersonnes().add(this);}public void removeReunion(Reunion reunion)

    { this.getReunions().remove(reunion);reunion.getPersonnes().remove(this);

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    49/90

    Association bidirectionnelle de typeone-to-many et many-to-one

    Maintenant, nous allons nous intresser untype dassociation trs frquente qui est un plusieurs dans les deux sens.

    Prenons lexemple dun client qui possdeplusieurs factures et chaque facture appartient un client.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    50/90

    Travailler avec des liens bidirectionnels

    Cette association se traduit par : La cration dune collection dobjets Facture

    dans la classe Client La cration dune rfrence (handle) un

    objet Client dans la classe Facture. Cette manire de modliser notre

    problme nous permet un momentdonn de connatre le client dune

    facture donne et les factures dun clientdonn.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    51/90

    Travailler avec des liens bidirectionnels

    Du cot de la base de donnes, ce genredassociation se traduit par : la cration de deux tables CLIENTS et FACTURES avec dune cl trangre, qui reprsente le client,

    dans la table FACTURES.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    52/90

    Diagramme de classes

    factures

    *1

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    53/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    54/90

    Facture.javapackage mod.fact;import java.util.Date;public class Facture {

    private Long idFacture;private Date dateFacture;

    private double montant;private Client client;public Facture(){}public Client getClient() {

    return client;}

    public void setClient(Client client) {this.client = client;//client.getFactures().add(this);

    }

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    55/90

    Mapper la classe Client

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    56/90

    Mapper la classe Facture

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    57/90

    Ajouter un client

    public void addClient(String nom,String prenom,String societe, String adresse){

    Session session=HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    Client cli=new Client();cli.setNomClient(nom);cli.setPrenomClient(prenom);cli.setSociete(societe);cli.setAdresse(adresse);session.save(cli);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    58/90

    Ajouter une facture

    public void addFacture(Date dateFact,double montant,Long idClient){Session session=HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();Client cli=(Client)session.load(Client.class,idClient);Facture fact=new Facture();fact.setDateFacture(dateFact);fact.setMontant(montant);cli.addFacture(fact);// fact.setClient(cli);session.save(fact);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    59/90

    Association plusieurs plusieursavec des proprits.

    Nous avons dj vu au dbut de ce cours commentmapper une association many to many sans propritConsidrons lexemple suivant : ( Une personneparticipe plusieurs runions et une runion concerneplusieurs personnes)

    Considrons lexemple suivant: Un client peut passer plusieurs commandes. Chaque commande concerne plusieurs produits avec

    une quantit de chaque produit. Chaque produit peut appartenir plusieurs

    commandes. Il est clair que lassociation concerne entre

    Commande et Produit est de type many-to-many avecune proprit quantit pour cette association.

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    60/90

    Association plusieurs plusieursavec des proprits.

    Diagramme de classes

    1 *

    1 *

    * 1

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    61/90

    Association plusieurs plusieursavec des proprits.

    En Modle relationnel, notre problme estmodlis par une base de donnes 4tables :

    CLIENT (ID_CLIENT, NOM_CLIENT, SOCIETE) COMMANDE ( ID_COMMANDE,

    DATE_COMMANDE, #ID_CLIENT) COMPOSANTES (ID_COMPOSANTE,

    #ID_COMMANDE, #ID_PRODUIT,QUANTITE)

    PRODUITS (ID_PRODUIT, DESIGNATION,PRIX, DISPONIBLE, QUANTITE_STOCK)

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    62/90

    Mapping objet relationnel Client.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    63/90

    Mapping objet relationnel Commande.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    64/90

    Mapping objet relationnel Produit.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    65/90

    Ajouter un client

    public void addClient(String nom,String societe){

    Sessionsession=HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();Client cli=new Client();

    cli.setNomClient(nom);

    cli.setSociete(societe);

    session.save(cli);

    session.getTransaction().commit();HibernateUtil.getSessionFactory().close();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    66/90

    Ajouter un produit

    public void addProduit(String des, double prix,boolean dispo, int quantite){Session session=HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    Produit p=new Produit();p.setDesignation(des);p.setQuantite(quantite);p.setDisponible(dispo);p.setPrix(prix);session.save(p);

    session.getTransaction().commit();HibernateUtil.getSessionFactory().close();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    67/90

    Aj d i

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    68/90

    Ajouter un produit unecommande

    ublic void addProduitToCommande(Long idCommande,Long idProduit,intquantite){Session session=HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();Commande comm=(Commande)session.load(Commande.class,idCommande);

    Produit prod=(Produit)session.load(Produit.class,idProduit);Composante compo=new Composante();compo.setQuantite(quantite);compo.setProduit(prod);comm.getLesComposantes().add(compo);session.getTransaction().commit();

    HibernateUtil.getSessionFactory().close();

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    69/90

    Charger une commande

    public Commande chargerCommande(Long idCommande){Session session=HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();

    Commande comm=(Commande)session.load(Commande.class,idCommande);return comm;}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    70/90

    Exemple dapplication web

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    71/90

    Action Form CommandeForm.java:import java.util.Iterator;import org.apache.struts.action.*;import gest.cmd.*;public class CommandeForm extends ActionForm {

    private int idCommande=1;private Commande commande=new Commande();private Client client=new Client();private Iterator lesComposantes;

    public Client getClient() {return client;

    }public Commande getCommande() {

    return commande;}public void setCommande(Commande commande) {

    this.commande = commande;}

    .}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    72/90

    Action CommandeAction.java: Mthode execute:.CommandeForm cf=(CommandeForm)form;Long idC=new Long(cf.getIdCommande());GestCommandes gest=new GestCommandes();Commande comm=gest.chargerCommande(idC);cf.setCommande(comm);cf.setClient(comm.getClient());

    cf.setLesComposantes(comm.getLesComposantes().iterator());return map.findForward("commandes");}}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    73/90

    Struts-config.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    74/90

    Commandes.jspCommandes

    Commandes:

    Numro de commande:

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    75/90

    Commandes.jsp

    Date de Commande:Client:Nom du Client:Socit:

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    76/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    77/90

    Mapper lhritage

    Hibernate supporte les troisstratgies d'hritage de base : une table par hirarchie de classe (table

    per class hierarchy) une table par classe fille (table per

    subclass) une table par classe concrte (table per

    concrete class)

    Exemple

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    78/90

    Base de donnes : Table par hirarchie

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    79/90

    Base de donnes : Table par hirarchie

    Table clients

    Table comptes

    Table Oprations

    Client hbm xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    80/90

    Client.hbm.xml

    Compte hbm xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    81/90

    Compte.hbm.xmlhibernate-mapping>

    Operation hbm xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    82/90

    Operation.hbm.xml

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    83/90

    Ajouter un clientpublic void addClient(String nom,String add){

    Sessionsession=HibernateUtil.sessionFactory.getCurrentSession();

    session.beginTransaction();Client cl=new Client();

    cl.setNom(nom);cl.setAdresse(add);session.save(cl);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    84/90

    Ajouter un CompteB

    public void addCompteB(Long idClient, double solde){Session

    session=HibernateUtil.sessionFactory.getCurrentSession();session.beginTransaction();Client cli=(Client)session.load(Client.class,idClient);

    CompteB cb=new CompteB();cb.setSolde(solde);cb.setClient(cli);session.save(cb);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    85/90

    Ajouter un CompteEpargnepublic void addCompteEpargne(Long idClient, double

    solde,double taux){Session

    session=HibernateUtil.sessionFactory.getCurrentSession();session.beginTransaction();Client cli=(Client)session.load(Client.class,idClient);CompteEpargne cb=new CompteEpargne();cb.setSolde(solde);cb.setTaux(taux);cb.setClient(cli);session.save(cb);

    session.getTransaction().commit();}

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    86/90

    Verser un montant dans un compte

    public void verser(Long idCompte, double montant){Session

    session=HibernateUtil.sessionFactory.getCurrentSession();session.beginTransaction();Compte

    cpte=(Compte)session.load(Compte.class,idCompte);OperationVersement op=new OperationVersement();op.setDateOperation(new Date());op.setMontantVersement(montant);cpte.verser(op.getMontantVersement());cpte.addOperation(op);

    session.save(op);session.update(cpte);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    87/90

    Retirer un montantpublic void retirer(Long idCompte, double montant){

    Sessionsession=HibernateUtil.sessionFactory.getCurrentSession();

    session.beginTransaction();Compte

    cpte=(Compte)session.load(Compte.class,idCompte);OperationRetrait op=new OperationRetrait();op.setDateOperation(new Date());op.setMontantRetrait(montant);cpte.retirer(op.getMontantRetrait());cpte.addOperation(op);

    session.save(op);session.update(cpte);session.getTransaction().commit();

    }

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    88/90

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    89/90

    Exemple testpublic static void main(String[] args) {

    GestComptes gc=new GestComptes();gc.addClient("youssfi","Mohammedia");gc.addClient("Fadili","Casa");

    gc.addCompteB(new Long(1),6000);gc.verser(new Long(1),7000);gc.retirer(new Long(1),2000);

    Compte cpte=gc.getCompte(new Long(1));System.out.println("Compte code="+cpte.getIdCompte()+"

    Solde="+cpte.getSolde());System.out.println("Opration:");

  • 8/14/2019 Mapping%20Objet%20Relationnel%20avec%20Hibernate%20vers%204

    90/90

    Exemple test (suite)Iterator lesOp=cpte.getOperations().iterator();

    while(lesOp.hasNext()){Operation op=(Operation)lesOp.next();System.out.print(op.getIdOperation()+"--"+

    op.getDateOperation()+"--");

    if(op instanceof OperationVersement )System.out.println(((OperationVersement)op).getMontantVersement()+"-- 00.00"

    );else

    System.out.println(" 00.00 ---"+((OperationRetrait)op).getMontantRetrait());

    }}