diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 7408c71..22924e8 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -14,7 +14,10 @@ */ package grails.plugin.reveng +import java.beans.Introspector + import org.hibernate.cfg.Configuration +import org.hibernate.cfg.reveng.ReverseEngineeringStrategyUtil import org.hibernate.mapping.Column import org.hibernate.mapping.ForeignKey import org.hibernate.mapping.ManyToOne @@ -320,7 +323,7 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { clazz.table.uniqueKeyIterator.each { UniqueKey key -> if (key.columnSpan == 1 || key.name == clazz.table.primaryKey?.name) return if (key.columns[-1] == column) { - def otherNames = key.columns[0..-2].collect { "\"$it.name\"" } + def otherNames = key.columns[0..-2].collect { "\"${propertyNameForColumn(it)}\"" } values.unique = '[' + otherNames.reverse().join(', ') + ']' } } @@ -341,6 +344,19 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { constraints.length() ? "\tstatic constraints = {$newline$constraints\t}" : '' } + String propertyNameForColumn(Column column) { + def finder = { Property property -> + Column propColumn = property.columnIterator.next() + propColumn == column + } + + def columnProperty = getAllPropertiesIterator().find(finder) + + if (!columnProperty) { columnProperty = newProperties.find(finder) } + + columnProperty?.name ?: column.name + } + protected boolean isDateType(Type type) { (type instanceof DateType) || (type instanceof TimestampType) || (type instanceof TimeType) || (type instanceof CalendarType) || (type instanceof CalendarDateType) @@ -523,9 +539,43 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { mapping.append renderId() mapping.append renderVersion() mapping.append renderTable() + mapping.append renderColumnMapping() + mapping.length() ? "\tstatic mapping = {$newline$mapping\t}" : '' } + String renderColumnMapping() { + def mapping = new StringBuilder() + + def appender = { Property property, Closure appendCondition -> + Column column = property.columnIterator.next() + if (appendCondition(property, column)) + mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) + } + + def properName = { String columnName -> + Introspector.decapitalize( ReverseEngineeringStrategyUtil.toUpperCamelCase(columnName) ) + } + + getAllPropertiesIterator().each { Property property -> + appender(property, {p, c -> p.name != properName(c.name)}) + } + + newProperties.each { Property property -> + appender(property, {p, c -> p.name + 'Id' != properName(c.name)}) + } + + mapping.toString() + } + + String renderWhenForeignKeyIsAlsoAPrimaryKey(Column column, Property property) { + def identityColumn = getIdentifierProperty().columnIterator.next() + if (column == identityColumn && property != getIdentifierProperty()) + return "\t\t${property.name} insertable:false, updateable:false\n".toString() + return '' + } + String renderClassStart() { "class ${getDeclarationName()}${renderImplements()}{" }