Types de Mappage Hibernate - Guide Complet

Section 1 : Mappage des Types de Base

Produit.java:

package com.cy.model;

import java.sql.Blob;
import java.util.Date;

public class Produit {
    private int identifiant;
    private String nomProduit; // Nom du produit
    private double prix; // Prix du produit
    private boolean promotion; // En promotion
    private Date datePublication; // Date de publication
    private String createur; // Créateur
    private String description; // Description
    private Blob imageProduit; // Image du produit
    
    
    public int getIdentifiant() {
        return identifiant;
    }
    public void setIdentifiant(int identifiant) {
        this.identifiant = identifiant;
    }
    public String getNomProduit() {
        return nomProduit;
    }
    public void setNomProduit(String nomProduit) {
        this.nomProduit = nomProduit;
    }
    public double getPrix() {
        return prix;
    }
    public void setPrix(double prix) {
        this.prix = prix;
    }
    public boolean isPromotion() {
        return promotion;
    }
    public void setPromotion(boolean promotion) {
        this.promotion = promotion;
    }
    public Date getDatePublication() {
        return datePublication;
    }
    public void setDatePublication(Date datePublication) {
        this.datePublication = datePublication;
    }
    public String getCreateur() {
        return createur;
    }
    public void setCreateur(String createur) {
        this.createur = createur;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Blob getImageProduit() {
        return imageProduit;
    }
    public void setImageProduit(Blob imageProduit) {
        this.imageProduit = imageProduit;
    }
    
    
}

Voir le codeProduit.hbm.xml:

<?xml version="1.0"?>

<hibernate-mapping package="com.cy.model">
    <class name="Produit" table="t_produit">
        <id name="identifiant" column="produitId">
            <generator class="native"></generator>
        </id>
        <!-- 
            type correspond au type de mappage hibernate
            length="40" indique une longueur de chaîne de 40 caractères
         -->
        <property name="nomProduit" column="nomProduit" length="40"></property>
        <property name="prix" column="prix" type="double"></property>
        <property name="promotion" column="promotion" type="boolean"></property>
        <property name="datePublication" column="datePublication" type="date"></property>
        <property name="createur" column="createur" length="20"></property>
        <property name="description" column="description" type="text"></property>
        <property name="imageProduit" column="imageProduit" type="blob"></property>
    </class>
</hibernate-mapping>

TestProduit.java:

public class TestProduit {
    public static void main(String[] args) throws ParseException, IOException {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();    
        session.beginTransaction();    
        
        Produit produit = new Produit();
        produit.setNomProduit("Programmation Java avancée");
        produit.setPrix(89.99);
        produit.setPromotion(true);
        produit.setCreateur("Martin");
        produit.setDatePublication(new SimpleDateFormat("yyyy-MM-dd").parse("2023-3-15"));
        produit.setDescription("Ouvrage complet sur Java...");
        
        LobHelper lobHelper = session.getLobHelper();
        InputStream in = new FileInputStream("c://java_avance.jpg");
        Blob imageProduit = lobHelper.createBlob(in, in.available());
        produit.setImageProduit(imageProduit);
        
        session.save(produit);
        
        session.getTransaction().commit();    
        session.close();    
    }
    
}

Résultat:

t_produit:

Après l'enregistrement des données:

Section 2 : Mappage des Types de Collcetion

Ces collections diffèrent des associations un-à-plusieurs ou plus-à-un abordées précédemment ;Il s'agit ici de compositions simples de mappage de données, sans session cache ni OID1. Mappage de l'ensemble Set:

Apprenant.java:

package com.cy.model;

import java.util.Set;

public class Apprenant {
    private long id;
    private String nom;
    private Set<String> documents;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getNom() {
        return nom;
    }
    public void setNom(String nom) {
        this.nom = nom;
    }
    public Set<String> getDocuments() {
        return documents;
    }
    public void setDocuments(Set<String> documents) {
        this.documents = documents;
    }
    
}

Voir le codeApprenant.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Apprenant" table="t_apprenant">
        <id name="id" column="apprenantId">
            <generator class="native"></generator>
        </id>
        
        <property name="nom" column="nomApprenant"></property>
        
        <!-- La clé étrangère apprenantId dans la table t_document référence la clé primaire de la table t_apprenant
             L'élément element représente l'élément de l'ensemble
         -->
        <set name="documents" table="t_document">
            <key column="apprenantId"></key>
            <element column="nomDocument" type="string"></element>
        </set>
    </class>

</hibernate-mapping>

Test:

@Test
    public void testEnregistrementSet(){
        Set<String> ensembleDocuments = new HashSet<String>();
        ensembleDocuments.add("doc1.pdf");
        ensembleDocuments.add("doc2.pdf");
        ensembleDocuments.add("doc3.pdf");
        ensembleDocuments.add("doc3.pdf");
        
        Apprenant a1 = new Apprenant();
        a1.setDocuments(ensembleDocuments);
        session.save(a1);
    }
    
