IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Débutant] Jointures hibernate


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut [Débutant] Jointures hibernate
    Bonjour,

    je débute côté hibernate, et je ne comprends pas comment faire des jointures entre plusieurs tables.

    exemple :
    table1
    idTable1
    nom
    prenom
    idTable2_rapporté

    table2
    idTable2
    truc
    chose


    si j'ai une BDD avec 2 tables, dont une contient la clé rapportée de la 2e, comment je fais pour dire à hibernate que la colonne "idTable2_rapporté" est la clé rapportée de table2 ?

    je n'arrive vraiment pas à comprendre le concept.

    et ça me pose des problèmes en requêtes aussi :

    je ne peux pas dire "select * from table1, table2 WHERE table1.idTable2_rapporté = table2.idTable2"

    comment on fait ?!

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 76
    Par défaut
    tu crée une classe Table2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class table2{
     
    private String  idTable2;
    private String nom;
    private String prenom;
     
    getter et setter....
    }
    tu crée une classe table1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class table1{
     
    private String  idTable1;
    private String nom;
    private String prenom;
    private Table2 idTable2_rapporté;
     
    getter et setter....
    }
    ensuite tu fais le mapping table1.hbm.xml et table2.hbm.xml

    table1.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mapping normal avec cette association
     
    <many-to-one name="idTable2_rapporté" class="Table2" cascade="all" column="idTable2_rapporté" unique="true"  />
    table2.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mapping normal sans association
    voila, besoin d'explications ?

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    waw super je vais essayer ça !

    donc du coup, côté requêtes, comment on fait ?

    par exemple, si en SQL je dis "select * from table1, table2 WHERE table1.clé_rapportée = table2.clé"

    à quoi sert le "unique=true" dans le hbm ?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 76
    Par défaut
    ensuite pour récupérer tes données tu as plusieurs choix, le HQL, le SQL ou bien session.load(), ou même une classe générique de DAO.

    tu as tout ici : http://www.hibernate.org/hib_docs/v3/reference/fr/html/

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    eh bien j'ai choisi de faire un session.createQuery pour récupérer les données.

    mais j'ai un problème : Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
    at fr.Test.main(Test.java:88)

    voilà le bout de code qui génère l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List list = session.createQuery("from Entite as EA inner join EA.adresseIdAdresse").list();
     
     
     if (list.size() > 0) 
     { 	
         Iterator it = list.iterator();
         while(it.hasNext())
         {
        	Entite listeEntite = (Entite)it.next();
        	StringList += "nom : " + listeEntite.getNomEntite();
           	StringList += "ville : " + listeEntite.getAdresseIdAdresse().getAdresseVille();
         }
     }
     System.out.println(StringList);
    visiblement, il ne veut pas caster en Entite, mais avant que je fasse le join avec la table adresse, ça fonctionnait.

    que faut-il faire pour que ça fonctionne ?

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 76
    Par défaut
    voila un exemple

    [code]

    Query q = session
    .createQuery("select p.nameStr,p.fistNameStr,a.statusInt,a.idAdministratorsInt FROM Administrators as a,PersonSheets as p where a.personSheet = p.idPersonSheetInt");
    Iterator<Object> page = q.list().iterator();

    while (page.hasNext()) {
    Object[] o = (Object[]) page.next();
    ActorsList a = new ActorsList();
    a.setFirstNameStr((String) o[0]);
    a.setNameStr((String) o[1]);
    a.setStatusInt((Integer) o[2]);
    a.setIdAdministrateurInt((Integer) o[3]);
    aCollection.add(a);
    }

    [/code ]

    et dis moi si tu t'en sors

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    ... non je ne m'en sors pas

    je ne comprends pas le aCollection.add

    comment est-ce que tu initialises ce aCollection ?

  8. #8
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Normalement tu n'as pas a écrire la jointure. Si tu as déclaré les objets comme t'as montré solarien l'objet de type table2 est un attribut de table1. Dans ce cas pour remonter l'ensemble des objet il suffit de faire la requêtes
    les objets de type adresses seront remontées avec les Entité.
    Si ce n'est pas ça que tu veux essaye de nous monter tes classes et tes fichiers de mapping.

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    oui tu as raison, ça fonctionne bien.

    mais j'essaie maintenant de récupérer les objets de la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    List list = session.createQuery("from com.hibernate.ForceCommerciale").list();
     
     if (list.size() > 0) 
     {
    	 List listeForceCommerciale = new ArrayList(7);
         Iterator<Object> it = list.iterator();
         System.out.println("taille list : "+list.size());
     
         while(it.hasNext())
         {
        	System.out.println(o[0]);
        	System.out.println(o[1]);
        	System.out.println(o[2]);
        	System.out.println(o[3]);
        	System.out.println(o[4]);
        	System.out.println(o[5]);
        	System.out.println(o[6]);
        	System.out.println(o[7]);
        	System.out.println(o[8]);
         }     
     }
    voilà ce que me renvoie ce code :
    admin
    admin
    admin@admin.fr
    null
    null
    administrateur
    com.hibernate.Entite@18aab40

    un souci : je voulais un objet Adresse, et j'ai ça : com.hibernate.Entite@18aab40

    pourquoi ?

  10. #10
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Euh comme ça ça va être compliqué sans plus d'info:
    - comment est mappé l'objet ForceCommerciale
    - d'où sorte les o[0],o[1],....

  11. #11
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    ooops.... désolée !

    alors, la ForceCommerciale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 27 oct. 2008 18:23:18 by Hibernate Tools 3.2.2.GA -->
    <hibernate-mapping>
        <class name="com.hibernate.ForceCommerciale" table="force_commerciale">
            <id name="idForceCommerciale" type="java.lang.Integer">
                <column name="id_force_commerciale" />
                <generator class="identity" />
            </id>
            <property name="nomForceCommerciale" type="string">
                <column name="nom_force_commerciale" length="45" not-null="true" />
            </property>
            <property name="prenomForceCommerciale" type="string">
                <column name="prenom_force_commerciale" length="45" not-null="true" />
            </property>
            <property name="mailForceCommerciale" type="string">
                <column name="mail_force_commerciale" length="45" not-null="true" />
            </property>
            <property name="telFixeForceCommerciale" type="java.lang.Integer">
                <column name="tel_fixe_force_commerciale" />
            </property>
            <property name="telGsmForceCommerciale" type="java.lang.Integer">
                <column name="tel_gsm_force_commerciale" />
            </property>
            <property name="fonctionForceCommerciale" type="string">
                <column name="fonction_force_commerciale" length="45" not-null="true" />
            </property>
            <property name="mdpForceCommerciale" type="string">
                <column name="mdp_force_commerciale" length="50" not-null="true" />
            </property>
            <many-to-one name="entiteIdEntite" class="com.hibernate.Entite" column="entite_id_entite"/>
        </class>
    </hibernate-mapping>
    l'adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 27 oct. 2008 18:23:18 by Hibernate Tools 3.2.2.GA -->
    <hibernate-mapping>
     <class name="com.hibernate.Adresse" table="adresse">
      <id name="idAdresse" type="java.lang.Integer">
       <column name="id_adresse" not-null="true" unique="true"/>
       <generator class="identity"/>
      </id>
      <property generated="never" lazy="false" name="adresseVoie" type="string">
       <column length="45" name="adresse_voie" not-null="true"/>
      </property>
      <property generated="never" lazy="false" name="adresseCp" type="int">
       <column name="adresse_cp" not-null="true"/>
      </property>
      <property generated="never" lazy="false" name="adresseVille" type="string">
       <column length="45" name="adresse_ville" not-null="true"/>
      </property>
      <property generated="never" lazy="false" name="adresseComplement" type="string">
       <column length="150" name="adresse_complement"/>
      </property>
     </class>
    </hibernate-mapping>
    et le "o"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Session session = HibernateUtil.currentSession();
            List list = session.createQuery("select FC.nomForceCommerciale, FC.prenomForceCommerciale, FC.mailForceCommerciale, FC.telFixeForceCommerciale, FC.telGsmForceCommerciale, FC.fonctionForceCommerciale, FC.entiteIdEntite from com.hibernate.ForceCommerciale as FC inner join FC.entiteIdEntite").list();
     
            if (list.size() > 0) 
            {
            	StringList = "<table border=1 align=\"center\" width=80%><tr><td>Nom</td><td>Prénom</td><td>eMail</td><td>Téléphone fixe</td><td>Téléphone portable</td><td>Fonction</td>";
     
     
           	 List listeForceCommerciale = new ArrayList(7);
           	 //List<ForceCommerciale> listeForceCommerciale = new Collection;
                Iterator<Object> it = list.iterator();
                System.out.println("taille list : "+list.size());
     
                while(it.hasNext())
                {
               	Object[] o = (Object[]) it.next();
               	ForceCommerciale forceCommerciale = new ForceCommerciale();
               	StringList += "<tr>";
              	StringList += "<td>" + o[0] + "</td>";
              	StringList += "<td>" + o[1] + "</td>";
              	StringList += "<td>" + o[2] + "</td>";
              	StringList += "<td>" + o[3] + "</td>";
              	StringList += "<td>" + o[4] + "</td>";
              	StringList += "<td>" + o[5] + "</td>";
              	StringList += "</tr>"; 	
                }
                StringList += "</table>";
     
     
    	        HibernateUtil.closeSession();
            }
    (je crée un tableau à partir du "o")

  12. #12
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    La requete n'est pas la même que dans ton message précédent. Ton affichage me parait normal. Tu as com.hibernate.Entite@18aab40 puisque tu affiche directement un objet Entite (tu affiche donc sont type et son emplacement mémoire).
    Pour ta requete il serait plus logique de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from com.hibernate.ForceCommerciale
    et de récupérer directement des objets ForceCommerciale et des les exploiter (sans passer par le tableau d'objets).

  13. #13
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    Citation Envoyé par guigui5931 Voir le message
    et de récupérer directement des objets ForceCommerciale et des les exploiter (sans passer par le tableau d'objets).
    ça c'est ce que j'ai voulu faire, mais que j'ai jamais réussi à faire.

    mais comment je fais pour afficher les champs de mon objet Adresse au lieu de "com.hibernate.Entite@18aab40" ?

  14. #14
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Tu récupère ton objet entité en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Entite e = forceCommerciale.getEntiteIdEntite();
    e.getAdresseVoie();
    ...
    avec forceCommerciale comme nom de variable de ton objet récupéré de la base.

  15. #15
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    oui, encore faut-il avoir réussi à récupérer directement des objets ForceCommerciale

  16. #16
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Session session = HibernateUtil.currentSession();
            List list = session.createQuery("from com.hibernate.ForceCommerciale").list();
     
            if (list.size() > 0) 
            {
                Iterator<ForceCommerciale> it = list.iterator();
                while(it.hasNext())
                {
                      ForceCommercialeforceCommerciale =it.next();
                      .....
                }
    comme pour le premier exemple.

  17. #17
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    oui mais après, comment je fait pour ajouter des données.

    au niveau de la jointure, il faudrait que je lui renvoie un objet, mais moi je n'ai qu'un Id !

    comment faire ?

  18. #18
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Qu'est ce que tu veux faire exactement?
    Si tu veux créer un nouvel enregistrement il faut que tu créé un nouvel objet puis que tu fasse un save dessus. Mais je ne vois pas le rapport avec le code qu'on faisait avant.

  19. #19
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Par défaut
    le code d'avant permettait de lister les infos de la BDD.

    en fait, maintenant j'essaye d'ajouter des données dans cette même table.

    donc je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Truc truc = new Truc
    truc.setMachin = "truc"
    jusque là tout va bien.

    mais si l'un de mes champs correspond à un objet, comment je fais pour renvoyer cet objet ?

  20. #20
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Si c'est un objet qui est déja dans ta base il faut que tu le récupère par une requete ou par un load. Sinon il faut que tu le créé aussi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2007, 16h47
  2. Réponses: 6
    Dernier message: 19/03/2007, 20h04
  3. [Débutant] Eclipse + Hibernate
    Par chennuo dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 14/06/2006, 14h07
  4. [SQL Server] [Débutant] Jointure de plusieurs vues
    Par f.le.chat dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/05/2006, 10h13
  5. [débutant] Jointure + Count
    Par Yann21 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/10/2003, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo