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 :

Problème de Mapping d'une clé étranger


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Points : 42
    Points
    42
    Par défaut Problème de Mapping d'une clé étranger
    Bonjour tout le monde,
    J'ai fait un mapping de ma BD avec un plugin (MyEclipse) et J'ai un probleme avec le mapping d'une clé étranger entre deux table.
    Une table X avec une clé primaire XID sachant que XID est une classe généré avec mon plugin et qui contient toutes les colonnes de la table X.
    et une table Y qui référence à la clé primaire de la table X comme clé étranger.
    quand j'exécute mon exemple j'obtient l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Caused by: org.hibernate.MappingException: Foreign key (FKB8DCB6CF723F2E2:idconv [GBAGCDAG])) must have same number of columns as the referenced primary key (gb2agen [GBAGCDAG,GBAGSOAG,GBAGEFPA,GBAGAFFS,GBAGCDAL,GBAGACSA,GBAGNUPR,GBAGDTPR,GBAGSOES,NUMIDE,GBAGDTIN,GBAGDTFI,GBAGCDRA])
    	at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90)
    	at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73)
    	at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1145)
    	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1052)
    	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1168)
    	at com.cpa.spi.dao.persona.HibernateUtil.<clinit>(HibernateUtil.java:20)
    	... 4 more
    Le probleme à mon avis est dans le code suivant du fichier hbm de la table Y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <many-to-one name="gb2agenByGbagcdag" class="AgentPolicia" fetch="select">
     <column name="GBAGCDAG" length="6" />
     </many-to-one>
    je croix que ce code fait référence à une clé primaire comme etant une colonne alors qu'elle dois se faire à la classe XID.
    Est ce que j'ai raison dans ce que j'ai dis ? et si oui comment je peut corriger ce probleme.
    Merci d'avance.

  2. #2
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Comme précisé dans la doc de référence Hibernate au paragraphe 8.4, il faut qu'il y ait autant d'éléments <column> dans le <many-to-one> qu'il y a de colonnes qui composent ta clé primaire.

    L'exemple donné est le suivant :
    Mapping de la classe avec clé composée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <class name="OrderLine">   
        <composite-id name="id" class="OrderLineId">
            <key-property name="lineId"/>
            <key-property name="orderId"/>
            <key-property name="customerId"/>
        </composite-id>
        (...)   
    </class>
    Mapping (section many-to-one) de la classe associée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <many-to-one name="orderLine" class="OrderLine">
        <column name="lineId"/>
        <column name="orderId"/>
        <column name="customerId"/>
    </many-to-one>
    Dans ton cas, tu as :
    • plusieurs colonnes dans ta clé composée (certainement dans le composite-id)
    • une seule colonne dans ta clé étrangère (dans le many-to-one)
    d'où l'erreur (must have same number of columns)

  3. #3
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Points : 42
    Points
    42
    Par défaut
    Merci mOuli pour votre réponse.J'ai fait ce que vous m'avez dis mais j'ai encore le même probleme.
    voila mon code hbm de la table X

    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
     
    <hibernate-mapping>
        <class name="AgentPolicia" table="gb2agen" catalog="i1bdd2">
            <composite-id name="id" class="AgentPoliciaId">
                <key-property name="gbagcdag" type="java.lang.String">
                    <column name="GBAGCDAG" length="6" />
                </key-property>
                <key-property name="gbagsoag" type="java.lang.String">
                    <column name="GBAGSOAG" length="35" />
                </key-property>
                <key-property name="gbagefpa" type="java.lang.Long">
                    <column name="GBAGEFPA" precision="1" scale="0" />
                </key-property>
                <key-property name="gbagaffs" type="java.lang.Long">
                    <column name="GBAGAFFS" precision="1" scale="0" />
                </key-property>
                <key-property name="gbagcdal" type="java.lang.String">
                    <column name="GBAGCDAL" length="5" />
                </key-property>
                <key-property name="gbagacsa" type="java.lang.Long">
                    <column name="GBAGACSA" precision="1" scale="0" />
                </key-property>
                <key-property name="gbagnupr" type="java.lang.Long">
                    <column name="GBAGNUPR" precision="2" scale="0" />
                </key-property>
                <key-property name="gbagdtpr" type="java.util.Date">
                    <column name="GBAGDTPR" length="0" />
                </key-property>
                <key-property name="gbagsoes" type="java.lang.Long">
                    <column name="GBAGSOES" precision="1" scale="0" />
                </key-property>
                <key-property name="numide" type="java.lang.Long">
                    <column name="NUMIDE" precision="6" scale="0" />
                </key-property>
                <key-property name="gbagdtin" type="java.util.Date">
                    <column name="GBAGDTIN" length="0" />
                </key-property>
                <key-property name="gbagdtfi" type="java.util.Date">
                    <column name="GBAGDTFI" length="0" />
                </key-property>
                <key-property name="gbagcdra" type="java.lang.String">
                    <column name="GBAGCDRA" length="5" />
                </key-property>
            </composite-id>
            <set name="idconvsForGbagcdta" inverse="true">
                <key>
                    <column name="GBAGCDTA" length="6" />
                </key>
                <one-to-many class="Convocatoria" />
            </set>
    et voila le mappping de la table Y
    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
    <hibernate-mapping>
    	<class name="Convocatoria" table="idconv" catalog="i1bdd2">
    		<id name="codCon" type="java.lang.Integer">
    			<column name="COD_CON" />
    			<generator class="assigned" />
    		</id>
    		<many-to-one name="pe2secc" class="SectorPolicia"
    			fetch="select">
    			<column name="GBSRCDSR" length="4" />
    			<column name="PESECDSE" length="4" />
    		</many-to-one>
    		<many-to-one name="idpers" class="Persona" fetch="select">
    			<column name="COD_PER" />
    		</many-to-one>
    		<many-to-one name="gb2agenByGbagcdag" class="AgentPolicia"
    			fetch="select">
    			<column name="GBAGCDAG" length="6" />
    			<column name="GBAGSOAG" length="35" />
    			<column name="GBAGEFPA" precision="1" scale="0" />
    			<column name="GBAGAFFS" precision="1" scale="0" />
    			<column name="GBAGCDAL" length="5" />
    			<column name="GBAGACSA" precision="1" scale="0" />
    			<column name="GBAGNUPR" precision="2" scale="0" />
    			<column name="GBAGDTPR" length="0" />
    			<column name="GBAGSOES" precision="1" scale="0" />
    			<column name="NUMIDE" precision="6" scale="0" />
    			<column name="GBAGDTIN" length="0" />
    			<column name="GBAGDTFI" length="0" />
    			<column name="GBAGCDRA" length="5" />
    		</many-to-one>
    		<many-to-one name="gb2agenByGbagcdta" class="AgentPolicia"
    			fetch="select">
    			<column name="GBAGCDTA" length="6" />
    		</many-to-one>

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    tu n'as pas 2 fois le meme mapping ???

  5. #5
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Points : 42
    Points
    42
    Par défaut
    J'ai pas bien compris votre question Kdick.Mais si vous parlez d'avoir deux fichier en double dans mon projet alors non j'ai vérifié que j'ai un seul fichier hbm pour chaque table.

  6. #6
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Je pense qu'il voulait dire (à juste titre ) qu'il y a 2 fois la section :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <many-to-one name="gb2agenByGbagcdag" class="AgentPolicia" fetch="select">
       (...)
    </many-to-one>
    dans le mapping de la classe "Convocatoria"
    Commente le 2ème (celui qui n'est pas en rouge) et essaye voir

  7. #7
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 85
    Points : 42
    Points
    42
    Par défaut
    ahhhhhhhhhhhh, j'ai compris.
    non il s'agit pas du même mapping le premier est "gb2agenByGbagcdag" alors que le deuxième est "gb2agenByGbagcdta". Le premier à la fin "dag" et le deuxième à la fin "dta".
    Merci en tout cas .

Discussions similaires

  1. Problème de mapping sur une classe externe
    Par jean-pierre96 dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/08/2010, 16h51
  2. problème avec insert dans une map
    Par LePetitBricoleur dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 11h52
  3. Problème d'utilisation d'une map
    Par Mindiell dans le forum SL & STL
    Réponses: 18
    Dernier message: 06/09/2007, 22h49
  4. [SimpleXML] Google Maps, Problème d'encoding dans une boucle
    Par yahn dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/09/2006, 19h40
  5. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40

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