    @Test
    public void testRecuperationSet(){
        Apprenant apprenant = (Apprenant)session.get(Apprenant.class, Long.valueOf(1));
        Iterator it = apprenant.getDocuments().iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

Voir le codeAprès l'exécution de testEnregistrementSet:

t_apprenant

t_document: la clé étrangère apprenantId référence la colonne de clé primaire de t_apprenant

  1. Mappage de l'ensemble List:

List: C'est grâce à la colonne d'index docIndex qu'il est ordonné ;Apprenant2.java:

package com.cy.model;

import java.util.List;

public class Apprenant2 {
    private long id;
    private String nom;
    private List<String> documents;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getNom() {
        return nom;
    }
    public void setNom(String nom) {
        this.nom = nom;
    }
    public List<String> getDocuments() {
        return documents;
    }
    public void setDocuments(List<String> documents) {
        this.documents = documents;
    }
    
}

Voir le codeApprenant2.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Apprenant2" table="t_apprenant">
        <id name="id" column="apprenantId">
            <generator class="native"></generator>
        </id>
        <property name="nom" column="nomApprenant"></property>
        
        <list name="documents" table="t_document2">
            <key column="apprenantId"></key>
            <list-index column="docIndex"></list-index>
            <element column="nomDocument" type="string"></element>
        </list>
    </class>

</hibernate-mapping>

Code de test:

@Test
    public void testEnregistrementListe(){
        List<String> listeDocuments = new ArrayList<String>();
        listeDocuments.add("doc1.pdf");
        listeDocuments.add("doc2.pdf");
        listeDocuments.add("doc3.pdf");
        listeDocuments.add("doc3.pdf");
        
        Apprenant2 a2 = new Apprenant2();
        a2.setDocuments(listeDocuments);
        session.save(a2);
    }
    
    @Test
    public void testRecuperationListe(){
        Apprenant2 apprenant2 = (Apprenant2)session.get(Apprenant2.class, Long.valueOf(2));
        Iterator it = apprenant2.getDocuments().iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

Voir le codet_apprenant:

t_document2:

  1. Mappage de l'ensemble Bag:

Similaire à List mais généralement non ordonné avec de grands volumes de données ;Apprenant3.java:``` package com.cy.model;

import java.util.List;

public class Apprenant3 { private long id; private String nom; private List<String> documents;

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getNom() {
    return nom;
}
public void setNom(String nom) {
    this.nom = nom;
}
public List<String> getDocuments() {
    return documents;
}
public void setDocuments(List<String> documents) {
    this.documents = documents;
}

}


Voir le codeApprenant3.hbm.xml:


<class name="Apprenant3" table="t_apprenant">
    <id name="id" column="apprenantId">
        <generator class="native"></generator>
    </id>
    <property name="nom" column="nomApprenant"></property>
    
    <idbag name="documents" table="t_document3">
        <collection-id type="long" column="documentId">
            <generator class="increment"></generator>
        </collection-id>
        <key column="apprenantId"></key>
        <element column="nomDocument" type="string"></element>
    </idbag>
</class>

Code de test:

@Test
    public void testEnregistrementSac(){
        List<String> listeDocuments = new ArrayList<String>();
        listeDocuments.add("doc1.pdf");
        listeDocuments.add("doc2.pdf");
        listeDocuments.add("doc3.pdf");
        listeDocuments.add("doc3.pdf");
        
        Apprenant3 a3 = new Apprenant3();
        a3.setDocuments(listeDocuments);
        session.save(a3);
    }
    
    @Test
    public void testRecuperationSac(){
        Apprenant3 apprenant3 = (Apprenant3)session.get(Apprenant3.class, Long.valueOf(3));
        Iterator it = apprenant3.getDocuments().iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

Voir le code4. Mappage de l'ensemble Map

Apprenant4.java:

package com.cy.model;

import java.util.Map;


public class Apprenant4 {
    private long id;
    private String nom;
    private Map<String, String> documents;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getNom() {
        return nom;
    }
    public void setNom(String nom) {
        this.nom = nom;
    }
    public Map<String, String> getDocuments() {
        return documents;
    }
    public void setDocuments(Map<String, String> documents) {
        this.documents = documents;
    }
    
    
}

Voir le codeApprenant4.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Apprenant4" table="t_apprenant">
        <id name="id" column="apprenantId">
            <generator class="native"></generator>
        </id>
        <property name="nom" column="nomApprenant"></property>
        
        <map name="documents" table="t_document4">
            <key column="apprenantId"></key>
            <map-key column="cleDoc" type="string"></map-key>
            <element column="nomDocument" type="string"></element>
        </map>
    </class>

</hibernate-mapping>

Code de test:

@Test
    public void testEnregistrementMap(){
        Map<String, String> mapDocuments = new HashMap<String, String>();
        mapDocuments.put("d1", "doc1.pdf");
        mapDocuments.put("d2", "doc2.pdf");
        mapDocuments.put("d3", "doc3.pdf");
        mapDocuments.put("d4", "doc4.pdf");
        
        Apprenant4 a4 = new Apprenant4();
        a4.setDocuments(mapDocuments);
        session.save(a4);
    }
    
    @Test
    public void testRecuperationMap(){
        Apprenant4 apprenant4 = (Apprenant4)session.get(Apprenant4.class, Long.valueOf(4));
        /**
         * Parcours du map, méthode 1
         */
        Iterator<Entry<String, String>>  it = apprenant4.getDocuments().entrySet().iterator();
        while(it.hasNext()){
            Entry<String, String> entry = it.next();
            System.out.println(entry.getKey() + "----" + entry.getValue());
        }
        
        System.out.println("------------------------------------------------");
        
        /**
         * Méthode 2
         */
        Map<String, String> mapDocuments = apprenant4.getDocuments();
        Set<String> clesDoc = mapDocuments.keySet();
        Iterator<String> its = clesDoc.iterator();
        while(its.hasNext()){
            String cle = its.next();
            System.out.println(cle + ":" + mapDocuments.get(cle));
        }
    }

Voir le codeAprès l'exécution de testEnregistrementMap:

Structure de la table t_document4:

Après l'exécution de testRecuperationMap:

Étiquettes: Hibernate ORM Java Mappage de données JDBC

Publié le 13 juin à 21h21