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 :

Problème de récupération d'un jeu d'enregistrements en passant par une jointure


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Problème de récupération d'un jeu d'enregistrements en passant par une jointure
    Bonjour tout le monde!

    J'essaie d'apprendre Hibernate en implémentant des exemples simples et en augmentant au fur et à mesure leur complexité.

    Voici mon problème :

    J'ai une base de test comportant 2 tables : une table utilisateur et une table voiture avec une relation de type one-to-many. Un utilisateur peut donc posséder plusieurs voitures mais une voiture ne peut appartenir qu'à une seule personne.

    Je pense mes fichiers de mappings bon, et j'ai généré mes classes à partir de ces fichiers grâce à Hibernate Synchroniser.

    Voici les bases. Maintenant je souhaite récupérer la liste des utilisateurs (ça c'est bon) mais également pour chacun la liste des voitures leur appartenant.
    Et c'est là que ça bloque, car en fait il me récupère le premier utilisateur et lui assigne la première voiture de la table, mais pas la seconde (il en a 2 en tout).
    Pour le second utilisateur il lui est attribué la 2nde voiture du premier utilisateur, mais aucune des 3 lui appartenant!!!

    En gros j'ai l'impression qu'il ne tient pas du tout compte de la relation liant l'utilisateur à ses voitures...

    Bien sur, j'aurais pu passer par une jointure au niveau de ma requete, mais à priori hibernate est tout à fait capable de le gérer.

    Je pense donc que je passe à coté d'un concept essentiel, mais je ne vois pas...

    Trève de bavardage, voici le code de ma classe de test qui sera peut-être plus explicite.

    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
    Session session = HibernateUtil.currentSession();
     
    List ListContacts = session.createQuery("from TContact").list();
     
    Iterator it = ListContacts.iterator();
     
     while(it.hasNext())
        {
    	 TContact contact = (TContact) it.next();
    	 	System.out.println("Nom du contact : " + contact.getNom() + contact.getPrenom());
    	 	Iterator it_voiture = contact.getTVoitures().iterator();
    	 	while(it_voiture.hasNext()){
    	 		TVoiture v = (TVoiture) it_voiture.next();
    	 		System.out.println("Marque : " + v.getMarque() + " ,Modele : " + v.getModele());
    	 	}
        }
     
     
    //On ferme la session
    HibernateUtil.closeSession();
    Voila, si jamais il manque certaines détails n'hésitez pas à me contacter!

    Merci d'avance, Arno

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Tu es sûre que tes données en base sont correctes ? Parce que le code là est bon, donc le problème ne vient pas de là ...
    Au passage, respecte les conventions de nommage !!! (majuscules, _ ...)

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour chtig, merci d'avoir répondu aussi rapidement!

    Pour répondre à ta question, je ne pense vraiment pas que le problème vienne de ma base (une requête direct sur la base avec un join me renvoi un résultat cohérent). A tout hasard voici quand même le contenu de mes 2 tables :

    Table t_contact :

    id nom prenom age
    ----------------------------------------------------------------
    1 Dupont Toto 44
    2 Lambert Julie 27

    Table t_voiture :

    id marque modele km fk_t_contact
    -----------------------------------------------------------------
    1 renault megane 150000 1
    2 peugeot 406 34000 1
    3 fiat stylo 1500 2
    4 opel astra 49500 2
    5 renault super 5 200500 2

    Désolé pour le formatage mais je dois m'en aller!
    Je pense que le problème vient soit des fichiers de mappings, soit de mon code, bien que tu me dises qu'il est correct.

    Encore merci, Arno.

    PS : dsl pour les conventions de nommages, je m'efforce de les respecter mais il m'arrive encore de me tromper!

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Alors oui à mon avis le problème vient de tes fichiers de mapping ...
    Bon week end, et post ça lundi j'essayerai d'y répondre (mets moi un petit message en privé si tu veux pour me dire quand tu les as postés)

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour bonjour!

    En cette fin de we, je profite du mauvais temps pour poster mes fichiers de mappings ! J'en ai donc 2, un pour mapper chaque table (à priori il est possible de tout mettre dans un seul, mais je pense que c'est disons... plus propre lol)

    Voici celui qui mappe la table t_contact :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <hibernate-mapping package="com.test.hibernate">
    	<class
    		name="TContact"
    		table="t_contact"
    	>
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="Id"
    			type="integer"
    			column="id"
    		>
    			<generator class="identity"/>
    		</id>
     
    		<property
    			name="Nom"
    			column="nom"
    			type="string"
    			not-null="true"
    			length="50"
    		/>
    		<property
    			name="Prenom"
    			column="prenom"
    			type="string"
    			not-null="true"
    			length="50"
    		/>
    		<property
    			name="Age"
    			column="age"
    			type="integer"
    			not-null="true"
    			length="10"
    		/>
     
     
    		<set name="TVoitures" inverse="true">
    			<key column="id"/>
    			<one-to-many class="TVoiture"/>
    		</set>
     
     
    	</class>	
    </hibernate-mapping>
    et celui de la table t_voiture :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <hibernate-mapping package="com.test.hibernate">
    	<class
    		name="TVoiture"
    		table="t_voiture"
    	>
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="Id"
    			type="integer"
    			column="id"
    		>
    			<generator class="identity"/>
    		</id>
     
    		<property
    			name="Marque"
    			column="marque"
    			type="string"
    			not-null="true"
    			length="50"
    		/>
    		<property
    			name="Modele"
    			column="modele"
    			type="string"
    			not-null="true"
    			length="50"
    		/>
    		<property
    			name="Km"
    			column="km"
    			type="integer"
    			not-null="true"
    			length="10"
    		/>
    		<many-to-one
    			name="FkTContact"
    			column="fk_t_contact"
    			class="TContact"
    			not-null="true"
    		>
    		</many-to-one>
     
     
    	</class>	
    </hibernate-mapping>
    J'ai donc une relation one-to-many au niveau de la table t_contact (un contact peut posséder plusieurs voitures) et une relation many-to-one au niveau de la table t_voiture. J'ai procédé de cette manière car d'après ce que j'ai compris, cela permet d'avoir une relation bidirectionnelle entre les classes correspondantes aux tables...

    Bonne fin de we à tout le monde (sauf à ceux qui font le pont bien sur! , ce qui malheureusement pas mon cas... )

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Le problème c'est la colonne de jointure !!!

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <set name="TVoitures" inverse="true">
      <key column="id"/>
      <one-to-many class="TVoiture"/>
    </set>
    par
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <set name="TVoitures" inverse="true">
      <key column="fk_t_contact"/>
      <one-to-many class="TVoiture"/>
    </set>

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    ah ok, je pensais qu'il fallait spécifier la clé primaire au niveau de ce paramètre...
    Pour l'instant je ne peux pas tester la solution, mais dès que je le peux je fais un retour pour dire si la solution fonctionne!

    Merci chtig!

    Arno

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonsoir tout le monde!

    Je fais un petit passage juste pour apporter le fin mot de l'histoire!

    Il semble que le problème ne venait toujours pas de la colonne de jointure (j'ai essayé en remplacant par id et cela ne changeait rien).

    J'ai modifié ma base de facon à ce que ma clé étrangère de la table t_voiture se nomme de la même manière que la clé primaire de la table t_contact (dans beaucoup d'exemples que j'ai trouvé sur internet, il était procédé de cette manière...).

    Au moins il n'y a pas de risque de confusion ou quoi que ce soit!

    Bonne soirée les gens!


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/11/2011, 12h30
  2. [AC-2007] Supprimer un jeu d'enregistrements à l'aide d'une boucle For
    Par lakhdar16 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/10/2011, 12h58
  3. Réponses: 0
    Dernier message: 26/09/2011, 04h18
  4. [XL-2003] Enregistrer en passant par VBA
    Par fredschmidt dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2009, 16h10
  5. Réponses: 2
    Dernier message: 29/05/2008, 21h35

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