TP2 Hibernate

17
ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies TP 2- Hibernate (Architectures n-tiers JEE) 1 TP2(Hibernate) 1) Mise en place d’hibernate : On utilise pur ce TP « hibernate-distribution-3.3.2.GA », on commence donc à extraire le fichier « hibernate-distribution-3.3.2.GA.rar » : Maintenant nous allons créer sous éclipse un nouveau projet java qui va traiter nos objets métiers et stocker leurs données relatives dans notre base de données. 1) Création du nouveau projet : Lancer eclipse. File->New->Project Java->JavaProject Puis « Next », l’assistant vous demandera le nom du projet : « PremierHibernate» Cliquer sur « Finish ». Vous verrez alors le nouveau projet au niveau du Package explorer (à gauche). Clique droit sur le repertoir SRC du projet, puis New->package. Nom du package : « org.esprit.hibernate.persistance »

Transcript of TP2 Hibernate

Page 1: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

1

TP2(Hibernate)

1) Mise en place d’hibernate :

On utilise pur ce TP « hibernate-distribution-3.3.2.GA », on commence donc à extraire le

fichier « hibernate-distribution-3.3.2.GA.rar » :

Maintenant nous allons créer sous éclipse un nouveau projet java qui va traiter nos objets métiers et

stocker leurs données relatives dans notre base de données.

1) Création du nouveau projet :

Lancer eclipse.

File->New->Project Java->JavaProject

Puis « Next », l’assistant vous demandera le nom du projet : « PremierHibernate»

Cliquer sur « Finish ».

Vous verrez alors le nouveau projet au niveau du Package explorer (à gauche).

Clique droit sur le repertoir SRC du projet, puis New->package.

Nom du package : « org.esprit.hibernate.persistance »

Page 2: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

2

2) Mise en place d’une librairie utilisateur : Hibernate :

Window->Preferences, une fenêtre s’affiche:

Java->BuildPath-> User Libraries puis appuiez sur “New”. Nom : Hibernate puis OK. La nouvelle librairie s’affiche. Choisissez « Add Jars »

Parcourir le repertoire ou vous avez extrait hibernate jusqu'à trouver le fichier : hibernate3.jar.

Puis «Load ». Idem pour les fichiers qui se trouve sous le repertoire « \lib\required »

Enfin « OK ».

Page 3: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

3

3) Relier le Projet à la librairie :

Choisir la racine du projet->properties->Java BuildPath

L’onglet « Libraries » puis « Add Library ».

Choisissez « User Library » puis, « Next »une liste des librairies s’affiche ,choisissez les

librairie Mysql (voir TP1) et hibernate, puis« Finish »

4) Création du fichier de configuration :

Cliquer sur le projet «PremierHibernate » puis clique droit new Source Folder

Nom du répertoire : META-INF puis ok.

Clique droit sur META-INF puis newotherXMLXML.

Nom du Fichier : hibernate.cfg.xml

Page 4: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

4

Voici son contenu (On suppose que vous avez déjà créé une base de données qui se nomme

« hibernate » avec un utilisateur et un mot de passe (voir TP1)) :

<?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>

<property

name="connection.url">jdbc:mysql://localhost/hibernate</proper

ty>

<property name="connection.username">esprituser</property>

<property name="connection.password">espritpwd</property>

<property

name="connection.driver_class">com.mysql.jdbc.Driver</property

>

<property

name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="hbm2ddl.auto">update</property>

<property

name="transaction.factory_class">org.hibernate.transaction.JDB

CTransactionFactory</property>

<!-- thread is the short name for

org.hibernate.context.ThreadLocalSessionContext

and let Hibernate bind the session automatically to the

thread

-->

<property

name="current_session_context_class">thread</property>

<!-- this will show us all sql statements -->

<property name="hibernate.show_sql">true</property>

<!-- mapping files -->

</session-factory>

</hibernate-configuration>

Page 5: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

5

