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 :

component sur plusieurs tables/objets


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut component sur plusieurs tables/objets
    bonjour je commence avec hibernate et je me posais une question :

    comment peut on crée un type personnelle?
    en clair, je veux créer un attribut de type Adresse ( qui comprend plusieurs champs String et autre : residence, numero [String], type de rue [String],rue [String], Ville <many-to-one class="vile">,...).
    Si je ne l'utilisai que dans une table je ferai un component je pense que ca sert a ca. mais la j'ai plusieurs objets/tables qui utiliseront ce type d'attribut,(des Personnes, des entreprises, des secrétariast, ...). j'ai plusieurs solutions :
    - répéter le "component" dans chaque table
    - créer une table adresse avec un lien unidirectionnelle pour ne pas y trouver de clé etrangere.
    - autre comme usertype mais la faudrai m'expliqué car dans la doc ils ne sont pas très documenté

    Laquelle vous parait la plus aproprié

  2. #2
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    En fonction de ta relation tu fais un many-to-one ou un bag, et une table pour la class Adresse. Cela me parait beacoup plus simple et bien plus logique. Globalement, mieux vaut plusieures tables petite qu'une grosse où tu ajoutes plein de champs.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    merci mais j'ai oublier de precisé que je vais avoir plusieurs catalogues donc le problème est que j'aurai 1 table adresse par catalogue sinon j'aurai une seule table avec l'ensemble des adresses de toutes mes applications( 1 application = 1 catalogue)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Bonjour,
    A mon avis, la première solution (component dans chaque table) est meilleure en termes de performance. Sauf si un objet Adresse possède une identité propre dans ton modèle, je ne vois pas pourquoi tu aurais besoin de définir une table spéciale pour contenir toutes les adresses. Or, si une adresse n'a de l'intérêt que lorsqu'elle appartient a une Personne ou Entreprise, le mieux c'est d'enregistrer les informations d'adresse dans la même table que Personne ou Entreprise. Cela te permet d'avoir une base de données dénormalisée de ce point de vue et d'éviter des "inner join" pour charger l'adresse chaque fois que tu charge une personne ... En tout cas, tu devrais décider en tenant compte des performances et en considérant ce qu'est véritablement l'importance d'une entité adresse par rapport aux autres entités dans ton modèle.
    a++

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    D'accord avec manblaizo, la pluspart du temps tu te compliques la vie avec les tables adresses séparées.
    Il ne faut pas oublier les contraintes liées, dans le genre :
    - une adresse référencée dans une facture émise ne doit plus pouvoir être changée
    - 12 rue des Tulipes représente la même adresse que 12 RUE DES TULIPES (et on ne parle même pas des blancs supplémentaires qu'on pourrait trouver)
    etc...

    Donc, je trouve la solution 1 plus intéressante, au moins tu peux centraliser les contrôles au niveau de cette classe.

    Ce n'est qu'un avis...
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    ok je pense aussi car une table d'Adresse serai assez lourde mais il n'existe pas un racourci pour evité de devoir recopier de compomemt a chaque fois style
    <property name="adressePro" type="Adresse" ou class="Adresse"/ > ??

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Est ce que chaque adresse pourrait appartenir à une personne, une entreprise etc en même temps ?
    Si c'est le cas, tu vas duppliquer l'information dans n tables.
    Qu'en penses-tu ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    oui je pense que chaque table concerné devra avoir une entité adresse propre.
    Il n'y aura aucune operation sur l'adresse a part consulter ou modification.
    Ce que je cherche simplment c'est si je dois redefinir la classe "Adresse" dans chaque mapping car si je dois modifier l'a classe en ajoutant un champs, faut pas que j'oublie de le faire pour chaque mapping. c'est juste pour des raisons "pratiques".

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    J'ai pas tout saisi.
    Tu veux dire que ton objet adresse, selon l'objet auquel il sera rattaché, pourrait avoir des champs différents (en plus ou en moins) ?
    Si c'est le cas un component parait effectivement être une bonne idée.

    Et si tu décides qu'une entreprise ou une personne peut avoir plusieurs adresses, adresse de facturation, de livraison, etc... ce serait pas mal d'avoir une classe (donc une table) propre.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    pardon je me suis mal exprimer.

    Au contraire je veux que tout mes champs adresse soit fait de la meme maniere.
    si ca change pour 1 ca change pour tous. en faite je voudrai que adresse soit consodere (enfin presque considere ) comme un type primitif ou plutot comme une classe JAVA (style Integer, Calendar,...).
    d'aprés ce que j'ai pu comprendre c'est de le role de usertype mais je comprend pas comment il fonctionne la doc reste vague a ce sujet.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ce qui te gène, c'est de devoir répéter le bloc de définition pour chaque table contenant une adresse dans le fichier de mapping...
    Je ne vois pas de moyen pour "by-passer" cette étape (encore que ce soit un copier/coller à chaque fois...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Dans ce cas, je ferais une classe Adresse correspondant à une table Adresse, même si ça va à l'encontre de ce que t'ont proposé OButterlin et manblaizo.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Dans ce cas, je ferais une classe Adresse correspondant à une table Adresse, même si ça va à l'encontre de ce que t'ont proposé OButterlin et manblaizo.
    C'est effectivement une possibilité... avec une relation 1 pour 1...

    L'avantage, tu centralises la gestion de l'adresse.
    L'inconvénient, tu fais 2 lectures par entité contenant une adresse.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    j'ai peut etre trouver une piste le compositeUserType mais bon faut s'accroché:
    http://www.hibernate.org/178.html
    ca repond a mes beoin mais faut voir si ca va pas demandé plus de travail qu'autre chose .
    je vais quand meme regarder de plus prés part curiosité

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est plutôt pour agglomérer plusieurs colonnes en 1 propriété... et comme tu peux le constater dans l'exemple, tu as aussi le mapping à répéter...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Citation Envoyé par okydo Voir le message
    j'ai peut etre trouver une piste le compositeUserType mais bon faut s'accroché:
    http://www.hibernate.org/178.html
    ca repond a mes beoin mais faut voir si ca va pas demandé plus de travail qu'autre chose .
    je vais quand meme regarder de plus prés part curiosité
    Non, je ne pense pas que tu aies besoin de CompositeUserType pour ça, un component suffirait. Ton problème c'est d'éviter de devoir répéter les modifications dans chaque fichier de mapping quand la classe Adresse est modifiée. Tu as deux solutions :
    - Utiliser les annotations, et là tu n'auras qu'à déclarer @Embeded devant la propriété "adresse" dans chaque classe où tu l'utilise et le reste est pris en charge automatiquement.
    - Si tu n'utilises pas encore les annotations, alors tu as Xdoclet qui te pemet de générer les fichiers de mapping et de ne pas avoir à répéter des opérations dans différents fichiers.
    Sinon, je ne vois pas comment tu pourrais éviter de répéter les éléments <component> dans chaque mapping, et je suis d'accord avec toi que c'est très "error-prone" ...
    a++

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    Oky merci

    je crois que jvais suivre ton conseil manblaizo, je vais utilise le component.
    et Crtl+c crtl+v est ton ami c'est bien connu. en esperant ne pas le regreter lol.

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

Discussions similaires

  1. Question pour une requête sur plusieurs tables/objets
    Par pontus21 dans le forum Hibernate
    Réponses: 54
    Dernier message: 01/06/2009, 18h37
  2. Requête sur plusieurs tables/objets
    Par pontus21 dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/04/2009, 14h43
  3. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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