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 :

[Débutant]Hibernate Clés Étrangères


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 46
    Points : 29
    Points
    29
    Par défaut [Débutant]Hibernate Clés Étrangères
    Bonjour, je suis assez novice sous cette technologie c'est pourquoi je vien s demander quelques conseilles.

    1- Je travaille sur une appli et j'utilise un partie d'une base. Mais il y a des relations entre les tables de telle sorte que je suis confus. J'ai utilisé myGeneration pour générer mes classes et mes fichiers de mapping. Dans une relation Many-to-One entre les tables A et B j'ai la création d'une clé étrangère dans la table B par exemple. Je voudrais savoir s'il faut que je crée aussi une classe mappée à la table A.

    2- Aussi, l'architecture de mon appli fait en sorte que mes classes mappées sont dans un package à part. Comment donc faire pour faire communiquer ce package avec la partie graphique qui se trouve dans un autre package. Un simple import suffira-t-il? En plus, où dois-je placer la classe qui gère la configuration de Hibernate, dans le package des fichiers de mapping?

    Merci de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Citation Envoyé par benny7
    1- Je travaille sur une appli et j'utilise un partie d'une base. Mais il y a des relations entre les tables de telle sorte que je suis confus. J'ai utilisé myGeneration pour générer mes classes et mes fichiers de mapping. Dans une relation Many-to-One entre les tables A et B j'ai la création d'une clé étrangère dans la table B par exemple. Je voudrais savoir s'il faut que je crée aussi une classe mappée à la table A.
    Le cas le plus général est "1 table = 1 entité = 1 classe", donc oui a priori si tu veux mapper les données de A, il te faut faire une classe en face de cette table.

    2- Aussi, l'architecture de mon appli fait en sorte que mes classes mappées sont dans un package à part. Comment donc faire pour faire communiquer ce package avec la partie graphique qui se trouve dans un autre package. Un simple import suffira-t-il? En plus, où dois-je placer la classe qui gère la configuration de Hibernate, dans le package des fichiers de mapping?

    Merci de votre aide
    En Java l'organisation en packages sert (presque) uniquement à éviter que tout soit en foutoir. Tu peux mettre toutes tes classes dans un même package, ou faire un package par classe.

    La solution recommandée est quand même de regrouper les classes en packages suivant ce qu'elles font : un package pour les classes mappées et un pour l'interface graphique c'est bien. Dans ce cas un simple import suffit aux classes de l'UI pour utiliser les classes mappées.

  3. #3
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par benny7
    1- Je travaille sur une appli et j'utilise un partie d'une base. Mais il y a des relations entre les tables de telle sorte que je suis confus. J'ai utilisé myGeneration pour générer mes classes et mes fichiers de mapping. Dans une relation Many-to-One entre les tables A et B j'ai la création d'une clé étrangère dans la table B par exemple. Je voudrais savoir s'il faut que je crée aussi une classe mappée à la table A.
    Pour ne rajouter une info que sur ce point :
    Certes la génération de mapping se fait automatiquement et repose sur un mapping élémentaire 1 objet == 1 table. Toutefois, je maintiens l'idée que ceci n'est pas toujours des plus optimisé d'un point de vue BDD. Je pense qu'il faut réellement procéder de la manière suivante :

    1- Création d'un modele objet
    2- Création d'un modèle de donnée (normalisé !!!)
    3- Réalisation du mapping en conséquence

    A partir du moment où la base de données est normalisé Hibernate n'aura AUCUNE difficulté à mapper objet/relationnel. D'ailleurs, même dénormalisé, il apporte un lot de solutions non négligeable. Cette méthode optimisera selon moi bien mieux ton application. Mais bon, chacun ses choix quant à tout cela

    L'important est donc de mapper tous les attributs de la base au moins une fois histoire de bien retranscrire l'ensemble des données sur le modèle objet.

    Un exemple parlant du mapping automatique : ce dernier se contente (il me semble) d'assurer des relations unidirectionnelle à partir de la base de données alors qu'hibernate lui même préconise les relations bidirectionnelles dans sa documentation (meilleure navigation et requete plus facile à faire via l'API Criteria entre autres )

    Bon courage pour la suite

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    Merci de vos réponses. Donc en conclusion, pour mes clés étrangères, je dois créer des classes pour elles?
    Pour info, le modèle objet est bon et le modèle de données aussi puisque je reprends une base déjà efective.

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Euh, je ne vois pas trop ce que tu veux dire... mais voici comment se passe en règle général un mapping :

    Modele Objet :
    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
    Class A {
       int idA;
       String att1A;
       B  att2A;
    //constructeurs par défaut et avec tous les arguments
    //getters et setters au moins
    }
    
    Class B {
       int idB;
       float att1B;
       Collection att2B; //collections d'elements C
    //constructeurs par défaut et avec tous les arguments
    //getters et setters au moins
    }
    
    Class C {
       int C
       String att1C;
       Collection att2C; //collection d'elements B (inverse de celle de B->C)
    //constructeurs par défaut et avec tous les arguments
    //getters et setters au moins
    }
    Base de données :
    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
     
    TABLE A (
       ID_A       INTEGER NOT NULL PK,
       ATT1_A   VARCHAR(255),
       ATT2_A   INTEGER,
       FK_ATT2_B FOREIGN KEY(ATT2_A) REFERENCES B(ID_B)
    );
     
    TABLE B (
       ID_B        INTEGER NOT NULL PK,
       ATT1_B    NUMBER(6,2)
    );
     
    TABLE C (
       ID_C        INTEGER NOT NULL PK,
       ATT1_C    VARCHAR(255)
    );
     
    TABLE B2C (
       ID_B        INTEGER NOT NULL,
       ID_C        INTEGER NOT NULL,
       PK_B2C   PRIMARY KEY (ID_B,ID_C),
       FK_IDB_B FOREIGN KEY (ID_B) REFERENCES B(ID_B),
       FK_IDC_C FOREIGN KEY (ID_C) REFERENCES B(ID_C)
    );
    Et voici le mapping correspondant :
    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
    <hibernate-mapping>
       <class name="A" table="A">
          <id name="idA" column="ID_A">
             <generator class="native" />
          </id>
          <property name="att1A" column="ATT1_A" />
          <!-- ICI OBJET DE TYPE B, le type doit donc être mappé aussi -->
          <property name="att2A" column="ATT2_A" type="B" />
       </class>
       <class name="B" table="B">
          <id name="idB" column="ID_B">
             <generator class="native" />
          </id>
          <property name="att1B" column="ATT1_B" />
          <!-- ICI COLLECTION D'ELEMENTS DE TYPE C, le type doit aussi etre mappé -->
          <set name="att2B" table="B2C">
            <key column="ID_B"/>
            <many-to-many column="ID_C" class="C"/>
          </set>
       </class>
       <class name="C" table="C">
          <id name="idC" column="ID_C">
             <generator class="native" />
          </id>
          <property name="att1C" column="ATT1_C" />
          <!-- association inverse ... pour une association bidirectionnelle. 
          Penser au inverse="true" et mapper la classe concernée (ici B) -->
          <set name="att2C" table="B2C">
            <key column="ID_C"/>
            <many-to-many column="ID_C" class="B" inverse="true" />
          </set>
       </class>
    </hibernate-mapping>
    J'espere qu'avec cet exemple tu verras mieux ce que tu dois mappé et comment le faire

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    Je te remercie de ton aide, je pense avoir compris.
    C'est très gentil ...

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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