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 :

Relation d'une entité avec elle-même [Mapping]


Sujet :

Hibernate Java

  1. #1
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut Relation d'une entité avec elle-même
    Bonjour,

    j'ai un blanc sur la question de savoir comment gérer une liste de User par un User avec Hibernate.

    Ma problématique est simple : j'ai des objets "User" qui ont une liste de contacts, donc de "User". Comment persister cette relation dans ma base de données alors que je n'ai pas de classe avec laquelle faire mon "mapped by" ?

    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
    public Class User {
     
      @Id
      private Long idUser;
     
      @OneToMany
      private List<User> mesContacts;
     
      public User () {
        mesContacts = new List<User>();
      }
     
      ...
     
    }

    En réalité je ne sais pas si le OneToMany est la meilleure option.
    Je pensais faire un ManyToMany qui me semblait plus proche de la réalité, mais n'ai pas de classe pour faire le "mapped by" puisque il s'agit d'une relation de l'entité vers elle-même.

    Faut-il que je crée une nouvelle entité, que j'appellerais "Relationship" par exemple, de sorte à obtenir quelque chose comme ça :

    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
    public Class User {
     
      @Id
      private Long idUser;
     
      @OneToMany
      private List<Relationship> mesContacts;
     
      public User () {
        mesContacts = new List<Relationship>();
      }
     
      ...
     
    }
     
    public Class Relationship{
     
      @Id
      private Long idRelationship;
     
      @ManyToOne (mapped by "mesContacts")
      private User contact;
     
      public Relationship (User user) {
        contact = user;
      }
     
      ...
     
    }

    Merci d'avance pour vos conseils.

    fred

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    La question est : quelle est la structure de la base de données ?

    Si ta table User ne contient pas d'identifiant vers un User (ce qui devrait être le cas je pense), ce n'est pas un OneToMany qui va aller.
    Si tu as une table de relation entre un User et un User (ce qui paraît logique ici), c'est bien un ManyToMany.
    Du coup, cette table de relation devrait avoir un Id vers l'utilisateur source et un Id vers l'utilisateur lié.
    Tu as la possibilité de mapper avec
    @ManyToMany
    @JoinTable(name="laTableRelation",
    joinColumns=@JoinColumn(name="USER_ID"),
    inverseJoinColumns=@JoinColumn(name="USER_ID_LIE")
    )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Bonsoir et merci pour ta réponse,

    actuellement la BD n'existe pas, je dois la concevoir, d'où mes interrogations quant à la meilleure façon de faire et aussi la liberté que cela octroie.

    Bien sûr tu as raison, on est bien dans le cas d'une relation de type ManyToMany. Il me semblait pourtant avoir lu quelque part qu'il était plus simple de décomposer une relation ManyToMany, par exemple en OneToMany d'un côté et ManyToOne de l'autre, laissant l'un des 2 côtés gérer la relation.
    -> qu'en penses-tu ?

    Si je comprends bien ta réponse, l'idéal serait d'avoir :

    1) La classe User indiquant que la relation est de type ManyToMany :

    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
    @Entity
    public Class User {
     
      @Id
      private Long idUser;
     
      @ManyToMany
      @JoinTable(name="tableRelationship",
      joinColumns=@JoinColumn(name="USER_ID"),
      inverseJoinColumns=@JoinColumn(name="USER_ID_LIE")
      ) 
      private List<User> mesContacts;
     
      public User () {
        mesContacts = new List<User>();
      }
      ...
    }
    2) Une classe gérant la relation entre les User (nommée Relationship). Cette classe doit-elle posséder un identifiant qui lui est propre (ici idRelationship) ou bien les ID des 2 User suffisent-ils ?

    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
    @Entity
    public Class Relationship{
     
      @Id
      private Long idRelationship;
     
      @Column
      private User monUser OU private Long USER_ID ?
      
      @"???" --> @Column ou @ManyToMany ?
      private User contactDeMonUser OU private Long USER_ID_LIE ?
     
      public Relationship (User user) {
        contactDeMonUser = user;
      }
      ...
    }

    Par contre, que dois-je indiquer dans la classe Relationship qui fasse le lien avec la classe User ?

    Merci

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas besoin d'une classe pour la relation, Hibernate (ou autre) gère ça tout seul.
    Pour la table (physiquement), tu n'as pas besoin d'un ID propre à la relation (mais ce n'est pas faux d'en mettre un non plus).
    Tu peux regarder cet exemple pour voir tous les aspects
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Merci pour ton lien bien utile et pour ton aide.

    Je note dans ce que tu dis (ce que je n'avais pas compris) qu'il n'est pas nécessaire qu'une classe existe pour gérer la relation entre 2 autres classes, et c'est bien ce qui ressort dans le lien que tu fournis et qui concerne une relation @ManyToMany SANS attributs : on a 2 classes, Stock et Catégorie, mais 3 entités (Stock, Catégorie et Stock_Catégorie).

    En revanche, dès lors que la relation sera porteuse de propriété(s)/attribut(s), une classe supplémentaire deviendra nécessaire.

    Donc, dans mon cas, la question est effectivement de savoir si je souhaite ou non ajouter des propriétés à la relation User / User.

    Si, comme je l'ai fait, j'en profite pour glisser une date de rencontre entre mes User, donc un attribut qui définit la relation, la classe Relationship devient nécessaire puisqu'elle est le seul endroit où cette propriété a un sens.

    En revanche, si je ne souhaite pas ajouter de propriété, une entité Relationship dans la DB est nécessaire, mais pas la classe correspondante.

    Dans le cas particulier qui est le mien (une liste de User qui sont les "contacts" de mon User, donc une relation de la classe avec elle-même), j'aurai besoin de 2 entités dans la DB (User et Relationship) mais seule la classe User suffirait.
    Dans cette classe User, j'indique que j'ai un Set de User "contacts" avec l'annotation @ManyToMany sans qu'il soit possible par ailleurs d'indiquer avec un MappedBy quelle est l'entité responsable de la relation puisque cela n'est finalement pas nécessaire.

    Un Grand merci Monsieur OButterlin.

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

Discussions similaires

  1. Lier une entité avec elle-même ?
    Par SAmpistaroy dans le forum Doctrine2
    Réponses: 2
    Dernier message: 09/07/2013, 04h59
  2. Table de jointure d'une entité avec elle-même
    Par Danger dans le forum Hibernate
    Réponses: 0
    Dernier message: 15/05/2009, 21h13
  3. Relation d'une table sur elle-même ?
    Par TallyHo dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/10/2007, 00h14
  4. Croisement d'une table avec elle même
    Par lelapin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/09/2005, 07h44
  5. [arborescence] jointure d'une table avec elle même ?
    Par Celelibi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/11/2004, 18h48

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