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] Mapper une classe association


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut [Hibernate] Mapper une classe association
    salut
    je suis sous hibernate3 et g une question sur un mapping:
    g 3 tables deja existantes
    :
    caractéristique(numC, ...) // eg. 1-couleur, 2-poids, ...
    produit(numP, ...) // eg. 1-voiture, 2-velo
    carac_prod(numP, numC, valeur) //eg. 1-1-noire, 1-2-1000, 2-1-rouge, 2-2-15

    Si g bien compris on peut faire le mapping avec 2 classes + 1 classe association (carac-produit)... et il s'agit d'un élément composite sous hibernate. Ma classe produit a ainsi une liste de carac-prod...

    Existe t'il une autre solution: par exemple ma classe produit a une collection ordonnée de caractéristique et une collection de valeur? Ou mieux, une Map par exemple, avec pour clé une classe caractéristique. Est ce que c possible?

  2. #2
    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,

    oui je crois que toutes ces solutions sont possibles et dépendent de la navigabilité de ton association.

    i.e: Quelle classe sera le point de départ de ta recherche ?

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    à partir d'un produit, g besoin de tous les carac et leur valeurs, donc je pars de produis vers n produit-carac.
    J'ai mapper produit et caractéristique et déclaré produit-carac comme un element composite de produit avec un lien one-to-many vers carac (pas forcement utile);

    Ca marche tres bien mais je trouve ca un peu compliqué, j'aurai plutot vu mapper directement la classe prod_carac comme une entité à part entière, mais g pas vu d'exemple, donc je suis pas sur du résultat avec les requetes...

    merci de la réponse

  4. #4
    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
    il est tout a fait possible de mapper une classe association comme une entité persistante à part entière.

    Dans la documentation de référence Hibernate l'exemple Employeur/Employé correspond tout à fait à celà.

    Lien : http://www.hibernate.org/hib_docs/re...-mappings.html

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    je suis d'accord, seulement je ne suis pas convaincu par le schéma de bd généré: pkoi ne pas utiliser les références vers employee et employ comme clés primaires de la relation employment_period?

    est ce possible sous hibernate d'avoir une clé composite qui soit em meme temps des références vers des entités?

  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,

    il est tout à fait possible d'utiliser des FK dans la clé primaire d'une entité.

    on pourrait donc avoir comme mapping un truc du genre :
    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
     
    <class name="Employment" table="employment_periods">
            <composite-id name="id">
               <key-many-to-one name="employer" class="employer" column="employer_id" />
               <key-many-to-one name="employee" class="employee" column="employee_id" />
            </composite-id>
     
            <property name="startDate" column="start_date"/>
            <property name="endDate" column="end_date"/>
     
            <component name="hourlyRate" class="MonetoryAmount">
                <property name="amount">
                    <column name="hourly_rate" sql-type="NUMERIC(12, 2)"/>
                </property>
                <property name="currency" length="12"/>
            </component>
        </class>

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    super

    merci beaucoup, c l'exemple que j'attendais!

  8. #8
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    ... une derniere question sur le sujet: comment implémenter hashcode() avec des clés composées?
    vu que (1,2) est différent de (2,1)

  9. #9
    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
    en général on multiplie par un nombre arbitraire la valeur des deux identifants uniques pour que la somme soit unique.


    par ex 1 * 99 +2 *12 est différent de 2*99 + 1*12


    le tout est de trouver les nombres magiques !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Salut à tous

    une petite question en passant... J'ai vu que pour les composite-id, il fallait réimplémenter les méthode equals() et hashcode()... que doivent faire ces méthodes exactement ?...

    Merci d'avance

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    re-salut

    une autre question...

    j'ai qqs soucis avec le mapping d'une table qui contient une clé composée. Je m'explique : j'ai 2 tables de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Contact { [u]contact_type[/u], [u]id_person[/u], tel,mail }
    Personne { [u]id_person[/u], l_name, f_name}
    le mapping de la table personne est ok, mais apparemment il doit y avoir un souci pour celui de la table contact...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <class name="ClassContact" table="CONTACT">
            <composite-id> 
               <key-property  name="contactType" type="character" column="CONTACT_TYPE" /> 
               <key-many-to-one name="idPerson" class="ClassPerson" column="ID_PERSON" /> 
            </composite-id>
             <property name="tel" type="string" column="TEL"/>
            <property name="mail" type="string" column="MAIL"/>
        </class>
    en fait, quand j'essaye d'ajouter un enregistrement à la table contact, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IllegalArgumentException in class: ClassPerson, getter method of property: idPerson
    si qqn a une idée...
    Merci

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Evitez d'empiler les questions dans un unique thread svp
    Ouvrez 1 thread par question sinon ç'est dur à suivre

    Merci
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    désolé pour la multitude de question...

    en ce qui concerne les méthode equals() et hashcode(), j'ai trouvé un paragraphe dans la doc d'hibernate qui en parle directement (comme quoi, les docs bien faites existent...)
    http://www.hibernate.org/hib_docs/re...equalshashcode

    ça pourrait être utile pour ceux qui se pose la même question...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    bon, pour mon pb de mapping, j'ai modifié uen petite chose : la clé composée... plutôt de définir contactType (clé étrangère faisant partie de la clé primaire...) en many-to-one, je l'ai simplement mis en key-property...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <composite-id> 
               <key-property  name="contactType" type="character" column="CONTACT_TYPE" /> 
               <key-many-to-one name="idPerson" class="ClassPerson" column="ID_PERSON" /> 
            </composite-id>
    le souci c'est qu'on perd la définition de la relation entre les 2 tables... non ? comment fonctionne la mapping lorsqu'il y a relation entre 2 tables ??...

    j'avais pensé à faire mon objet Personne de façon à ce qu'il contienne une liste de contacts... faut-il que j'utilise des "set", des "list" ??... sachant qu'une personne peut posséder plusiers type de contacts (pro, perso, etc...) ...

    quelqu'un peut-il m'éclairer ?

    Merci d'avance

  15. #15
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    http://www.hibernate.org/hib_docs/reference/fr/html/performance.html#performance-collections-mostefficientupdate

    sinon dans le cas précis je ne vois pas l'utilité de déclarer la fk personnID en tant qu'ID composé avec contactID

    merci de créer un nouveau thread qui colle avec le sujet (classe association), on s'y retrouve plus et tu auras plus de chance de trouver des réponses plus appropriées
    merci d'avance

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut fonctionnement des clés composées
    J'ai une table commune avec comme clé composée : le code et le code postal.
    J'aimerai rechercher les communes pour un code postal donné, c'est à dire par un seul élément de la clé. Est-ce possible ?
    J'ai essayé qqes solutions mais il faut tjrs la clé entière.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut fonctionnement des clés composées
    J'ai une table commune avec comme clé composée : le code et le code postal.
    J'aimerai rechercher les communes pour un code postal donné, c'est à dire par un seul élément de la clé. Est-ce possible ?
    J'ai essayé qqes solutions mais il faut tjrs la clé entière.

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

Discussions similaires

  1. [Hibernate] Mapper une association (MCD)
    Par seanbean dans le forum Persistance des données
    Réponses: 0
    Dernier message: 12/04/2012, 13h41
  2. [JPA/Hibernate] Mapper une classe sur plusieurs tables
    Par lamoua76 dans le forum Persistance des données
    Réponses: 4
    Dernier message: 19/01/2012, 11h43
  3. [Hibernate Annotation] Mapper une classe abstraite
    Par DanZzz dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/06/2006, 22h12
  4. Réponses: 10
    Dernier message: 10/01/2006, 14h14
  5. [Hibernate] remplir une classes association
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 31/08/2005, 16h38

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