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 Tools hbm2java] A Foreign key refering A from B has the wrong number of column.


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Par défaut [Hibernate Tools hbm2java] A Foreign key refering A from B has the wrong number of column.
    Bonjour,

    Voici mon problème : je gère une liste de "Item" possédant un id (PK) et un nom et une liste de "Sous-Item" possédant un id (PK) et un nom.

    La relation entre les deux types est qu'un Item possède plusieurs Sous-Item et qu'un même Sous-Item peut appartenir à plusieurs Items.

    Dans ma base j'ai donc déclaré une table SousItem_has_Item avec 2 FK : Item_id et SousItem_id.

    En utilisant l'outil de génération de code de Hibernate Tools j'ai obtenu les classes avec le mapping suivant entre les deux entités :

    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
     
    /**
     * Item generated by hbm2java
     */
    @Entity
    @Table(name = "Item", catalog = "suIVVi")
    public class Item implements java.io.Serializable {
     
    	private ItemId id;
    	private String itemNom;
    	private Set<SousItem> sousItems = new HashSet<SousItem>(0);
     
            //...
     
    	@ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "SousItem_has_Item", catalog = "suIVVi", joinColumns = {
    			@JoinColumn(name = "Item_Item_id", nullable = false, updatable = false),
    			@JoinColumn(name = "Item_VersionProduit_VersionProduit_id", nullable = false, updatable = false),
    			@JoinColumn(name = "Item_VersionProduit_Produit_idProduit", nullable = false, updatable = false),
    			@JoinColumn(name = "Item_VersionProduit_Produit_Questionnaire_Questionnaire_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "SousItem_SousItem_id", nullable = false, updatable = false) })
    	public Set<SousItem> getSousItems() {
    		return this.sousItems;
    	}
     
    	public void setSousItems(Set<SousItem> sousItems) {
    		this.sousItems = sousItems;
    	}
     
    }
    et SousItem :

    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
     
    @Entity
    @Table(name = "SousItem", catalog = "suIVVi")
    public class SousItem implements java.io.Serializable {
     
    	private SousItemId id;
    	private String sousItemNom;
    	private Set<Item> items = new HashSet<Item>(0);
     
    //...
     
    	@ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "SousItem_has_Item", catalog = "suIVVi", joinColumns = { @JoinColumn(name = "SousItem_SousItem_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "Item_Item_id", nullable = false, updatable = false) })
    	public Set<Item> getItems() {
    		return this.items;
    	}
     
    	public void setItems(Set<Item> items) {
    		this.items = items;
    	}
    }
    Lorsque je veux exécuter mon programme j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource
    [ApplicationContextDao.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: 
    A Foreign key refering fr.csie.dao.entities.SousItem from fr.csie.dao.entities.Item has the wrong number of column. 
    should be 2
    Du coup je ne comprends pas ce qui a pu foirer.
    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Par défaut
    De ce que j'en ai vu sur la façon de faire un mapping many-to-many avec les annotations, le code généré est bon.

    L'erreur doit venir d'ailleurs...

    Je continue à chercher ; si toutefois des personnes ont déjà eu ce genre de problème en utilisant spring, hibernate et hibernate tools, je serais ravi de savoir comment elles l'ont résolu.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Par défaut
    Bon alors je retire ce que j'ai dis : c'est bien la génération automatique de hbm2java qui a foiré.

    En fait j'ai modélisé mon modèle avec mysql workbench ; à la base il est bien plus compliqué qu'une simple association many-to-many entre une entité Item et Sous-Item.

    Bref, du coup je me suis retrouvé avec plusieurs clés étrangères dans la table Item (3 FK) et idem dans la table SousItem (1 FK). Ces mêmes clés référencées dans la table intermédiaire Item_hasSousItem qui a cette structure ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Item_HasItem :
        Item_PK
        Item_FK1
        Item_FK2
        Item_FK3
        SousItem_PK
        SousItem_FK1
    Le code généré par hbm2java est celui-ci :

    Pour Item :
    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
     
    @ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "Item_has_SousItem", catalog = "suIVVi", 
    			joinColumns = {
    				@JoinColumn(name = "Item_Item_PK", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK1", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK2t", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK3", nullable = false, updatable = false) 
    			}, 
    			inverseJoinColumns = { 
    				@JoinColumn(name = "SousItem_PK", nullable = false, updatable = false)
    			})
    	public Set<SousItem> getSousItems() {
    		return this.sousItems;
    	}
    Et pour SousItem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "Item_has_SousItem", catalog = "suIVVi", 
    			joinColumns = {
    				@JoinColumn(name = "SousItem_PK", nullable = false, updatable = false),
    				@JoinColumn(name = "SousItem_FK1", nullable = false, updatable = false) 
    			}, 
    			inverseJoinColumns = { 
    				@JoinColumn(name = "Item_PK", nullable = false, updatable = false)
    			})
    	public Set<Item> getItems() {
    		return this.items;
    	}
    Si je tentais de charger ma session j'obtenais l'erreur ci-dessus qui me disais que la clé étrangère référençant SousItem depuis Item n'avais pas le bon nombre de colonne ; que ça devrait être 2. Et de la même façon que la clé étrangère référençant Item depuis SousItem n'avais pas le bon nombre de colonne ; que ça devrait être 4.

    J'ai donc rajouté les colonnes vers les clés étrangères de Item dans la reverse de SousItem et celles de la clé étrangère de SousItem dans la reverse de Item de la sorte :

    Item :
    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
     
    @ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "Item_has_SousItem", catalog = "suIVVi", 
    			joinColumns = {
    				@JoinColumn(name = "Item_Item_PK", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK1", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK2t", nullable = false, updatable = false),
    				@JoinColumn(name = "Item_FK3", nullable = false, updatable = false) 
    			}, 
    			inverseJoinColumns = { 
    				@JoinColumn(name = "SousItem_PK", nullable = false, updatable = false),
                                    @JoinColumn(name = "SousItem_FK1", nullable = false, updatable = false)
    			})
    	public Set<SousItem> getSousItems() {
    		return this.sousItems;
    	}
    Et pour SousItem :
    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
     
    @ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable(name = "Item_has_SousItem", catalog = "suIVVi", 
    			joinColumns = {
    				@JoinColumn(name = "SousItem_PK", nullable = false, updatable = false),
    				@JoinColumn(name = "SousItem_FK1", nullable = false, updatable = false) 
    			}, 
    			inverseJoinColumns = { 
    				@JoinColumn(name = "Item_PK", nullable = false, updatable = false),
                                    @JoinColumn(name = "Item_FK1", nullable = false, updatable = false),
                                    @JoinColumn(name = "Item_FK2", nullable = false, updatable = false),
                                    @JoinColumn(name = "Item_FK3", nullable = false, updatable = false)
    			})
    	public Set<Item> getItems() {
    		return this.items;
    	}
    Et là plus de problème.

    Alors effectivement, je débute dans l'utilisation d'Hibernate et après avoir passé du temps à potasser les doc je me suis rendu compte que le code généré n'était pas bon (de plus l'exception retournée met bien sur la piste pour la correction).

    Je ne sais pas si d'autres personnes ont eu ce problème en utilisant l'outil de génération de code de Hibernate Tools ; quoiqu'il en soit j'édite le titre du thread pour les moteurs de recherche...

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

Discussions similaires

  1. Problème foreign key avec hibernate
    Par souhait dans le forum Hibernate
    Réponses: 5
    Dernier message: 05/09/2008, 15h23
  2. Syntaxe de FOREIGN KEY... REFERENCES
    Par Eric93 dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 30/01/2008, 13h08
  3. Réponses: 2
    Dernier message: 09/08/2007, 12h38
  4. [Débutant] Hibernate + Foreign key
    Par g.greg45 dans le forum Hibernate
    Réponses: 6
    Dernier message: 07/02/2007, 14h15
  5. [REFERENCES/FOREIGN KEY]problème d'unicité de clé
    Par Guigui_ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/01/2005, 16h47

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