Salut,
Je viens de corriger un bug de génération de mapping et du coups je
tombe sur un code bien mystérieux concernant la gestion de l'inverse
sur les relations many-2-many :
// On ne met le inverse="true" uniquement pour un seul coté de la relation.
// Dans le cas contraire, les modifications dans la relation ne seront
// pas sauvegardées. Ceci n'est vrai que si les deux coté sont navigable
boolean isInverse = attr.isNavigable() && attr.getReverseAttribute().isNavigable();
//isInverse |= !Util.isFirstAttribute(attr);
//isInverse = false; // 20070117 poussin: pour du many, jamais de inverse
// Modification FD-2010-04-01 :
// Le tagvalue "inverse" permet de spécifier qui possède le
// inverse="true". Il est impératif de l'utiliser sur les deux
// extrémités pour ne pas avoir de surprise.
String inverseValue = TopiaGeneratorUtil.getInverseTagValue(attr);
if (StringUtils.isNotEmpty(inverseValue)) {
isInverse &= Boolean.parseBoolean(inverseValue);
// Si aucun tagvalue n'est défini, le choix est arbitraire : le
// premier attribut dans l'ordre alphabétique sera choisi pour porter le
// inverse="true"
} else {
isInverse &= GeneratorUtil.isFirstAttribute(attr);
}
Moi je vous avoue ne rien y comprendre dans cette gestion stricte
(inverse sur les deux targets avec un boolean a True ou a False) ou
bien choisir celui de plus petit ordre alphabétique ?
Euh... Ca sert à quoi ?
Je serais vraiment d'avis qu'on revoit cette gestion regrettable.
Pour moi on ne doit pas laisser le second mode qui rend la gestion de
la relation dépendante du nom des relations (pfff... d'où ça sort
cette blague :)).
Après laisser deux tag-values (une sur chaque extrémité) ne m'emballe
guère car une seule tag value sur le maître me parait suffisant.
Pourquoi ne pas plutôt utiliser une nouvelle tagValue (car inverse ça
veut pas dire grand chose en fait en terme de modélisation...) qui
indique qui est le propriétaire de la relation, on pourrait alors en
déduire l'attribute inverse nécessaire pour le mapping hibernate.
Si la relation n'est pas présente, on déclanche une exception histoire
d'être safe.
Pour le nom de la nouvelle tag value, je sais pas trop vu
que j'utilise jamais ce genre de relation (j'en ai de la chance :)) :
- relationOwner
- relationMaster
Merci pour vos réponses constructives :)
--
Tony Chemit
--------------------
tél: +33 (0) 2 40 50 29 28
email: chemit(a)codelutin.com
http://www.codelutin.com