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 :

many to many + property


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut many to many + property
    Bonjour,

    Je voudrais savoir jusqu'où il est possible d'ajouter des attributs à une many to many? Je m'explique :

    Supposons que l'on ait une table Users et une table Games. Un joueur peut jouer à plusieurs parties, et une partie a plusieurs joueurs. C'est donc un cas classique de many-to-many. Je l'ai réprésenté ainsi :

    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
     
    <class name="User" table="Users">
        (...)
            <set name="games" table="UserGames">
                <key column="userId"/>
                <many-to-many class="Game" column="gameId"/>
            </set>
    </class>
     
    <class name="Game" table="Games">
        (...)
            <set name="users" table="UserGames" inverse="true">
                <key column="gameId"/>
                <many-to-many class="User" column="userId"/>
            </set>
     
    </class>

    Maintenant, j'ai envie de rajouter un champ statut lié à l'utilisateur et à une partie. Mais j'ai envie de garder mes relations users et games. Comment faire?

    - Créer explicitement la table UserGames via fichier .hbm.xml ? Je suppose que oui. Que mettre dans cette table? Un composite id (déconseillé dans la litérature)?
    - Remplacer les many-to-many par des one-to-many? Mais alors je perds mes relations...

    Une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        <class name="UserGames" table="UserGames">
            <id name="id" column="id">
                <generator class="native"/>
            </id>
            <property name="status"/>
            <many-to-one name="user" column="userId" class="User"/>
            <many-to-one name="game" column="gameId" class="Game"/>
        </class>

  2. #2
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    Salut ^^ Je ferai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <class name="UserGames"
    		table="user_game">
    		<composite-id>
    	 		<key-many-to-one name="user" column="user"
    					class="User"/>
    	 		<key-many-to-one name="game" column="game"
    					class="Game"/>
    	 	</composite-id>
    </class>

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ok super! Ca à l'air d'être ça.
    Cependant, j'ai tenté de faire comme dans la FAQ, mais hibernate me crée maintenant deux tables, et ce n'est pas vraiment ce que je veux.

    J'ai fait, dans Game.hbm.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            <set name="users">
                <key column="gameId"/>
                <composite-element class="UserGame">
                    <property name="status"/>
                    <many-to-one name="user" class="User"/>
                </composite-element>
            </set>
    Et dans User.hbm.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            <set name="games" inverse="true">
                <key column="userId"/>
                <composite-element class="UserGame">
                    <property name="status"/>
                    <many-to-one name="game" class="Game"/>
                </composite-element>
            </set>
    Cela me crée une table games et une table users plutôt qu'une unique table UserGame...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1790 [main] DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate  - create table games (userId varchar(255) not null, status varchar(255), game bigint not null) ENGINE=InnoDB
    1792 [main] DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate  - create table users (gameId bigint not null, status varchar(255), user varchar(255) not null, primary key (gameId, user)) ENGINE=InnoDB

  5. #5
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    C'est tout a fait normal ... Tu a juste fais le mapping de deux classes :
    - Le mapping de game sur la table game
    - Le mapping de User sur la table user

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Je dois avouer que je ne comprend pas ce que je dois faire.

    Je pars d'une many-to-many à l'origine. Je veux juste pouvoir y ajouter une colonne sans perdre mes relations... Que dois-je faire et/ou où me suis-je trompé?

    I have a many-to-many association between two tables, but the association table has some extra columns (apart from the foreign keys). What kind of mapping should I use?

    Use a composite-element to model the association table. For example, given the following association table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table relationship ( 
        fk_of_foo bigint not null, 
        fk_of_bar bigint not null, 
        multiplicity smallint, 
        created date )
    you could use this collection mapping (inside the mapping for class Foo):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <set name="relationship">
        <key column="fk_of_foo"/>
        <composite-element class="Relationship">
            <property name="multiplicity" type="short" not-null="true"/>
            <property name="created" type="date" not-null="true"/>
            <many-to-one name="bar" class="Bar" not-null="true"/>
        </composite-element>
    </set>
    Pouvez-vous m'aider plus en détail?

  7. #7
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    Je n'ai jamais procédé de cette facon, je ne peux donc pas te guider sur cet exemple ...
    Cependant, ce que tu a sfait est tres différent de ce qui est expliqué dans la FAQ.
    Ajoute ceci dans ton mapping de la classe user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <set name="usergame">
        <key column="userId"/>
        <composite-element class="UserGame"> // ce qui implique que tu dois avoir une classe UserGame
            <property name="blabla" type="short" not-null="true"/>//Les 
            <property name="balblaaaa" type="date" not-null="true"/>
            <many-to-one name="game" class="Game" not-null="true"/>
        </composite-element>
    </set>

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ok, merci.

    Donc d'une manière ou l'autre, on doit déclarer explicitement (pas comme une many-to-many classique) la table intermédiaire et passer par elle pour les relations. Je vais faire avec.


    Merci pour votre aide.

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

Discussions similaires

  1. 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
  2. [hibernate 3] mapping many-to-many
    Par darkyspirit dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/12/2006, 19h37
  3. [Hibernate] delete sur un many-to-many
    Par Gob4 dans le forum Hibernate
    Réponses: 1
    Dernier message: 10/05/2006, 16h26
  4. [EJB2.1 Entity] [XDoclet][JBoss] CMR - Many to Many Relation
    Par dauggui dans le forum Java EE
    Réponses: 4
    Dernier message: 24/04/2006, 11h45
  5. [hibernate]relation many-to-many
    Par quilo dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/12/2005, 10h07

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