Maintenant creer un nouveau fichier qui se nomme « log4j.properties » :

Projet : clique droitnewotherGeneralfile

### direct log messages to stdout ###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L -

%m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=info

#log4j.logger.org.hibernate=debug

### log HQL query parser activity

#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL

log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###

log4j.logger.org.hibernate.type=info

### log schema export/update ###

log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees

#log4j.logger.org.hibernate.hql=debug

### log cache activity ###

log4j.logger.org.hibernate.cache=info

### log transaction activity

#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition

#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###

### leakages when using DriverManagerConnectionProvider ###

#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trac

e

Page 6: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

6

1) Les classes persistantes :

-Ajouter les classes suivantes dans le sous package: « persistance » :

class Ecole

package com.esprit.hibernate.persistance;

import java.util.List;

public class Ecole {

private int num;

private String nom;

private String address;

private int nombreSalles;

private List<Enseignant> enseignants;

private List<Etudiant> etudiants;

private List<Fournisseur> fournisseurs;

private List<Actionnaire> actionnaires;

public String getNom() {return nom;}

public void setNom(String nom) { this.nom = nom;}

public String getAdresse() {return address;}

public void setAdresse (String address) {this.address =

address;}

public int getNombreSalles() {return nombreSalles;}

public void setNombreSalles(int nombreSalles)

{this.nombreSalles = nombreSalles;}

public void setNum(int num) {this.num = num;}

Ecole Evénement Enseignant

Etudiant Fournisseur Actionnaire

* 1 1 *

*

* *

*

*

Page 7: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

7

public int getNum() {return num;}

public String toString(){

return ("-------------------------------\n" +

"Nom: "+nom+"\n Adresse: "+address+

"\n Nombre de salles:"+nombreSalles);}

public void setEnseignants(List<Enseignant> enseignants) {

this.enseignants = enseignants;

}

public List<Enseignant> getEnseignants() {

return enseignants;

}

public void setEtudiants(List<Etudiant> etudiants) {

this.etudiants = etudiants;

}

public List<Etudiant> getEtudiants() {

return etudiants;

}

public void setFournisseurs(List<Fournisseur> fournisseurs) {

this.fournisseurs = fournisseurs;

}

public List<Fournisseur> getFournisseurs() {

return fournisseurs;

}

public void setActionnaires(List<Actionnaire> actionnaires) {

this.actionnaires = actionnaires;

}

public List<Actionnaire> getActionnaires() {

return actionnaires;

}

}

package com.esprit.hibernate.persistance;

import java.util.List;

public class Actionnaire {

private int id;

private String nom;

private List<Ecole> ecoles;

public int getId() { return id;}

public void setId(int id) {this.id = id;}

public String getNom() {return nom;}

public void setNom(String nom) {this.nom = nom;}

public List<Ecole> getEcoles() {return ecoles;}

public void setEcoles(List<Ecole> ecoles) {this.ecoles =

ecoles;}

}

package com.esprit.hibernate.persistance;

Page 8: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

8

public class Enseignant {

private String ncin;

private String nom;

public String getNcin() {

return ncin;

}

public void setNcin(String ncin) {

this.ncin = ncin;

}

public String getNom() {

return nom;

}

public void setNom(String nom) {

this.nom = nom;

}

}

package com.esprit.hibernate.persistance;

public class Etudiant {

private Ecole ecole;

private int id;

private String nom;

public void setEcole(Ecole ecole) {this.ecole =

ecole;}

public Ecole getEcole() { return ecole;}

public void setId(int id) {this.id = id;}

public int getId() {return id;}

public void setNom(String nom) {this.nom = nom;}

public String getNom() {return nom;}

}

Page 9: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

9

package com.esprit.hibernate.persistance;

import java.util.Date;

