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 :

Realation many-to-many + attributs d'association


Sujet :

Hibernate Java

  1. #1
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut Realation many-to-many + attributs d'association
    Bonjour,

    Je n'arrive pas à modéliser le mapping de mon cas de figure, je m'explique :

    Je gère des jurys, composés de juges, dont ces derniers peuvent actif ou inactif.
    Soit une table jury, une table juge et un table d'association avec en plus l'attribut actif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JURY(id, nom, description)
    JUGE(id, nom)
    JURY_JUGE(id, jury, juge, actif)
    Comme vous le remarquerez, la table association a son propre id mais je ne pense pas que ca pose de réel problème vu qu'il est généré automatiquement par la base.

    Au niveau du mapping, je ne souhaite pas avoir une classe de la table association, je suis donc parti sur un mapping many-to-many pour réaliser mon association.

    La ou ca se complique, c'est quand récupérant un objet jury et la liste des juges associés, je veux savoir quel juges est actif ou inactif.
    Inversement, quand je récupère un objet juge et la liste des jurys associés, je veux savoir dans quel jury le juges est actif ou inactif !

    Et le je suis paumé au niveau du mapping
    Auriez vous une idée ?
    Merci

  2. #2
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Puisque le lien entre jury et juge contient l'information actif/inactif, il est a priori obligatoire d'avoir une classe d'association qui contient ce flag, non ?
    Par contre, s'il n'y avait pas d'info sur le lien tu n'aurais pas besoin d'avoir cette classe, puisque Hibernate gère correctement les liens n-n SANS information sur le lien.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    N'utilisez pas d'associations de mapping exotiques.
    De bons cas d'utilisation pour de vraies associations plusieurs-vers-plusieurs sont rares. La plupart du temps vous avez besoin d'informations additionnelles stockées dans la table d'association. Dans ce cas, il est préférable d'utiliser deux associations un-vers-plusieurs vers une classe de liaisons intermédiaire. En fait, nous pensons que la plupart des associations sont de type un-vers-plusieurs ou plusieurs-vers-un, vous devez être très attentifs lorsque vous utilisez autre chose et vous demander si c'est vraiment nécessaire.
    Conseil trouvé dans la doc Hibernate, à la fin du document.

  4. #4
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Effectivement je me souvient de cette phrase (utilisant hibernate annotation, j'étais plus concentré dans la doc de ce dernier)
    Bon on va eviter de trop compliquer le mapping alors, et se concentrer sur une bonne transformation des données pour le passage en objet métier.

    Par contre, je ne vois pas encore comment je vais pouvoir récup les données de mes deux requetes, enfin on va se demerder

    Merci fr1man

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Une requête HQL avec jointures, ou l'utilisation de Criteria devrait te permettre de trouver tes données sans trop de difficultés.

  6. #6
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Me revoila avec mon problème de jointure (que j'avais mis de coté depuis ce temps)

    J'ai donc créé mes trois entités avec des relations one-to-many dans JURY et JUGE et a l'inverse des relations many-to-one dans JURY_JUGE

    Voila les fichiers de mapping pour info :
    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
     
    @Entity
    @Table(name = "jury")
    public class JuryBean implements Serializable {
     
        @Id
        @Column(name = "id", nullable = false)
        private Integer id;
     
        @Column(name = "nom", nullable = false)
        private String nom;
     
        @Column(name = "description", nullable = false)
        private String description;
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "jury")
        private Collection<JuryJugeBean> juryJugeCollection;
    }
     
    @Entity
    @Table(name = "juge")
    public class JugeBean implements Serializable {
     
        @Id
        @Column(name = "id", nullable = false)
        private Integer id;
     
        @Column(name = "nom", nullable = false)
        private String nom;
     
        @Column(name = "nom_complet", nullable = false)
        private String nomComplet;
     
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "juge")
        private Collection<JuryJugeBean> juryJugeCollection;
    }
     
    @Entity
    @Table(name = "jury_juge")
    public class JuryJugeBean implements Serializable {
     
        @Id
        @Column(name = "id", nullable = false)
        private Integer id;
     
        @Column(name = "actif", nullable = false)
        private boolean actif;
     
        @Column(name = "nouveau", nullable = false)
        private boolean nouveau;
     
        @JoinColumn(name = "juge", referencedColumnName = "id")
        @ManyToOne
        private JugeBean juge;
     
        @JoinColumn(name = "jury", referencedColumnName = "id")
        @ManyToOne
        private JuryBean jury;
    }
    Ce mapping à été généré automatiquement avec netbeans


    A partir de la, je veux pouvoir executer une requete qui me charge la liste des juges appartenant à un jury.
    En EJB-QL (HQL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select j from JugeBean j where j.juryJugeCollection.jury.id = ?
    Mais cela ne marche pas, il me genère une erreur illegal syntax near collection: jury
    Et les logs complet
    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
     
    11:29:01,477 DEBUG SessionImpl:220 - opened session at timestamp: 11617685414
    11:29:01,481 DEBUG QueryPlanCache:70 - unable to locate HQL query plan in cache; generating (select j from JugeBean j where j.juryJugeCollection.jury.id = ?)
    11:29:01,509 DEBUG QueryTranslatorImpl:246 - parse() - HQL: select j from org.myorg.bean.JugeBean j where j.juryJugeCollection.jury.id = ?
    11:29:01,533 DEBUG AST:266 - --- HQL AST ---
     \-[QUERY] 'query'
        +-[SELECT_FROM] 'SELECT_FROM'
        |  +-[FROM] 'from'
        |  |  \-[RANGE] 'RANGE'
        |  |     +-[DOT] '.'
        |  |     |  +-[DOT] '.'
        |  |     |  |  +-[DOT] '.'
        |  |     |  |  |  +-[IDENT] 'org'
        |  |     |  |  |  \-[IDENT] 'myorg'
        |  |     |  |  \-[IDENT] 'bean'
        |  |     |  \-[IDENT] 'JugeBean'
        |  |     \-[ALIAS] 'j'
        |  \-[SELECT] 'select'
        |     \-[IDENT] 'j'
        \-[WHERE] 'where'
           \-[EQ] '='
              +-[DOT] '.'
              |  +-[DOT] '.'
              |  |  +-[DOT] '.'
              |  |  |  +-[IDENT] 'j'
              |  |  |  \-[IDENT] 'juryJugeCollection'
              |  |  \-[IDENT] 'jury'
              |  \-[IDENT] 'id'
              \-[PARAM] '?'
     
    11:29:01,554 DEBUG ErrorCounter:68 - throwQueryException() : no errors
    11:29:01,558 DEBUG HqlSqlBaseWalker:111 - select << begin [level=1, statement=select]
    11:29:01,562 DEBUG FromElement:105 - FromClause{level=1} :  org.myorg.bean.JugeBean (j) -> jugebean0_
    11:29:01,585 DEBUG FromReferenceNode:51 - Resolved :  j -> jugebean0_.id
    11:29:01,597 DEBUG FromReferenceNode:51 - Resolved :  j -> jugebean0_.id
    11:29:01,601 DEBUG DotNode:541 - getDataType() : juryJugeCollection -> org.hibernate.type.BagType(org.myorg.bean.JugeBean.juryJugeCollection)
    11:29:01,633 DEBUG FromElementFactory:360 - createEntityAssociation() : One to many - path = j.juryJugeCollection role = org.myorg.bean.JugeBean.juryJugeCollection associatedEntityName = org.myorg.bean.JuryJugeBean
    11:29:01,643 DEBUG FromElement:105 - FromClause{level=1} :  org.myorg.bean.JuryJugeBean (no alias) -> juryjugeco1_
    11:29:01,648 DEBUG FromClause:233 - addJoinByPathMap() : j.juryJugeCollection -> jury_juge juryjugeco1_
    11:29:01,673 DEBUG DotNode:265 - dereferenceCollection() : Created new FROM element for j.juryJugeCollection : jury_juge juryjugeco1_
    11:29:01,677 DEBUG FromReferenceNode:51 - Resolved :  j.juryJugeCollection -> .
    11:29:01,691 DEBUG DotNode:541 - getDataType() : jury -> org.hibernate.type.ManyToOneType(org.myorg.bean.JuryBean)
    11:29:01,699 ERROR PARSER:33 -  illegal syntax near collection: jury
    11:29:01,711 DEBUG ErrorCounter:28 -  illegal syntax near collection: jury
     illegal syntax near collection: jury
            at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:485)
    Normal me direz vous car ma collection ne comporte pas de propriété jury, mais je ne vois pas comment faire

    Une idée ?
    merci

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Et avec quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select j from JugeBean j inner join j.juryJugeCollection collection
    where collection.jury.id = ?

  8. #8
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Tu peux essayer aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select jjb.juge
      from JuryJugeBean jjb
     where jjb.jury.id = :myJuryId

  9. #9
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Fr1man : comme dans ma requete, on essaye d'appeler la propriété jury d'un objet collection, alors je pense que ca va revenir au même (dans mon log on voit que la jointure implicite ce fait bien)

    Par contre l'idée de xv-mnt à l'air intéressante, je teste ca des que je peux et je vous tien au courant.

    Merci à tous les deux

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Je ne pense pas que ça revienne au même.
    Toi tu fais: "collection.uneValeur", donc forcément ça ne marche pas.

    La requête que je propose fait une jointure.
    J'ai mal choisi l'alias, qui en fait n'est pas une collection.

    Regarde la doc hibernate, chapitre HQL:
    from Cat as cat
    left join cat.kittens as kitten
    with kitten.bodyWeight > 10.0
    C'est le même principe.

  11. #11
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Autant pour moi je ne l'avais pas compris dans ce sens
    Je me suis dit que dans ma première requete le jointure était implicite enfait pas vraiment.

    En tout cas une grand MERCI a tout les deux, car vaut deux requetes fonctionnent parfaitement

    Je comprend un peu mieux le HQL maintenant, c'est pas si loin du raisonnement SQL finalement

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

Discussions similaires

  1. [2.x] [Symfony2] Many-to-Many bidirectionnelle avec attributs
    Par Legenyes dans le forum Symfony
    Réponses: 0
    Dernier message: 03/06/2013, 14h33
  2. Mapper une association many to many avec des attributs
    Par deli_devellopez dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/05/2013, 21h25
  3. Réponses: 0
    Dernier message: 25/07/2011, 17h42
  4. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  5. Réponses: 3
    Dernier message: 01/03/2007, 14h51

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