Vous êtes sur la page 1sur 8

ENSAJ ISIC

TP : Mapping d’héritage

Exercice 1 :

Soit le diagramme de classe suivant :

1. Développer les entités dans le package « ma.projet.beans ».


2. Créer le fichier de configuration hibernate « hibernate .cfg.xml ».
3. Créer la classe HibernateUtil.
4. Créer trois objets : 1 personne, 1 Employé et un Etudiant.
Qu’est-ce que vous remarquez ?

Solution 1 : Stratégie « SINGLE_TABLE »

Dans cette stratégie, qui est celle par défaut, le modèle relationnel est fait d'une seule table
pour toute la hiérarchie de classes. Pour spécifier cette stratégie, on ajoute une
annotation @Inheritance(strategy=InheritanceType.SINGLE_TABLE) sur la classe racine.

1. Les entités :
Personne
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name = "Type",
discriminatorType = DiscriminatorType.STRING)
public class Personne {
@Id
@GeneratedValue
private int id;
private String nom;

public Personne() {

Page 1 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

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;
}

Etudiant
@Entity
@DiscriminatorValue(value = "etd")
public class Etudiant extends Personne{

private String cne;

public String getCne() {


return cne;
}

public void setCne(String cne) {


this.cne = cne;
}

Employe

@Entity
@DiscriminatorValue(value = "emp")
public class Employe extends Personne{
private String matricule;
public String getMatricule() {
return matricule;
}
public void setMatricule(String matricule) {
this.matricule = matricule;
}
}

Page 2 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

2. Fichier de configuration « hibernate.cfg.xml » :


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/projetH7A</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping class="ma.projet.beans.Employe"/>
<mapping class="ma.projet.beans.Etudiant"/>
<mapping class="ma.projet.beans.Personne"/>
</session-factory>
</hibernate-configuration>

3. La classe HibernateUtil :

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {


return sessionFactory;
}
}

4. Programme de Test :
public static void main(String[] args) {
Personne p = new Personne();
p.setNom("Safi");
Employe emp = new Employe();
emp.setNom("Rami");
emp.setMatricule("14528");
Etudiant et = new Etudiant();
et.setNom("Alami");
et.setCne("145878965");
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();

Page 3 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

session.save(p);
session.save(emp);
session.save(et);
session.getTransaction().commit();
session.close();
}

Requêtes SQL générées :

Hibernate:
insert
into
Personne
(nom, Type)
values
(?, 'Personne')
Hibernate:
insert
Vu qu'il n'y a qu'une seule table, toutes les écritures
into
se font dedans, quelle que soit la nature de l'objet
Personne
(nom, matricule, Type) persisté. Au final certaines colonnes sont laissées
values nulles.
(?, ?, 'emp')
Hibernate:
insert
into
Personne
(nom, cne, Type)
values
(?, ?, 'etd')

Solution 2 : Stratégie « TABLE_PER_CLASS»

Avec cette stratégie de mapping, il y a une table pour chaque classe concrète : chaque type de
personne est stocké dans sa propre table. Chaque table reprend les colonnes de la classe mère,
grand-mère, etc... Par contre les classes abstraites ne sont pas représentées.

Le mapping change très peu de la stratégie précédente, la classe racine est toujours la seule
concernée.

Aucune modification au niveau du fichier de configuration hibernate ni de la classe HibernateUtil.


Les modifications portent sur les classes entités.

Entité Personne :

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Personneee {

@Id

Page 4 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

@GeneratedValue (strategy = GenerationType.TABLE)


private int id;
private String nom;

public Personneee() {
}

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;
}

Entité Employe :

@Entity
public class Employeee extends Personneee{

private String matricule;

public String getMatricule() {


return matricule;
}

public void setMatricule(String matricule) {


this.matricule = matricule;
}

Entité Etudiant :

@Entity
public class Etudiantee extends Personneee{

private String cne;

public String getCne() {


return cne;

Page 5 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

public void setCne(String cne) {


this.cne = cne;
}

}
Personne
Programme de Test :

Hibernate:
insert
into
Personneee
(nom, id) Etudiant
values
(?, ?)
Hibernate:
insert
into
Employeee
Employe
(nom, matricule, id)
values
(?, ?, ?)
Hibernate:
insert
into
Etudiantee
(nom, cne, id)
values
(?, ?, ?)

Solution 3 : Stratégie « JOINED»

Ce modèle relationnel est le plus proche du modèle objet : à chaque classe, qu'elle soit concrète ou
abstraite, correspond une table. Autrement dit, les informations concernant une instance de véhicule
sont réparties sur plusieurs tables. La seule colonne commune entre les tables est la colonne ID qui
permet de faire les jointures table mère et table fille.

Aucune modification au niveau du fichier de configuration hibernate ni de la classe HibernateUtil.


Les modifications portent sur les classes entités.

Entité Personne :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Personnee {

Page 6 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

@Id
@GeneratedValue
private int id;
private String nom;

public Personnee() {
}

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;
}

Entité Employe :

@Entity
public class Employeee extends Personnee{

private String matricule;

public String getMatricule() {


return matricule;
}

public void setMatricule(String matricule) {


this.matricule = matricule;
}

Entité Etudiant :

@Entity
public class Etudiantee extends Personnee{

private String cne;

public String getCne() {

Page 7 sur 8
Pr. Mohamed LACHGAR
ENSAJ ISIC

return cne;
}

public void setCne(String cne) {


this.cne = cne;
}

}
Personne
Programme de Test :

Hibernate:
insert
into
Personnee
(nom) Employe
values
(?)
Hibernate:
insert
into Etudiant
Personnee
(nom)
values
(?)
Hibernate:
insert
into
Employee
(matricule, id)
values
(?, ?)
Hibernate:
insert
into
Personnee
(nom)
values
(?)
Hibernate:
insert
into
Etudiante
(cne, id)
values
(?, ?)

Page 8 sur 8
Pr. Mohamed LACHGAR

Vous aimerez peut-être aussi