public class Evennement {

private Ecole ecole;

private int id;

private String titre;

private Date date;

public int getId() {return id;}

public void setId(int id) { this.id = id;}

public String getTitre() { return titre;}

public void setTitre(String titre) {this.titre =

titre;}

public Date getDate() {return date;}

public void setDate(Date date) { this.date = date;}

public void setEcole(Ecole ecole) { this.ecole =

ecole;}

public Ecole getEcole() { return ecole;}

}

package com.esprit.hibernate.persistance;

public class Fournisseur {

private String nom;

public void setNom(String nom) {this.nom = nom;}

public String getNom() {return nom;}

}

Page 10: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

10

Maintenant il faut rendre ces classes « mappé » c.a.d créer pour chaque classe un fichier

« --------.hbm.xml » :

Ecole.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package

="com.esprit.hibernate.persistance">

<class name="Ecole" table="T_ECOLE">

<id name="num" type="int" column="Ecole_num">

<generator class="native"/>

</id>

<property name="nom" type="string" column="Ecole_nom"/>

<property name="adresse" type="string"

column="Ecole_adresse"/>

<property name="nombreSalles" type="int"

column="Ecole_nb_salles"/>

<bag name="enseignants" cascade="all">

<key column="FK_Ecole"/>

<one-to-many class="Enseignant" ></one-to-many>

</bag>

<bag name="etudiants" cascade="all">

<key column="FK_ECOLE"></key>

<one-to-many class="Etudiant"/>

</bag>

<bag name="fournisseurs" table="ECOLE_FOURNISSEUR"

cascade="all">

<key column="FK_ECOLE"></key>

<many-to-many column="FK_FOURNISSEUR"

class="Fournisseur"></many-to-many>

</bag>

<bag name="actionnaires" table="ECOLE_ACTIONNAIRE"

cascade="all">

<key column="FK_ECOLE"></key>

<many-to-many column="FK_ACTIONNAIRE"

class="Actionnaire"></many-to-many>

</bag>

</class></hibernate-mapping>

Page 11: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

11

Enseignant.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package

="com.esprit.hibernate.persistance">

<class name="Enseignant" table="T_Enseignant">

<id name="ncin" type="string" column="Ens_ncin">

</id>

<property name="nom" type="string" column="Ens_nom"/>

</class></hibernate-mapping>

Etudiant.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package

="com.esprit.hibernate.persistance">

<class name="Etudiant" table="T_Etudiant">

<id name="id" type="int" column="etd_id">

<generator class="increment"></generator>

</id>

<property name="nom" type="string" column="etd_nom"/>

<many-to-one name="ecole" column="FK_ECOLE"></many-to-one>

</class>

</hibernate-mapping>

Evennement.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

Page 12: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

12

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.esprit.hibernate.persistance">

<class name="Evennement" table="T_Evennement">

<id name="id" type="int" column="Even_ID">

<generator class="native"/>

</id>

<property name="titre" type="string" column="EVEN_TITRE"/>

<property name="date" type="timestamp" column="EVEN_DATE"/>

<many-to-one name="ecole" column="FK_ECOLE"

cascade="all"></many-to-one>

</class>

</hibernate-mapping>

Fournisseur.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package

="com.esprit.hibernate.persistance">

<class name="Fournisseur" table="T_Fournisseur">

<id name="nom" type="string" column="FRN_NOM">

</id>

</class>

</hibernate-mapping>

Page 13: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

13

Actionnaire.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package

="com.esprit.hibernate.persistance">

<class name="Actionnaire" table="T_ACTIONNAIRE">

<id name="id" type="int" column="ACT_ID">

<generator class="native"/>

</id>

<property name="nom" type="string" column="ACT_NOM"/>

<bag name="ecoles" table="ECOLE_ACTIONNAIRE" inverse="false"

cascade="all">

<key column="FK_ACTIONNAIRE"></key>

<many-to-many column="FK_ECOLE" class="Ecole"></many-to-many>

</bag>

</class>

</hibernate-mapping>

Maintenant il faut ajouter ceci à Hibernate.cfg.xml pour rendre les classes mappés :

