Index: topia2/src/java/org/codelutin/topia/generator/GeneratorUtil.java diff -u topia2/src/java/org/codelutin/topia/generator/GeneratorUtil.java:1.10 topia2/src/java/org/codelutin/topia/generator/GeneratorUtil.java:1.11 --- topia2/src/java/org/codelutin/topia/generator/GeneratorUtil.java:1.10 Fri Mar 31 12:19:07 2006 +++ topia2/src/java/org/codelutin/topia/generator/GeneratorUtil.java Thu Apr 27 08:28:40 2006 @@ -25,13 +25,16 @@ * * @author Arnaud Thimel * - * @version $Revision: 1.10 $ + * @version $Revision: 1.11 $ * - * Mise a jour: $Date: 2006/03/31 12:19:07 $ par : $Author: thimel $ + * Mise a jour: $Date: 2006/04/27 08:28:40 $ par : $Author: thimel $ */ package org.codelutin.topia.generator; +import static org.codelutin.generator.Util.isNMultiplicity; +import static org.codelutin.topia.generator.GeneratorUtil.STEREOTYPE_ENTITY; + import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -291,4 +294,45 @@ return type; } + /** + *

+ * Cette méthode permet de détecter si + * - l'attribut représente une relation 1-n + * - cette relation est unidirectionnelle + * - le type de l'attribut représente un entité + * - cette entité a des sous-classes dans le modèle + * + * Ce cas correspond à une incompatibilité d'Hibernate qui nous oblige a + * adopter un comportement particulier. + *

+ * @param attr l'attribut a tester + * @param model le model + * @return true si et seulement si il s'agit bien de ce type de relation + */ + public static boolean hasUnidirectionalRelationOnAbstractType( + ObjectModelAttribute attr, ObjectModel model) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + //relation 1-n + if (reverse != null && isNMultiplicity(attr) && + !isNMultiplicity(reverse)) { + //Pas de navigabilité + if (!reverse.isNavigable()) { + //Il s'agit d'une entity + ObjectModelClass clazz = model.getClass(attr.getType()); + if (clazz != null && clazz.hasStereotype(STEREOTYPE_ENTITY)) { + //Cette classe a des sous-classes dans le modèle + Iterator subClasses = model.getClasses().iterator(); + while (subClasses.hasNext()) { + ObjectModelClass subClass = + (ObjectModelClass)subClasses.next(); + if (subClass.getSuperclasses().contains(clazz)) { + return true; + } + } + } + } + } + return false; + } + } // GeneratorUtil Index: topia2/src/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java:1.20 topia2/src/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java:1.21 --- topia2/src/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java:1.20 Fri Mar 31 12:19:07 2006 +++ topia2/src/java/org/codelutin/topia/generator/EntityHibernateMappingGenerator.java Thu Apr 27 08:28:40 2006 @@ -24,9 +24,9 @@ * Created: 12 déc. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.20 $ +* @version $Revision: 1.21 $ * -* Mise a jour: $Date: 2006/03/31 12:19:07 $ +* Mise a jour: $Date: 2006/04/27 08:28:40 $ * par : $Author: thimel $ */ @@ -50,6 +50,7 @@ import static org.codelutin.topia.generator.GeneratorUtil.STEREOTYPE_ENTITY; import static org.codelutin.topia.generator.GeneratorUtil.PERSISTENCE_TYPE_HIBERNATE; +import static org.codelutin.topia.generator.GeneratorUtil.hasUnidirectionalRelationOnAbstractType; /** * FIXME mettre les attributs node="..." sur tous les attributs @@ -110,7 +111,9 @@ for (Iterator it = clazz.getAttributes().iterator(); it.hasNext(); ) { ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); - if (!attr.isNavigable()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if (!attr.isNavigable() + && !hasUnidirectionalRelationOnAbstractType(reverse, model)) { continue; } if (!Util.isNMultiplicity(attr)) { @@ -243,13 +246,15 @@ } protected void generateHibernateOneToOne(Writer output, ObjectModelAttribute attr) throws IOException { -/*{ <%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%>/> + boolean accessField = hasUnidirectionalRelationOnAbstractType(attr.getReverseAttribute(), model); +/*{ <%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%>/> }*/ } protected void generateHibernateOneToMany(Writer output, ObjectModelAttribute attr) throws IOException { boolean isIndexed = attr.isIndexed(); boolean isInverse = attr.getReverseAttribute().isNavigable(); + isInverse |= hasUnidirectionalRelationOnAbstractType(attr, model); String orderBy = attr.getTagValue("order-by"); if (orderBy == null) { orderBy = ""; @@ -287,7 +292,8 @@ } protected void generateHibernateManyToOne(Writer output, ObjectModelAttribute attr) throws IOException { -/*{ /> + boolean accessField = hasUnidirectionalRelationOnAbstractType(attr.getReverseAttribute(), model); +/*{ <%=((accessField)?" access=\"field\"":"")%>/> }*/ } Index: topia2/src/java/org/codelutin/topia/generator/TopiaRelationValidator.java diff -u topia2/src/java/org/codelutin/topia/generator/TopiaRelationValidator.java:1.1 topia2/src/java/org/codelutin/topia/generator/TopiaRelationValidator.java:1.2 --- topia2/src/java/org/codelutin/topia/generator/TopiaRelationValidator.java:1.1 Fri Mar 31 18:11:56 2006 +++ topia2/src/java/org/codelutin/topia/generator/TopiaRelationValidator.java Thu Apr 27 08:28:40 2006 @@ -33,11 +33,10 @@ package org.codelutin.topia.generator; -import java.util.Iterator; +import static org.codelutin.generator.Util.isFirstAttribute; import org.codelutin.generator.models.object.ObjectModel; import org.codelutin.generator.models.object.ObjectModelAttribute; -import org.codelutin.generator.models.object.ObjectModelClass; import org.codelutin.generator.models.object.validator.ObjectModelValidator; /** @@ -70,7 +69,7 @@ /* Relation navigabilité */ //Pour ne pas avoir de doublons, on ne vérifie que sur le premier //attribut par ordre alphabétique - if (GeneratorUtil.isFirstAttribute(attr)) { + if (isFirstAttribute(attr)) { if (!attr.isNavigable() && !reverse.isNavigable()) { addError(attr, "La relation entre " + @@ -81,34 +80,18 @@ } } - /* Relation héritage */ - //Relation 1-n - if (reverse != null && GeneratorUtil.isNMultiplicity(attr) && - !GeneratorUtil.isNMultiplicity(reverse)) { - //Pas de navigabilité - if (!reverse.isNavigable()) { - //Il s'agit d'une entity - ObjectModelClass clazz = model.getClass(attr.getType()); - if (clazz != null && clazz.hasStereotype(GeneratorUtil.STEREOTYPE_ENTITY)) { - //Cette classe a des sous-classes dans le modèle - Iterator subClasses = model.getClasses().iterator(); - while (subClasses.hasNext()) { - ObjectModelClass subClass = (ObjectModelClass)subClasses.next(); - if (subClass.getSuperclasses().contains(clazz)) { - addError(attr, - "La relation entre " + - "\"" + reverse.getType() + "\"[" + attr.getName() + "] et "+ - "\"" + attr.getType() + "\"[" + reverse.getName() + "] " + - "n'est pas compatible avec Hibernate car:\n" + - "1. La relation est 1-n et n'est navigable que dans un sens;\n" + - "2. \"" + attr.getType() + "\" a des sous-classes."); - isValid = false; - break; - } - } - } - } - } +// // N'a plus de sens car bug corrigé dans la version 2.0.5 +// /* Relation héritage */ +// if (GeneratorUtil.hasUnidirectionalRelationOnAbstractType(attr, model)) { +// isValid = false; +// addError(attr, +// "La relation entre " + +// "\"" + reverse.getType() + "\"[" + attr.getName() + "] et "+ +// "\"" + attr.getType() + "\"[" + reverse.getName() + "] " + +// "n'est pas compatible avec Hibernate car:\n" + +// "1. La relation est 1-n et n'est navigable que dans un sens;\n" + +// "2. \"" + attr.getType() + "\" a des sous-classes."); +// } return isValid; } Index: topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java diff -u topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.15 topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.16 --- topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java:1.15 Fri Mar 3 10:46:36 2006 +++ topia2/src/java/org/codelutin/topia/generator/EntityAbstractGenerator.java Thu Apr 27 08:28:40 2006 @@ -24,14 +24,16 @@ * Created: 12 déc. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.15 $ +* @version $Revision: 1.16 $ * -* Mise a jour: $Date: 2006/03/03 10:46:36 $ +* Mise a jour: $Date: 2006/04/27 08:28:40 $ * par : $Author: thimel $ */ package org.codelutin.topia.generator; +import static org.codelutin.topia.generator.GeneratorUtil.hasUnidirectionalRelationOnAbstractType; + import java.io.File; import java.io.IOException; import java.io.Writer; @@ -114,7 +116,9 @@ }*/ for (Iterator it = clazz.getAttributes().iterator(); it.hasNext();) { ObjectModelAttribute attr = (ObjectModelAttribute)it.next(); - if (!attr.isNavigable()) { + ObjectModelAttribute reverse = attr.getReverseAttribute(); + if (!attr.isNavigable() + && !hasUnidirectionalRelationOnAbstractType(reverse, model)) { continue; } /*{ /**