-
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 ;-)
-
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.
-
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.
-
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.
-
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é.
-
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!