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 d'une table de lien vers plusieurs objets


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut Mapping d'une table de lien vers plusieurs objets
    Bonjour à tous,

    Je suis en train de développer une appli et je suis confronté à un problème avec Hibernate. Je m'explique.

    En gros j'ai une table de lien entre des objets (ou tables si on parle en terme de base) et un autre objet.

    Je vais essayer de simplifier le pb pour que ça soit plus clair.

    On va dire que j'ai un objet A et un objet B et que ces 2 objets peuvent posséder un ou plusieurs objets C.
    Pour cela j'ai une table de lien en base avec 2 colonnes id_objet (qui peut être un id de A ou un id de B) et id_objetC.
    Y'a même d'autres colonnes mais on va garder que celles ci pour l'exemple.
    Je ne vois pas bien comment mapper ça dans Hibernate.

    Est-ce qu'il faut que j'ai un Set d'objets C dans mes classes A et B ?
    Ou alors est-ce qu'il faut que j'ai une table (appelons la D) au dessus de A et B avec une simple colonne Id et avec A et B qui hériteraient de cette table.
    Dans ce cas là j'aurais un seul Set d'objets dans la classe D.

    Je viens de me relire c'est pas clair du tout, j'espère que quelqu'un aura saisi mon problème.

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    les ids A et B sont tous différents ? autrement dit, il n'existe aucun id A ou B qu'on puisse retrouver dans l'autre ?

    si oui, alors l'option de créer une classe D qui gère les ids et qui possède un set de C, et avoir A et B étendre cette classe me semble une bonne idée (c'est du moins celle que j'avais choisie quand j'ai été confronté à ce problème )

    en revanche si tu ne peux garantir l'unicité des ids, il te faudra créer un set par objet A ou B, et probablement ajouter la table d'origine en colonne dans ta table de mappings (à moins que tu n'aies déjà une colonne pour différencier A et B )

  3. #3
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    si j'ai bien compris ton problème:
    le plus simple est d'avoir 3 tables:

    A----C-----B
    ==========Class A========
    A{
    oneToMany
    C
    }
    ==========Class B========
    B{
    oneToMany
    C
    }
    ==========Class C========
    C{

    ManyToOne
    A

    ManyToOne
    B

    }


    et voila

  4. #4
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut
    Merci les gars pour vos réponses.

    Du coup j'ai une question plus générale :
    Dans mon application il peut arriver dans un certains temps qu'il y ait d'autres objets que A et B dans ma table.
    J'aimerai configurer ça dans un fichiers properties. Dans un premier temps il y aurait que A et B.
    Si dans quelques temps on veut qu'un objet E ait aussi un objet C dans mon appli, est-ce qu'il est possible que simplement en le rajoutant en plus de A et B dans mon fichier properties ça soit pris en compte ?
    Bon je sais ça a l'air chaud à faire, je sais même pas si c'est possible.

    Je suis en train de me dire que j'abuse un peu là, je fais du hibernate depuis 2 semaines et je veux de suite faire des trucs de fous

    En tout cas merci Jacobian et Gardyen pour vos réponses

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    qu'est-ce que tu veux dire par
    en le rajoutant en plus de A et B dans mon fichier properties ça soit pris en compte
    ?

    si tu dois ajouter d'autres objets à ce schéma, je te conseille d'utiliser l'héritage aussi, tu as juste à créer ta class E extends D, pas d'autres modifications à faire

  6. #6
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut
    C'est vrai que ce que je veux faire n'est pas très clairement expliqué.
    Surtout si je prends comme exemple A, B, C, etc.

    Je vais essayer d'expliquer avec des exemples précis.

    Dans notre appli on a décidé de laisser la possibilité de décrire nos objets ("Utilisateur", "Document", "Sociéte", etc) par des informations dynamiques.
    C'est-à-dire ne pas avoir une liste fixe de champs à remplir pour décrire chacun des objets.
    On aura un administrateur qui décidera de rajouter des infos à remplir.
    Pour ça on a mon objet C dan lequel est décrit l'info à remplir.
    Et pour l'instant on a uniquement sur un "Utilisateur" et un "Document" qu'on a ce genre d'infos dynamiques (objets A et B de mon exemple).
    L'admin rajoutera des infos via une fenête d'admin en choisissant d'abord son objet sur lequel l'info apparaîtra.

    Si un jour on décide d'avoir la possibilité d'avoir une info dynamique sur une "Société" par exemple, je voulais juste avoir à rajouter l'objet dans un fichier properties (où il y aurait déjà "Utilisateur" et "Document") pour que ça soit pris en compte automatiquement.
    Mais je sais pas si c'est jouable de faire ça.

    Voilà, est-ce que c'est un peu plus clair ?

  7. #7
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    modifier une classe à chaud en java

    maintenant tu peux très bien anticiper ce genre de problématique

    imaginons par exemple que toutes tes classes objets dérivent de la classe D (comme Dynamique ), mais que seules celles présentes dans ton fichier properties - ou dans tout autre moyen possible de stocker cette info - sont modifiables via l'interface, ça revient à ce que tu veux faire ?

  8. #8
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut
    C'est exactement ça que je veux faire Gardyen !

    (pas modifier une classe à la volée évidemment )

    La classe mère de toutes les autres serait la solution idéale.
    Mon seul souci c'est que ça fait une modification de fond de mon appli et ça ça m'embête vraiment. Surtout que je ne suis pas un expert Hibernate (loin de là)
    C'est pour ça que je postais pour savoir s'il y avait d'autres possibilités pour faire ça.
    Mais bon va falloir se résoudre à cette solution.
    Je vous donne rendez vous dans une semaine à peu près pour le fin mot de l'histoire

    Maintenant il reste une solution moins jolie qui consiste à faire une table de lien pour chaque objet susceptible d'avoir une info dynamique.
    Ou alors une seule table de lien mais par contre je ne peux pas garantir l'unicité de tous les Ids des objets.
    Je sais pas s'il est possible de faire une sorte de séquence Oracle en Mysql. J'imagine que oui mais je ne sais pas faire.

    En tout cas merci pour vos réponses.

  9. #9
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    ce que tu est entrain de chercher a faire ce n'est pas possible avec hibernate a moins que chaque fois tu modifie ton shema tu recompile ton appli

  10. #10
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    du point de vue mysql c'est assez simple, une table D qui ne contient qu'un id auto_increment, puis plusieurs tables / objets dont la clé primaire est une clé étrangère sur D.
    une fois tes données mises dans ce format, un peu de reverse engineering avec les hibernate tools et c'est fini pour cette partie là :p

    si tu ne veux pas retravailler ta base, tu as aussi l'option de rajouter la table d'origine pour différencier les ids dans ta table de mapping.
    dans ce cas pas besoin de table mère, chaque classe devra par contre déclarer un set de C restreint aux éléments de sa table: il existe un attribut where pour les collections hibernate, permettant de préciser une contrainte SQL du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <set name="setDeC" where="table_origine=A">
    à toi de voir quelle solution tu préfères, bon courage !

  11. #11
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut
    ce que tu est entrain de chercher a faire ce n'est pas possible avec hibernate a moins que chaque fois tu modifie ton shema tu recompile ton appli
    Pour la solution du mapping à la volée effectivement c'est impossible. Mais bon, étant débutant, je me suis dit que des experts avaient peut être trouvé une solution.

    du point de vue mysql c'est assez simple, une table D qui ne contient qu'un id auto_increment, puis plusieurs tables / objets dont la clé primaire est une clé étrangère sur D.
    une fois tes données mises dans ce format, un peu de reverse engineering avec les hibernate tools et c'est fini pour cette partie là :p
    C'est quoi ça du reverse engineering ? Y'a des outils qui permettent à partir d'une base de données de créer les classes de mapping ou quelquechose dans le genre ? (Je me répète, je suis un néophyte, ça sent la question bien débile ça )

    si tu ne veux pas retravailler ta base, tu as aussi l'option de rajouter la table d'origine pour différencier les ids dans ta table de mapping.
    dans ce cas pas besoin de table mère, chaque classe devra par contre déclarer un set de C restreint aux éléments de sa table: il existe un attribut where pour les collections hibernate, permettant de préciser une contrainte SQL
    J'avais envisagé la solution de la colonne dans la table de lien précisant la table d'origine de l'Id. Par contre je ne savais pas comment faire la distinction dans la classe Java.
    Si je comprends bien tu me dis qu'il existe un moyen de faire un where sur la collection d'objets dans ma classe ?
    En gros il faut juste avoir un Set d'objets avec au dessus en annotation le @JoinTable et à l'intérieur une déclaration qui permet de faire des where sur les objets retournés ? Si ça existe ça m'arrangerait bien.

  12. #12
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    Les hibernate tools sont une collection d'outils dont certains te permettent de créer les objets java directement depuis la base de données. Très utile

    Pour la clause @Where (voire @WhereJoinTable) tu peux regarder dans la doc

  13. #13
    Membre averti
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Par défaut
    Je vais aller voir les outils que tu as mentionnés ainsi que cette annotation WhereJoinTable.

    Merci pour tout

Discussions similaires

  1. [MySQL] Question simple: afficher tous les entrées d'une table en liens
    Par anarchoi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/04/2007, 12h04
  2. Réponses: 1
    Dernier message: 29/04/2007, 19h53
  3. [MySQL] Récupérer une table et redirection vers une page
    Par ph_anrys dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 20/03/2007, 16h44
  4. [vb.net] transfert d'une table SQL-Servr vers un fichier texte
    Par nkonito dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/05/2006, 04h36
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

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