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 de deux one-to-many


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 16
    Points
    16
    Par défaut mapping de deux one-to-many
    Je n'ai pas vraiment vu tous les post alors si ma question a déjà été posé, merci de me redirigé.

    Ma question est plutot un conseil.

    J'ai une classe A qui a deux ensembles (ens 1 et ens 2) de la classe B. un élément de l'ens 1 ne peut appartenir l'ens 2 et inversement.
    Au niveau du modele relationnel j'ai deux tables.
    Comment mapperiez vous ca vous dans ce cas?

  2. #2
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Tu pourrais sous-classer ta classe B en 2 sous-classes B1 et B2, pour l'ensemble 1 et l'ensemble 2 respectivement, avec une stratégie d'héritage de 1 table par hiérarchie.
    Une contrainte, ajouter une colonne supplémentaire pour faire la discrimination entre les 2 types de classes.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    effectivement j'y avais pensé. Mais je voudrais éviter !!! J'aimerais garder le modèle objet tel que je l'ai décris. J'aimerais que la solution vienne du mapping (par contre je me doute qu'il va falloir rajouter une colonne dans ma table B pour les différencier)

  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
    Tu pourrais rajouter une colonne dans ta table B pour identifier tes ensembles.
    Dans ton mapping de A, dans la définition de tes Set, tu pourrais rajouter l'attribut "where" afin de récupérer les objets de B en fonction de la nouvelle propriété.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par xv-mnt
    Tu pourrais sous-classer ta classe B en 2 sous-classes B1 et B2, pour l'ensemble 1 et l'ensemble 2 respectivement, avec une stratégie d'héritage de 1 table par hiérarchie.
    Une contrainte, ajouter une colonne supplémentaire pour faire la discrimination entre les 2 types de classes.
    Je pencherais aussi pour une solution d'héritage de la classe B, mais par contre, pour la stratégie de mapping ce serait 1 table par sous-classe, sans colonne supplémentaire pour la discrimination. En principe, en l'absence de discriminator, Hibernate outilise la réflexion pour assurer le mapping dans ce cas. Pour définir les deux ensembles, la classe A aurait deux relations one-to-many directement avec chacune des sous-classes et non avec la classe de base.
    SCJP 5 / SCBCD 1.3 Certified

  6. #6
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    effectivement j'y avais pensé. Mais je voudrais éviter !!! J'aimerais garder le modèle objet tel que je l'ai décris.
    Question : pourquoi veux-tu éviter de modifier le modele objet en sous-classant B avec B1 et B2 ?

    Pour moi, il me semble plus contraignant de modifier les tables, car le schéma peut parfois nous être imposé de l'extérieur (le modèle est existant et figé par exemple car déjà en prod.).

    De plus, rien ne t'empeche de travailler ensuite directement avec la superclasse.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Tout d'abord merci pour vos réponses pertinentes!

    Si j'utilise une hiérarchie au niveau objet, je suis obligé de changer également mon modele relationnel (2 tables pas sous-classe), car la solution une table par hiérarchie n'est pas satisfaisant à mon gout et ne permet pas vraiment le polymorphisme (voir livre hibernate 3)
    De ce fait la clause "where" me parait une bonne idée. Je ne connais pas vraiment comment ca marche (j'en ai une idée) il faudrait que je renseigne.

  8. #8
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    La question n'est pas de faire du polymorphisme pour faire du polymorphisme, mais de répondre (élégamment à mon goût) à une problématique posée.
    De plus, dans certains cas, avoir une seule table par hiérarchie permet d'éviter les requêtes de jointures dans certains cas limites : gros volumes + beaucoup d'attributs en commun.
    De toute manière, tu as qd même pas mal de solutions à ton pb

    @+
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par emilie_caroline
    Si j'utilise une hiérarchie au niveau objet, je suis obligé de changer également mon modele relationnel (2 tables pas sous-classe), car la solution une table par hiérarchie n'est pas satisfaisant à mon gout et ne permet pas vraiment le polymorphisme (voir livre hibernate 3)
    Quelques questions s'imposent :
    1. Le schéma de la base de données t'es imposé ou tu en as le contrôle et donc la possibilité de modifier les tables ?
    2. Les deux fameuses tables contiennent-elles des données exactement du même type ou y a-t-il des champs qui diffèrent ?
    3. Peux-tu poster une partie du code de la classe A et ses références à la classe B (histoire de voir s'il y a moyen de faire autrement) ?
    SCJP 5 / SCBCD 1.3 Certified

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Alors
    Tout d'abord j'ai effectivement le controle de la base de données. Toutefois l'application web qui se sert de la base est aujourd'hui en production. Il est donc délicat de détruire ou de faire migrer des données d'une table à une autre -> rajouter une colonne ne pose aucun problème mais d'autre changements seraient délicat.

    Ensuite
    Je ne comprends pas tout à fait des deux tables dont tu parles mais voilà :
    la classe A représente un groupe et la classe B des personnes.
    Les deux associations dont je parle représente
    -l'ensemble des membres de ce groupes
    -l'ensemble des administrateurs de ce groupes

    La classe A et B (à fortiori les tables correpondantes) n'ont rien à voir.
    De plus les membres des groupes et admin sont exactements les mêmes objets (appratiennent à une seule table).

    enfin je ne peux poster de code

    J'espère qu'il s'agit des réponses que tu voulais.

    La question n'est pas de faire du polymorphisme pour faire du polymorphisme, mais de répondre (élégamment à mon goût) à une problématique posée.
    De plus, dans certains cas, avoir une seule table par hiérarchie permet d'éviter les requêtes de jointures dans certains cas limites : gros volumes + beaucoup d'attributs en commun.
    De toute manière, tu as qd même pas mal de solutions à ton pb
    Le problème vient également du fait qu'on ne peut utiliser la variable null.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par emilie_caroline
    Alors
    Tout d'abord j'ai effectivement le controle de la base de données. Toutefois l'application web qui se sert de la base est aujourd'hui en production. Il est donc délicat de détruire ou de faire migrer des données d'une table à une autre -> rajouter une colonne ne pose aucun problème mais d'autre changements seraient délicat.
    C'est vrai que si la base de données est déjà en production, tu n'as plus beaucoup de choix, quoique il y a toujours moyen de refactoriser si ta couche présentation de l'application web n'est pas fortement couplée à la base de données. Mais, comme tu le dis, la migration des données représenterait peut-être un autre problème...

    Citation Envoyé par emilie_caroline
    Ensuite
    Je ne comprends pas tout à fait des deux tables dont tu parles mais voilà :
    la classe A représente un groupe et la classe B des personnes.
    Les deux associations dont je parle représente
    -l'ensemble des membres de ce groupes
    -l'ensemble des administrateurs de ce groupes

    La classe A et B (à fortiori les tables correpondantes) n'ont rien à voir.
    De plus les membres des groupes et admin sont exactements les mêmes objets (appratiennent à une seule table).
    Alors, si j'ai bien compris, il y aurait deux tables, l'une correspondant aux groupes (classe A) et l'autre aux personnes (classe B). Et la table des personnes contient aussi bien des membres simples d'un groupe que les administrateurs de ce groupe; right ?
    Dans ce cas, la table de personnes comprend surement un champ pour distinguer un administrateur d'un membre simple ? Et là, je me demande si une simple requête HQL sur classe A, avec le paramètre nécessaire, ne suffirait pas, plutôt que d'avoir deux collections différentes dans la classe.
    Enfin, je sais pas si j'ai bien compris ta problématique...
    SCJP 5 / SCBCD 1.3 Certified

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Oui je crois que tu as bien compris.
    Le principe est surtout de faire en sorte que le mapping me permette de récupérer les deux ensemble grace à un A.getMembreDeA et B.getAdminsitrateur.

    Aujourd'hui mon mapping definit les deux ensembles mais comme rien ne permet de faire la différence entre les membres et les admins A.getMembreDeA et A.getAdminsitrateur me retournent tous les deux l'ensembles des persons (les membres et les admins)

    Voilà, j'ai eu suffisemment de réponses pour faire quelquechose de correct. Toutefois si vous avez encore quelques idées (voire des idées de génie) ....

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

Discussions similaires

  1. Mapping one-to-many - saveOrUpdate
    Par -=mateo=- dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/07/2010, 17h36
  2. [MAPPING] one-to-one et many-to-many
    Par Invité dans le forum Hibernate
    Réponses: 10
    Dernier message: 09/03/2010, 14h53
  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. Mapping One to Many
    Par Ethylene dans le forum Hibernate
    Réponses: 9
    Dernier message: 25/09/2007, 16h42
  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