Author: echatellier Date: 2013-07-04 11:38:55 +0200 (Thu, 04 Jul 2013) New Revision: 2735 Url: http://nuiton.org/projects/topia/repository/revisions/2735 Log: fixes #2729: Choose hibernate inheritance strategy fixes #2733: Use hibernate-mapping-4.0.xsd to validate hibernate mappings Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2013-07-03 10:04:24 UTC (rev 2734) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2013-07-04 09:38:55 UTC (rev 2735) @@ -114,8 +114,10 @@ return; } /*{<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "classpath://org/hibernate/hibernate-mapping-3.0.dtd"> -<hibernate-mapping default-access="field" auto-import="true" package="<%=input.getPackageName()%>"> +<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping" + xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-mapping classpath://org/hibernate/hibernate-mapping-4.0.xsd" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + default-access="field" auto-import="true" package="<%=input.getPackageName()%>"> }*/ boolean haveSuper = input.getSuperclasses().size() > 0; // la liste des attributs faisant parti de la clef metier @@ -140,6 +142,7 @@ optionalAttributes += "proxy=\"" + clazzFQN + "\" "; } + String inheritanceStrategy = null; if (haveSuper) { ObjectModelClass superClass = input.getSuperclasses().iterator().next(); String superClassname = superClass.getQualifiedName(); @@ -147,16 +150,33 @@ log.debug("superClass for " + input.getQualifiedName() + " is " + superClassname); } String superClassDOType = TopiaGeneratorUtil.getDOType(superClassname, model); - -/*{ <union-subclass name="<%=clazzDOType%>" extends="<%=superClassDOType%>" table="<%=tableName%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>" <%=optionalAttributes%>> - <!--key column="topiaId"/--> + inheritanceStrategy = TopiaGeneratorUtil.getInheritanceStrategyTagValue(superClass); + if ("joined-subclass".equals(inheritanceStrategy) || "union-subclass".equals(inheritanceStrategy)) { + optionalAttributes += "table=\"" + tableName + "\""; + } + if ("subclass".equals(inheritanceStrategy)) { + optionalAttributes += "discriminator-value=\"" + superClassDOType + "\""; + } +/*{ <<%=inheritanceStrategy%> name="<%=clazzDOType%>" extends="<%=superClassDOType%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>" <%=optionalAttributes%>> }*/ + if ("joined-subclass".equals(inheritanceStrategy)) { +/*{ <key column="topiaId" /> +}*/ + } // FIXME mieux gerer le cas haveSuper noneNaturalAttributes.addAll(input.getAttributes()); } else { /*{ <class name="<%=clazzDOType%>" table="<%=tableName%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>" <%=optionalAttributes%>> <id name="topiaId" type="string" length="255" node="@topiaId"/> }*/ + // cas où on defini la super class, il faut un discriminator seulement dans le cas de + // la strategy subclass + String currentInheritanceStrategy = TopiaGeneratorUtil.getInheritanceStrategyTagValue(input); + if ("subclass".equals(currentInheritanceStrategy)) { +/*{ <discriminator column="topiaDiscriminator" type="string" /> +}*/ + } + // on detecte les attributs des clef metiers for (ObjectModelAttribute attr : input.getAttributes()) { if (TopiaGeneratorUtil.isNaturalId(attr)) { @@ -188,7 +208,7 @@ generateAttributes(output, input, noneNaturalAttributes, ""); if (haveSuper) { -/*{ </union-subclass> +/*{ </<%=inheritanceStrategy%>> }*/ } else { /*{ </class> Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-07-03 10:04:24 UTC (rev 2734) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2013-07-04 09:38:55 UTC (rev 2735) @@ -98,6 +98,9 @@ /** Le package par défaut si aucun n'est spécifié */ public static final String DEFAULT_PACKAGE = "org.codelutin.malo"; + /** Stratégie d'heritage par defaut. */ + public static final String DEFAULT_INHERITANCE_STRATEGY = "union-subclass"; + /** * The Eugene provider of tag values and stereotypes. * @@ -1353,6 +1356,24 @@ } /** + * Obtain the value of the {@link TopiaTagValues#TAG_INHERITANCE_STRATEGY} + * tag value on the given classifier. + * <p/> + * + * @param classifier classifier to seek + * @return the none empty value of the found tag value or {@code null} if not found nor empty. + * @see TopiaTagValues#TAG_INHERITANCE_STRATEGY + * @since 3.0 + */ + public static String getInheritanceStrategyTagValue(ObjectModelClassifier classifier) { + String value = findTagValue(TopiaTagValues.TAG_INHERITANCE_STRATEGY, classifier, null); + if (value == null) { + value = DEFAULT_INHERITANCE_STRATEGY; + } + return value; + } + + /** * Obtain the value of the {@link TopiaTagValues#TAG_DB_NAME} * tag value on the given classifier. * <p/> Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java 2013-07-03 10:04:24 UTC (rev 2734) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java 2013-07-04 09:38:55 UTC (rev 2735) @@ -99,15 +99,6 @@ String TAG_SCHEMA_NAME = "dbSchema"; /** - * Tag pour spécifier la caractère embed-xml d'une association. - * - * @see TopiaGeneratorUtil#getPersistenceTypeTagValue(ObjectModelClassifier) - * @deprecated @since 2.5, use nowhere, will be remove soon - */ - @Deprecated - String TAG_EMBED_XML = "embedXml"; - - /** * Tag pour la taille du champ en BD. * * @see TopiaGeneratorUtil#getLengthTagValue(ObjectModelAttribute) @@ -237,6 +228,21 @@ @TagValueDefinition(target = {ObjectModel.class, ObjectModelClassifier.class}, documentation = "Configure the proxy interface on something else than the default implementation (null to use our default implementation, none to let hibernate deal it) (Hibernate mapping)") String TAG_PROXY_INTERFACE = "hibernateProxyInterface"; + + /** + * Tag pour configurer la stategie d'heritage choisie. + * <p/> + * Par defaut : union-subclass : Table per class strategy + * Autre valeur : + * "subclass" > Single table per class hierarchy strategy + * "joined-subclass" > Joined subclass strategy + * + * @see TopiaGeneratorUtil#getPersistenceTypeTagValue(ObjectModelClassifier) + * @since 3.0 + */ + @TagValueDefinition(target = {ObjectModel.class, ObjectModelClassifier.class}, + documentation = "Configure the proxy interface on something else than the default implementation (null to use our default implementation, none to let hibernate deal it) (Hibernate mapping)") + String TAG_INHERITANCE_STRATEGY = "inheritanceStrategy"; /** * Tag pour spécifier le permissions à la création.