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 - héritage


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 81
    Points
    81
    Par défaut Mapping - héritage
    Bonjour!

    Je suis confronté à un problème et peu expérimenté en hibernate...aussi j'apprécierais grandement votre aide!

    Voilà mon problème:
    J'ai une table contenant un type parent (par exemple Vehicule) et contenant un attribut discriminant (de type String) permettant d'associer chaque ligne en base à une instance d'une sous-classe de Vehicule (ex: Voiture, Charette, Vélo....). Bref de l'héritage avec une table unique et un attribut discriminant.

    Je définis le mapping de la classe mère (Vehicule.hbm.xml):
    <subclass name="canal.hibernate.database.Voiture" discriminator-
    value="VOITURE"></subclass>
    <subclass name="canal.hibernate.database.Charette" discriminator-value="CHARETTE"></subclass>
    etc...


    Jusque là tout va bien. Mais admettons, que j'ai un objet Grange, auquel je veux lier un objet de type Charette (et en aucune façon un vélo ou une voiture)... je comptais mettre une référence vers une Charette dans la classe Grange afin de bénéficier de la navigation hibernate (grange.getCharette())....

    Mais, problème: ma clé primaire dans Vehicule est [identifiant vehicule, critère discriminant]. Comment fais-je pour indiquer que le critère discriminant à la valeur fixe "CHARETTE"? car une charette et une voiture peuvent avoir même identifiant...

    Est-ce que c'est possible de fixer ce déterminant à une valeur fixe dans le mapping de Grange, pour la propriété correspondant à getCharette()?

    Est-ce que le fait d'avoir défini une clé primaire englobant l'attribut discriminant est une erreur, qui m'empêchera définitivement de faire ce que je souhaite?


    Merci beaucoup à celui ou celle qui me donnera la clé de ce problème! et aussi à tous ceux qui auront pris la peine de me lire ;-)

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Je pense que, malheureusement, au niveau des DB, les clés étrangères ne peuvent pas être réparties sur plusieurs colonnes. Tu va devoir revoir ton schéma de base de donnée pour avoir une clé primaire simple.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 81
    Points
    81
    Par défaut
    Je ne suis pas sûr d'avoir bien compris ta réponse... si tu avais la gentillesse de reformuler ou d'expliciter un peu, ça serait très sympa.

    Dans tous les cas, merci d'avoir pris le temps de répondre à ma question.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Je ne pense pas que ce soit possible (me trompe parfois, j'avoue). Donc tu va devroir revoir ton design pour n'utiliser qu'un seul id et pas Id+discrimanant dans ta clé étrangère.

  5. #5
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    A partir du moment où on peut créer des clés primaires composées dans une table, je ne vois pas pourquoi on ne pourrait pas avoir de clés étrangères composées. Non ? D'ailleurs la doc de référence Hibernate donne un exemple de mapping (de type many-to-one avec un composite-id dans le paragraphe 8.4, voir ici).

    En ce qui concerne le problème initial, je me demande si l'utilisation de filtre Hibernate (<filter .../> comme décrit au chapitre 17) ne résoudrait pas le problème ? Mais je n'ai jamais essayé.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 81
    Points
    81
    Par défaut
    Merci pour ton opinion, tchize. Je pense comme toi que ça ne doit pas être possible.

    Quant à Mouli, je te remercie également. Mais je ne crois pas que tu aies bien saisi la nature de mon problème: je voulais me passer de l'utilisation de requêtes façon DAO, et utiliser la navigation de base de hibernate de type grange.getCharette(), c'est tout. Le pb était que dans le mapping xml de 'grange', je ne pouvais pas préciser le critère déterminant qui avec la colonne identifiant_vehicule (le couple formant la clé primaire de la table vehicule) va indiquer que ma propriété renvoie une Charette au sens strict.

    Bref, mon problème était de nature statique: les filtres ne me semblent pas résoudre mon problème...

    Dans tous les cas encore merci!

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

Discussions similaires

  1. Mapping héritage vers DB
    Par SpeedOverflow dans le forum JPA
    Réponses: 0
    Dernier message: 05/08/2011, 12h58
  2. Problème mapping héritage
    Par oraur dans le forum Hibernate
    Réponses: 1
    Dernier message: 06/08/2010, 11h49
  3. Problème de mapping - héritage - list
    Par Marty000 dans le forum Hibernate
    Réponses: 0
    Dernier message: 18/06/2009, 11h07
  4. Problème mapping héritage
    Par Merguez22 dans le forum Hibernate
    Réponses: 2
    Dernier message: 02/05/2009, 15h27
  5. pb Mapping héritage hibernate annotations
    Par lilou13_13 dans le forum JPA
    Réponses: 1
    Dernier message: 08/07/2007, 22h12

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