Upload
didataze
View
216
Download
0
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());
}}