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 :

Mapping many to many et id composite


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut Mapping many to many et id composite
    Hello,

    J'utilise JBoss tools sur Eclipse pour générer mes classes / fichiers de mapping hibernate (3.6.0).
    Pour gérer le many to many il crée un Set:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <set name="monSet" table="TABLE1_TABLE2" inverse="false" lazy="true" fetch="select">
                <key>
                    <column name="IDTABLE1" precision="7" scale="0" not-null="true" />
                    <column name="AUTREID" length="5" not-null="true" />
                </key>
                <many-to-many entity-name="com.xxx.TABLE2">
                    <column name="IDTABLE2" precision="7" scale="0" not-null="true" />
                </many-to-many>
            </set>
    Le souci est que dans ma TABLE2 mon ID est (aussi) composite: (IDTABLE2, AUTREID) donc j'obtiens l'erreur de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Foreign key must have same number of columns as the referenced primary key
    Je rajoute donc mon AUTREID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <set name="monSet" table="TABLE1_TABLE2" inverse="false" lazy="true" fetch="select">
                <key>
                    <column name="IDTABLE1" precision="7" scale="0" not-null="true" />
                    <column name="AUTREID" length="5" not-null="true" />
                </key>
                <many-to-many entity-name="com.xxx.TABLE2">
                    <column name="IDTABLE2" precision="7" scale="0" not-null="true" />
                    <column name="AUTREID" length="5" not-null="true" />
                </many-to-many>
            </set>
    Et le souci est que le nom est le même...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.MappingException: Repeated column in mapping for collection: com.xxx.TABLE1.monSet column: AUTREID
    Alors je me sens un peu bloqué, n'est-ce pas gérable avec des noms de colonnes clés qui sont les mêmes dans les tables?
    Car j'imagine que cela fonctionne nickel si mes couples étaient (IDTABLE1, AUTREID) et (IDTABLE2, AUTREIDBIS) mais pas de chance ça a été fait comme ça!

    Si vous avez une solution à me proposer autre que de revoir la bdd j'en serais ravi.
    Je pensais utiliser les annotations JPA mais d'abord je sais pas si je peux avoir le même problème et ensuite j'aimais bien cette automatisation

    Merci d'avance

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut si tu as 2 tables :
    Stock et Category qui ont une relation many_to_many alors, da base de données devrait avoir ces tables ci:
    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
    stock
    {
      stock_id
    }
     
    category
    {
    category_id
    }
     
    stock_category
    {
      id_stock,
    id_category
    }
    et en java tu devrais avoir 2 classes:
    classe Stock
    {
    id
    }

    classe Category
    {
    id
    }
    et dans la mapping-configuration :
    Stock.hbm.xml
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="package.Stock" table="stock" catalog="noncataloge">
            <id name="stockId" type="java.lang.Integer">
                <column name="STOCK_ID" />
                <generator class="identity" />
            </id>
     
            <set name="categories" table="stock_category" 
            	inverse="false" lazy="true" fetch="select" cascade="all" >
                <key>
                    <column name="STOCK_ID" not-null="true" />
                </key>
                <many-to-many entity-name="package.Category">
                    <column name="CATEGORY_ID" not-null="true" />
                </many-to-many>
            </set>
        </class>
    </hibernate-mapping>
    Category.hbm.xml
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="package.Category" table="category" catalog="nomcatalog">
            <id name="categoryId" type="java.lang.Integer">
                <column name="CATEGORY_ID" />
                <generator class="identity" />
            </id>
     
            <set name="stocks" table="stock_category" inverse="true" lazy="true" fetch="select">
                <key>
                    <column name="CATEGORY_ID" not-null="true" />
                </key>
                <many-to-many entity-name="package.Stock">
                    <column name="STOCK_ID" not-null="true" />
                </many-to-many>
            </set>
        </class>
    </hibernate-mapping>
    et cela devrait marcher.
    Dans le cas contraire, peux-tu nous montrer comment est ce que tu as crée tes tables dans la base de données?

    Eric

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Salut,

    Les id sont composite:
    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
    stock
    {
      stock_id (pk)
      general_id (pk)
    }
     
    category
    {
      category_id (pk)
      general_id (pk)
    }
     
    stock_category
    {
      id_stock, (pk, fk1)
      id_category (pk, fk2)
      general_id (pk, fk1, fk2)
    }
    et du coup mes classes:
    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
    class Stock
    {
     StockID id;
    }
     
    class Category
    {
     CategoryID id;
    }
     
    class StockID{
       int id_stock
       String general_id
    }
     
    class CategoryID{
       int id_category
       String general_id
    }
    Je n'aurai effectivement pas de problème si c'étaient de simples id, je n'en aurais pas non plus avec des id composite si le nom n'était pas le même ("general_id") dans mes 2 tables, d’où la 2e erreur.

    Je m'en suis sorti en demandant une modif de la bdd mais par curiosité j'aurais voulu savoir si cette solution était réalisable ou non :-/

  4. #4
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    d´ou provient la cle general_id,
    si tu tiens vraiment a les utiliser, rien ne t´empeche de creer une classe abstraite avec pour id general_id et cela machera aussi.
    et tu n´auras plus de probleme de nom commun.

Discussions similaires

  1. Problème avec Composite-Id (mapping many-to-many))
    Par ammouna24 dans le forum Hibernate
    Réponses: 0
    Dernier message: 07/05/2009, 11h43
  2. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  3. [hibernate 3] mapping many-to-many
    Par darkyspirit dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/12/2006, 19h37
  4. Réponses: 2
    Dernier message: 17/07/2006, 14h45
  5. [Hibernate] Mapping one-to-many + cle composite
    Par brainstorm dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/06/2006, 10h51

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