Author: bleny Date: 2011-06-21 17:46:57 +0200 (Tue, 21 Jun 2011) New Revision: 2305 Url: http://nuiton.org/repositories/revision/topia/2305 Log: add possibility to use name instead of ordinal to store enumeration value using a tagValue 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 trunk/topia-persistence/src/site/rst/user/tagvalues.rst trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java trunk/topia-persistence/src/test/xmi/topiatest.properties trunk/topia-persistence/src/test/xmi/topiatest.zargo 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 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2011-06-21 15:46:57 UTC (rev 2305) @@ -47,15 +47,18 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.java.JavaGenerator; import org.nuiton.eugene.java.JavaGeneratorUtil; import org.nuiton.eugene.models.object.ObjectModelAssociationClass; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelGenerator; +import javax.persistence.EnumType; import java.io.File; import java.io.IOException; import java.io.Writer; +import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -432,7 +435,19 @@ if (attrIsEnumeration) { /*{> <%=prefix%> <type name="org.hibernate.type.EnumType"> -<%=prefix%> <param name="enumClass"><%=attrType%></param> +<%=prefix%> <param name="<%=org.hibernate.type.EnumType.ENUM%>"><%=attrType%></param>}*/ + + // if the user tuned the model to use name instead of + // ordinal to store the values, we must add a clause + boolean useEnumerationName = TopiaGeneratorUtil.hasUseEnumerationNameTagValue(attr, model); + if (useEnumerationName) { + String enumSQLType = String.valueOf(Types.VARCHAR); +/*{ +<%=prefix%> <!-- using name instead of ordinal to store enumeration value --> +<%=prefix%> <param name="<%=org.hibernate.type.EnumType.TYPE%>"><%=enumSQLType%></param>}*/ + } + +/*{ <%=prefix%> </type> <%=prefix%> </property> }*/ 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 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2011-06-21 15:46:57 UTC (rev 2305) @@ -43,6 +43,7 @@ import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelOperation; import org.nuiton.eugene.models.object.ObjectModelParameter; +import org.nuiton.eugene.models.object.validator.AttributeNamesValidator; import org.nuiton.topia.persistence.TopiaDAOImpl; import java.util.ArrayList; @@ -1757,5 +1758,10 @@ return value; } + public static boolean hasUseEnumerationNameTagValue(ObjectModelAttribute attr, ObjectModel model) { + String value = findTagValue(TopiaTagValues.TAG_USE_ENUMERATION_NAME, attr, model); + return Boolean.parseBoolean(value); + } + } // TopiaGeneratorUtil 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 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java 2011-06-21 15:46:57 UTC (rev 2305) @@ -214,6 +214,16 @@ String TAG_NOT_NULL = "notNull"; /** + * Tag à placer sur un l'attribut d'une entité. Cet attribut est de type + * énumération : l'ajout de la tagValue indique qu'il faut utiliser le + * {@code name} de l'énumération et non l'ordinal pour stocker la valeur en + * base + */ + @TagValueDefinition(target = {ObjectModelAttribute.class}, + documentation = "'true' if the value of this attribute of type Enumeration should be stored with its name (instead of using ordinal)") + String TAG_USE_ENUMERATION_NAME = "useEnumerationName"; + + /** * Tag pour configurer l'interface du proxy sur autre chose que l'implementation par defaut. * <p/> * Par defaut : Modified: trunk/topia-persistence/src/site/rst/user/tagvalues.rst =================================================================== --- trunk/topia-persistence/src/site/rst/user/tagvalues.rst 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/site/rst/user/tagvalues.rst 2011-06-21 15:46:57 UTC (rev 2305) @@ -68,8 +68,11 @@ | hibernateProxyInterface | hibernate | To not generate proxy information in | | | | hibernate mappings. | +--------------------------+-----------+----------------------------------------------------+ +| useEnumerationName | hibernate | To make an entity attribute of type enum be stored | +| | | in DB with its name (instead of ordinal, which is | +| | | the default in Hibernate) | ++--------------------------+-----------+----------------------------------------------------+ - Eugene tag values ----------------- Modified: trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java 2011-06-21 15:46:57 UTC (rev 2305) @@ -37,6 +37,10 @@ import java.io.File; import java.io.IOException; +/** + * Test the support of possibility to have an attribute of type enumeration + * in a entity + */ public class EnumTest { private static final Log log = LogFactory.getLog(EnumTest.class); @@ -55,6 +59,14 @@ return root; } + /** + * Create an entity having two field of type enumeration. One is stored + * using ordinal, the other using the name. + * + * The test check that values are stored, and that find methods works + * + * @throws Exception + */ @Test public void storeEntityWithEnumValue() throws Exception { TopiaContext root = initTopiaContext("storeEntityWithEnumValue"); @@ -63,6 +75,7 @@ PersonneDAO dao = TopiaTestDAOHelper.getPersonneDAO(transaction); Personne personne = new PersonneImpl(); personne.setGender(Gender.FEMALE); + personne.setOtherGender(Gender.MALE); dao.create(personne); String topiaId = personne.getTopiaId(); transaction.commitTransaction(); @@ -72,8 +85,10 @@ dao = TopiaTestDAOHelper.getPersonneDAO(transaction); dao.findByTopiaId(topiaId); Assert.assertEquals(Gender.FEMALE, personne.getGender()); + Assert.assertEquals(Gender.MALE, personne.getOtherGender()); Assert.assertNotNull(dao.findByGender(Gender.FEMALE)); + Assert.assertNotNull(dao.findByOtherGender(Gender.MALE)); transaction.closeContext(); } } Modified: trunk/topia-persistence/src/test/xmi/topiatest.properties =================================================================== --- trunk/topia-persistence/src/test/xmi/topiatest.properties 2011-06-21 14:21:35 UTC (rev 2304) +++ trunk/topia-persistence/src/test/xmi/topiatest.properties 2011-06-21 15:46:57 UTC (rev 2305) @@ -38,4 +38,6 @@ org.nuiton.topiatest.NaturalizedEntity.attribute.naturalIdNotNull.tagvalue.naturalId=true org.nuiton.topiatest.NaturalizedEntity.attribute.naturalIdNull.tagvalue.naturalId=true -org.nuiton.topiatest.NaturalizedEntity.attribute.naturalIdNull.tagvalue.notNull=false \ No newline at end of file +org.nuiton.topiatest.NaturalizedEntity.attribute.naturalIdNull.tagvalue.notNull=false + +org.nuiton.topiatest.Personne.attribute.otherGender.tagValue.useEnumerationName=true \ No newline at end of file Modified: trunk/topia-persistence/src/test/xmi/topiatest.zargo =================================================================== (Binary files differ)