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] one-to-one et many-to-many


Sujet :

Hibernate Java

  1. #1
    Invité
    Invité(e)
    Par défaut [MAPPING] one-to-one et many-to-many
    Bonjour à toutes et tous,

    Je dois associer un utilisateur à des rôles au travers d'un objet qui vas contenir cette relation.

    Mes tables (PostgreSQL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE user (
      uid SERIAL NOT NULL
    );
    CREATE TABLE role (
      rid SERIAL NOT NULL
    );
    CREATE TABLE user_role (
      uid INTEGER NOT NULL,
      rid INTEGER NOT NULL,
      -- FOREIGN KEYS ...
    );
    Mon objet "Affectation" qui me sert à associer un utilisateur à un ou plusieurs rôles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Affectation {
      private User user;
      private List<Role> roles;
     
      // get et set..
    }
    Et le mapping suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <class name="xx.Affectation" table="user_role">
      <id column="uid" name="id">
        <generator class="foreign">
          <param name="property">user</param>
        </generator>
      </id>
     
      <one-to-one name="user" constrained="true" />	
     
      <bag name="roles" table="user_role" lazy="false">
        <key column="uid"/>   			
        <many-to-many class="xx.Role" column="rid" unique="false"/>
      </bag>
    </class>
    Mais les insertions ne fonctionnent pas car la requête générée n'insère que l'id de l'utilisateur et qu'il y à une contrainte "NOT NULL" sur la colonne "user_role"."rid" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into user_role (uid) values ('2')
    J'ai essaué de rajouter "casacade=all" ou "casacade=save-update" ainsi que "inverse=true" mais rien ne change.

    Pouvez-vous m'aider ? Merci

  2. #2
    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
    Par défaut
    Tu n'as pas à gérer toi même la table de jointure.
    Regarde bien l'exemple de la doc:
    http://docs.jboss.org/hibernate/stab...ional-join-m2m

  3. #3
    Invité
    Invité(e)
    Par défaut
    En dehors du set alors que j'utilise un bag, je ne vois pas de différences quand au mapping de la collection..
    Ou alors l'identifiant mais je ne pense pas que calà aie de l'importance..

  4. #4
    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
    Par défaut
    Moi ce que je vois c'est que tu as un mapping pour la table user_role, alors que dans la doc, il n'y en a pas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Si il y en à une, ou alors je en comprend pas tes propos : "<set name="addresses" table="PersonAddress">; "PersonAddress" est la table de relation non ?

    La nuance est que chez moi je stocke la relation dans un autre objet. Si on reprend l'exemple d'Hibernate on aurais une classe "Habitations" qui contiendrais une référence sur "Person" et une une liste d'"Address".

  6. #6
    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
    Par défaut
    Ce que j'essaie de te dire, c'est que la table d'association existe bien, mais tu n'as pas besoin de créer une classe et un mapping.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci, je sais que je n'ai pas besoin mais dans ce cas je dois.. toute la nuance est la. Mon objet "User" ne peux pas être pollué par la liste de "Role"s.. c'est un peu spécial comme idée mais c'est comme ça.

  8. #8
    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
    Par défaut
    Je ne comprends pas ce que tu veux exactement.

    Si la relation many-to-many ne te convient pas, utilise un double one-to-many et tu gères toi même la table/classe d'association, ce qui te permettra, en plus, de gérer d'autres attributs que les identifiants.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ce que je veux, c'est mapper un objet qui contient l'objet "User" et les "Role"s auxquel il est attaché.
    La relation many-to-many me semble correcte mais lorsque je tente de faire une insertion le sql généré ne prend en compte que l'identifiant de "User" et donc, ne fonctionne pas.
    Mon problème est donc de faire fonctionner mon mapping pour pouvoir créer, récupérer, modifier et supprimer les affectations (user 1->N role).

    Merci pour tes réponses

  10. #10
    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
    Par défaut
    Ca, j'avais bien compris, mais tu dis que tu ne veux pas pouvoir accéder à tes roles à partir d'un user, n'est-ce pas ?
    Explique moi pourquoi ?
    Tu préfères accéder aux users à partir d'un rôle ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas tellement que je ne veux pas. C'est simplement que l'information sur les rôles ne sert que dans un seul écran de toute l'application (Je n'ai pas besoin d'identifier l'utilisateur, juste des infos de role).
    Donc je ne veux pas venir alourdir l'objet User avec une information dont j'aurais besoin une fois sur 100 (ou moins). Et je ne veux/peux pas faire de LazyLoading.

    Je n'ai donc pas besoin d'avoir de relation directe entre "User" et "Role", tout se passe via l'objet "Affectation"

Discussions similaires

  1. Mapping NH One to one et many to one
    Par charouel dans le forum C#
    Réponses: 0
    Dernier message: 04/10/2012, 11h27
  2. Problème de mapping Foreign key one-to-one
    Par chady dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/06/2010, 23h35
  3. Mapping de relations one-to-many et inverse
    Par Invité dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/04/2008, 16h41
  4. 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
  5. mapping de deux one-to-many
    Par emilie_caroline dans le forum Hibernate
    Réponses: 11
    Dernier message: 30/11/2006, 16h58

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