<mapping

resource="com/esprit/hibernate/persistance/Ecole.hbm.xml"/>

<mapping

resource="com/esprit/hibernate/persistance/Evennement.hbm.xml"

/>

<mapping

resource="com/esprit/hibernate/persistance/Enseignant.hbm.xml"

/>

<mapping

resource="com/esprit/hibernate/persistance/Etudiant.hbm.xml"/>

<mapping

resource="com/esprit/hibernate/persistance/Fournisseur.hbm.xml

"/>

<mapping

resource="com/esprit/hibernate/persistance/Actionnaire.hbm.xml

"/

Page 14: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

14

Manipulation et test :

1) Créer un package « org.esprit.hibernate.tests »

Voici une classe qui test la création du shéma.

package com.esprit.hibernate.test;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class DdlTest {

public static void main(String[] args) {

SessionFactory sf=new Configuration().configure()

.buildSessionFactory();

}

}

Voici une classe qui teste l’ajout d’une nouvelle école (avec un fournisseur) :

package com.esprit.hibernate.test;

import java.util.ArrayList;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.esprit.hibernate.persistance.Ecole;

import com.esprit.hibernate.persistance.Fournisseur;

public class EcoleFournisseurInsertionTest {

public static void main(String[] args) {

SessionFactory sf=new Configuration().configure()

.buildSessionFactory();

Session session=sf.getCurrentSession();

sf.openSession();

Transaction tx=session.beginTransaction();

Page 15: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

15

Ecole ec=new Ecole();

ec.setNom("ESPRIT");

ec.setNombreSalles(35);

Fournisseur fr1=new Fournisseur();

fr1.setNom("ALLANI");

ec.setFournisseurs(new ArrayList<Fournisseur>());

ec.getFournisseurs().add(fr1);

session.save(ec);

session.flush();

tx.commit();

}

}

Cette classe liste les écoles a partir d’un fournisseur :

package com.esprit.hibernate.test;

import org.apache.log4j.Logger;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.esprit.hibernate.persistance.Actionnaire;

import com.esprit.hibernate.persistance.Ecole;

public class EcoleListingFromFournisseurTest {

/**

* @param args

*/

public static void main(String[] args) {

SessionFactory sf=new Configuration().configure()

.buildSessionFactory();

Page 16: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

16

Session session=sf.getCurrentSession();

sf.openSession();

Transaction tx=session.beginTransaction();

Ecole e1;

e1=(Ecole)session.load(Ecole.class,1 );

Actionnaire

act1=(Actionnaire)session.load(Actionnaire.class,1 );

for (Ecole e:act1.getEcoles()){

Logger.getRootLogger().warn(e.getNom());

Logger.getRootLogger().warn("____________________");

}

tx.commit();

}

}

Insertion d’un eseignant Avec une ecole existante:

package com.esprit.hibernate.test;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.esprit.hibernate.persistance.Ecole;

import com.esprit.hibernate.persistance.Enseignant;

public class InsertionEnseignantAecoleExistante {

/**

* @param args

*/

public static void main(String[] args) {

//EcoleInsertionTest.main(args);

SessionFactory sf=new Configuration().configure()

.buildSessionFactory();

Session session=sf.getCurrentSession();

Page 17: TP2 Hibernate

ESPRIT -Ecole Supérieure privée d’ingénierie et de technologies

TP 2- Hibernate (Architectures n-tiers JEE)

17

sf.openSession();

Transaction tx=session.beginTransaction();

Ecole e=(Ecole) session.load(Ecole.class, 1);

Enseignant ens1=new Enseignant();

ens1.setNcin("00987");

ens1.setNom("Foulen1");

Enseignant ens2=new Enseignant();

ens2.setNcin("005678");

ens2.setNom("Foulen2");

e.getEnseignants().add(ens1);

e.getEnseignants().add(ens2);

session.saveOrUpdate(e);

tx.commit();

}

}