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 :

[hibernate] Collection d'objet persistent


Sujet :

Hibernate Java

  1. #1
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut [hibernate] Collection d'objet persistent
    Bonjour,

    Je travaille sur un projet J2EE utilisant hibernate 3. J'utilise Hibernate Synchronizer. Tout marche à peu près bien sauf un point : lorsque je veux accéder à une collection d'objet contenu dans un objet persistent. Par exemple dans la classe Car j'ai une collection de Vote (Un véhicule peut avoir plusieurs votes) : impossible d'y accéder, la collection semble non initialisée.

    Je me suis renseigné, notamment sur le lazy loading. Il est donc à priori activé mais je ne suis pas plus avancé...Ma collection n'est toujours pas initialisée (avec ou sans d'ailleur).

    Voici mes fichiers de mapping :
    Fichier Car :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <hibernate-mapping package="test.hibernate">
        <class
            name="Car"
            table="car"
        >
            <id
                name="Id"
                type="integer"
                column="id"
            >
                <generator class="increment"/>
            </id>
     
            <property
                name="Marque"
                column="marque"
                type="string"
                not-null="false"
                length="255"
            />
            <property
                name="Modele"
                column="modele"
                type="string"
                not-null="false"
                length="255"
            />
            <property
                name="Description"
                column="description"
                type="string"
                not-null="false"
            />
            <property
                name="Url"
                column="url"
                type="string"
                not-null="true"
                length="255"
            />
            <property
                name="Dtcreation"
                column="dtcreation"
                type="date"
                not-null="true"
                length="10"
            />
            <many-to-one
                name="User"
                column="user"
                class="User"
                not-null="true"
            >
            </many-to-one>
     
     
            <set name="Votes" inverse="true" lazy="true">
                <key column="id"/>
                <one-to-many class="Vote"/>
            </set>
     
            <set name="Comments" inverse="true" lazy="true">
                <key column="id"/>
                <one-to-many class="Comment"/>
            </set>
     
     
        </class>    
    </hibernate-mapping>
    Fichier Vote :
    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
    <hibernate-mapping package="test.hibernate">
        <class
            name="Vote"
            table="vote"
        >
            <id
                name="Id"
                type="integer"
                column="id"
            >
                <generator class="increment"/>
            </id>
     
            <property
                name="Note"
                column="note"
                type="integer"
                not-null="true"
                length="2"
            />
            <property
                name="Dtcreation"
                column="dtcreation"
                type="date"
                not-null="false"
                length="10"
            />
            <many-to-one
                name="Car"
                column="car"
                class="Car"
                not-null="true"
            >
            </many-to-one>
     
     
        </class>    
    </hibernate-mapping>
    Et voici comment je l'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Car c = carDAO.load(id);        
    Set vote_set = c.getVotes();        
    Iterator it = vote_set.iterator();
    while (it.hasNext()) {
          Vote v = (Vote) it.next();
          System.out.println(v.getNote());
    }
    Ce bout de code m'affiche correctement le premier vote mais pas les autres. Je ne comprends pas pourquoi j'arrive à récupérer qu'un seul élement de mon Set.

    PS : ma base de données est Mysql.

    Si vous avez une idée elle me serait de grand secour ! Merci.

  2. #2
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    Salut,

    dans ton fichier de mapping Vote je comprends pas pourquoi tu mets un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <many-to-one
                name="Car"
                column="car"
                class="Car"
                not-null="true"
            >
     </many-to-one> 
    je mettrai juste un <property name="carId" column="car_id"/>
    Ensuite quel est le code de ta méthode getVotes?

    [ Modéré par SEMPERE Benjamin ]
    Ajout des balises code
    Les Règles du Forum

  3. #3
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut
    Ce code est généré par la fonction de reverse-engeneering d'hibernate synchronizer à partir de la base Mysql existante (et des clés étrangères configurées).

    Je débute avec hibernate mais d'après ce que j'ai pu lire (http://igm.univ-mlv.fr/~dr/XPOSE2004/msamson/#many) ca ne me semble pas faux.

    La méthode getVote() de la classe Car retourne un Set d'objet Vote (en théorie ). Donc lorsque je parcours ce Set je devrais obtenir une dizaine d'objet Vote (que j'ai inséré dans la base de données) mais le pb vient que j'en récupère un seul ...

    Le problème viendrait peut etre de la configuration du lazy loading dans les différents fichiers ou peut etre parceque je ne sais pas exploiter ce Set...allez savoir !


    Méthode getVote() généré par hibernate synchronizer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private java.util.Set<test.hibernate.Vote> votes;
    /**
     * Return the value associated with the column: Votes
     */
    public java.util.Set<test.hibernate.Vote> getVotes () {
            return votes;
    }

  4. #4
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    Ok autant pour moi alors.

    J'peux pas t'aider, j'ai pas les connaissances pour désolé.

    Ps: elle tue ta citation

  5. #5
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut
    Merci d'avoir essayé

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    je ne vois pas pourquoi un seul vote est récupéré (pour moi c'est tous les votes ou aucun)

    Mais pour desactiver le lazy loading change le mapping de ta classe car :

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

  7. #7
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut
    Oui je sais bien, je trouve ca un peu étrange aussi...

    J'ai essayé de désactiver le lazy mais j'obtiens toujours ce même résutat, quand je parcours la boucle j'ai une seul occurence alors que dans ma base j'en ai plein !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    dans ce cas modifie le fichier de configuration Hibernate pour qu'il trace les requêtes envoyés à la base.

  9. #9
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut
    J'ai repris le meme principe avec une nouvelle base et j'ai genéré de nouveau les fichiers de mapping :
    1 Personne -> 1 Ville <=> 1 Ville -> plusieurs personnes.

    J'ai le meme probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Ville v = daoV.load(1);    
    Set s = v.getPersonnes();
    Iterator it = s.iterator();
    while (it.hasNext()) {
       Personne p = (Personne)it.next();
       System.out.println(p.getNom());            
    }
    Contenu de ma base de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID         Nom          Prenom    IDVille
    1         BLABLA2   Loic          1
    8         TEST       Test          1
    Resultat de mon bout de code :
    J'ai configurer le fichier de config d'hibernate pour qu'il affiche les requetes et voila le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select ville0_.id as id1_0_, ville0_.Ville as Ville1_0_ from ville ville0_ where ville0_.id=?
    select personnes0_.id as id1_, personnes0_.id as id0_0_, personnes0_.Nom as Nom0_0_, personnes0_.Prenom as Prenom0_0_, personnes0_.idville as idville0_0_ from personne personnes0_ where personnes0_.id=?
    J'avoue que j'ai un peu de mal à lire la requete générée... Si quelqu'un peut m'aider à la comprendre. Merci

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    la requete permet de confirmer qu'Hibernate ne va chercher qu'une seule personne.

    en fait je crois que le problème viens de ton mapping.

    Dans le mapping suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <set name="Votes" inverse="true" lazy="true">
                <key column="id"/>
                <one-to-many class="Vote"/>
            </set>
    je pense que key column doit désigner la clef étrangere et non la clef primaire.

  11. #11
    Membre habitué Avatar de nesbla
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 220
    Points : 139
    Points
    139
    Par défaut
    Merci ca marche mainteant !

    Avant j'avais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <set name="Personnes" inverse="true">
                <key column="id"/>
                <one-to-many class="Personne"/>
            </set>
    J'ai remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <set name="Personnes" inverse="true">
                <key column="idville"/>
                <one-to-many class="Personne"/>
            </set>
    idville étant la clé étrangère de ma table personne.
    Le mapping automatique de Hibernate synchronizer doit débloquer un peu (ou alors c'est moi ).

    Merci beaucoup !

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

Discussions similaires

  1. Hibernate + suppression d'objets dans une collection
    Par Saiyan54 dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/12/2006, 15h39
  2. [Hibernate] Session & Objets persistants
    Par Gob4 dans le forum Hibernate
    Réponses: 3
    Dernier message: 22/05/2006, 14h13
  3. Probléme collection d'objets
    Par Contrec dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 10h08
  4. [Info]Créer un objet persistent
    Par seb55555 dans le forum JDBC
    Réponses: 5
    Dernier message: 22/02/2005, 16h53
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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