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 :

Clefs composees +mapping 3 tables


Sujet :

Hibernate Java

  1. #1
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut Clefs composees +mapping 3 tables
    Bonjour,

    une question qui fait suite a mon dernier post
    je dispose d'actuellement trois tables (dans une base de donnees Oracle) dont je ne parviens a ecrire le mapping.
    Ce que je souhaite a faire est la representation des clefs primaires de ces tables

    TASQUES_DOCUMENTS ------ DOCUMENTS
    TTD_SYS ------------------------ TDO_SYS
    TDO_CODI-------------------- TDO_CODI
    TTQ_CODI


    TASQUES_DOCUMENTS --- TASQUES
    TTD_SYS ------------------ TTQ_SYS
    TDO_CODI
    TTQ_CODI ---------------- TTQ_CODI

    J'ai donc defini DOCUMENTS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <hibernate-mapping package="net.gencat.uid.model.param.document">
       <class
          name="Document"
          table="UIDT_DOCUMENTS">
          <composite-id>
             <key-property name="dosys" column="TDO_SYS" />
             <key-property name="docodi" column="TDO_CODI" />
          </composite-id>
       </class>   
    </hibernate-mapping>

    puis TASQUES :

    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
    <hibernate-mapping package="net.gencat.uid.model.param.tasca">
       <class
          name="Tasca"
          table="UIDT_TASQUES">
          <composite-id>
             <key-property name="tqsys" column="TTQ_SYS" />
             <key-property name="tqcodi" column="TTQ_CODI" />
          </composite-id>
          <set name="tascaDocuments" inverse="true" lazy="true" order-by="TDO_CODI">
             <key>
                <column name="TTQ_CODI"/>
                <column name="TTQ_SYS"/>
             </key>
             <one-to-many class="net.gencat.uid.model.param.tasca.TascaDocument"/>
          </set>
       </class>   
    </hibernate-mapping>

    et enfin TASQUES_DOCUMENTS :

    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
    <hibernate-mapping package="net.gencat.uid.model.param.tasca" >
       <class
          name="TascaDocument"
          table="UIDT_TASQUES_DOCUMENTS">
          <composite-id name="id" class="TascaDocumentPK">
             <key-property name="tdsys" column="TTD_SYS"/>
             <key-many-to-one name="tasca"
                class="net.gencat.uid.model.param.tasca.Tasca">
                <column name="TTQ_SYS"/>
                <column name="TTQ_CODI"/>
             </key-many-to-one>
             <key-many-to-one name="document"
                class="net.gencat.uid.model.param.document.Document">
                <column name="TDO_SYS"/>
                <column name="TDO_CODI"/>
             </key-many-to-one>   
          </composite-id>
       </class>   
    </hibernate-mapping>

    Vous l'aurez certainement compris, c'est sur ce dernier que j'ai des soucis. Quand j'essaye d'acceder a travers mon set qui est dans Tasques cela me declenche une erreur de type SQLGrammarException. Certainement parce que ce mapping n'est pas bon.
    J'ai bien cree les classes associes, ainsi que celle qui contient la clef primaire de Tasques_Documents.
    La difficulte dans ce cas de figure est que la cle ttd_sys est utilisee comme etant une des clefs composees de la classe Tasca, mais aussi de classe Documents.

    Avez-vous une idee ? Avec les composants ?

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Pour voir si j'ai bien compris : En gros tu essaye de faire un many-to-many avec comme clé primaire 2 clés dont une est commune entre les 2 tables (tasques et documents)?

  3. #3
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Ca pourrait ressembler a un many-to many effectivement, le seul truc c'est que ma table intermediaire (tasques_documents) contiendra d'autres donnees et du coup je ne suis pas sur que la many-to-many soit approprie.
    Enfin je crois. J'avoue etre assez "noob" sur Hibernate et du coup j'ai du mal a percevoir quel est la methode la plus appropriee a utiliser.

    Pour repondre a ta question, oui c'est grosso-modo ce que je veux faire.

  4. #4
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    En faite moi non plus je ne suis pas un veteran de Hibernate, mais j'aurais plutot fait un truc de ce style (ne pas tembeter avec des composites, faire un id pour un document et un task) et ne gérer que cette id (m'enfin si c'est faisable):

    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
    <hibernate-mapping package="net.gencat.uid.model.param.tasca" >
       <class
          name="TascaDocument"
          table="UIDT_TASQUES_DOCUMENTS">
          <id name="id" column="id"/>
          <many-to-one name="tasca"
                class="net.gencat.uid.model.param.tasca.Tasca">
                <column name="TTQ_SYS" column="TTD_SYS"/>
                <column name="TTQ_CODI"/>
          </many-to-one>
          <many-to-one name="document"
                class="net.gencat.uid.model.param.document.Document">
                <column name="TDO_SYS" column="TTD_SYS"/>
                <column name="TDO_CODI"/>
          </many-to-one>   
          </composite-id>
       </class>   
    </hibernate-mapping>
    J'ai fait ca un peu à l'arrache sur le site sans regarder s'il y avait des erreurs. C'était juste pour te donner des idées

  5. #5
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Oui pourquoi pas.
    Mais je n'ai pas de champ id dans ma table alors je vois pas trop ce que tu veux dire ?!!
    Basiquement j'ai trois clefs primaires qui sont
    TTD_SYS, TDO_CODI et TTQ_CODI

    Et au moment de faire des insert, update ou delete si je n'ai pas defini ces clefs comme clefs composees ca risque de poser un probleme, non ?
    J'ajoute que je ne peux pas modifier la structure de la base de donnees, je dois faire avec sinon je devrais discuter pas mal de temps avec l'analyste fonctionnel

  6. #6
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Ah ben dans ce cas alors oubli mon id et refait tes composites, lol!
    Pck je voulais te faire changer ta base, !

    donc essaye ceci :

    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
    <hibernate-mapping package="net.gencat.uid.model.param.tasca" >
       <class
          name="TascaDocument"
          table="UIDT_TASQUES_DOCUMENTS">
          <composite-id>
                 <key-property name="TTD_SYS"/>
                 <key-property name="TTQ_CODI"/>
                 <key-property name="TDO_CODI"/>
          </composite-id>      
         <many-to-one name="tasca"
                class="net.gencat.uid.model.param.tasca.Tasca">
                <column name="TTQ_SYS" column="TTD_SYS"/>
                <column name="TTQ_CODI"/>
          </many-to-one>
          <many-to-one name="document"
                class="net.gencat.uid.model.param.document.Document">
                <column name="TDO_SYS" column="TTD_SYS"/>
                <column name="TDO_CODI"/>
          </many-to-one> 
       </class>   
    </hibernate-mapping>

  7. #7
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    <column name="TTQ_SYS" column="TTD_SYS"/>

    n'est pas accepte !

  8. #8
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Et le probleme est le suivant :

    Comment dire que TTQ_SYS de TASQUES est relie TTD_SYS de TASQUES_DOCUMENTS ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Il y a aussi la fonction EDITER qui marche pas mal.

    Juste une remarque sur l'idée de maxf1. Perso moi aussi j'aurai défini une colonne de plus dans DOCUMENT et TASQUE pour mettre un id qui servirait de clef primaire. C'est une clef technique, artificielle. Pour ton référent fonctionnel dans le fond il n'a même pas à le savoir : c'est technique. Du moment que tu t'assures que la clef métier sera bien géré (ex: rajoute une contrainte unique sur les 2 champs qui forment la clef métier).

    En plus je pense que les SGBD gérent toujours plus efficacement des clefs primaires qui sont simplement un nombre, plutot que des clefs composés. (on doit pas sentir très souvent la différence de performance je l'accorde). Mais c'est une discussion à avoir plutot dans les forums SGBD.
    EDIT: Ah ben oui, voir ce lien , au chapitre 2.5.1 sur la qualité d'une clef primaire et au 2.5.2 sur la combinaison "clef techinque/clef métier"

    Au niveau de tes beans tu pourras définir les méthodes equals() et hashcode() de façon à travailler sur la clef métier.

    Pour les doc, peut être des pistes dans la doc d'Hibernate chapitre 4.3 et/ou 15.9

  10. #10
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Bon sur le fond je suis plutot d'accord avec toi Neoh, defnir une cle de moins ca serait plus commode.
    Mais bon, si on part du principe que la base de donnees existe deja et que je peux pas la modifier, comment je pourrais realiser ce mapping ?
    La question n'est pas comment modifier ma base de donnees mais comment la mapper ?
    Si ca ne tenait qu'a moi je modifierais pas mal de choses dans la base actuelle (et je sais meme pas si je me ferais ***** a utiliser Hibernate avec le peu de connaissance que j'ai sur la question, mais bon avec des si ...)

Discussions similaires

  1. [ADO] Mapping de table
    Par s.n.a.f.u dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 18/06/2007, 14h53
  2. Mapping classes - tables (outil)
    Par taroudant dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/05/2007, 17h09
  3. Probleme sur clef composee
    Par dridridri dans le forum Oracle
    Réponses: 4
    Dernier message: 01/11/2006, 11h59
  4. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 21h06
  5. récupérer la clef primaire d'une table
    Par orionis69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/02/2004, 13h00

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