From 32b1138af80487c54f04e49ab0af393475f0c3e4 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Fri, 20 Feb 2015 09:44:58 +0100 Subject: [PATCH 1/8] Add column mapping where it is needed --- .../plugin/reveng/GrailsEntityPOJOClass.groovy | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 7408c71..b36e5e9 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -523,9 +523,27 @@ 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() + getAllPropertiesIterator().each { Property property -> + Column column = property.columnIterator.next() + if (property.name != column.name) + mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + } + + for (property in newProperties) { + Column column = property.columnIterator.next() + if (property.name + '_id' != column.name) + mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + } + mapping.toString() + } + String renderClassStart() { "class ${getDeclarationName()}${renderImplements()}{" } From 4678b12f43a0dbe893b942b96a4d2c5aacbef892 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Fri, 20 Feb 2015 11:27:05 +0100 Subject: [PATCH 2/8] unique constraint uses property name instead of column name --- .../plugin/reveng/GrailsEntityPOJOClass.groovy | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index b36e5e9..cccfda1 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -320,7 +320,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 +341,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) From 1fab474d6fae303760af8202244226cce286f520 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Fri, 20 Feb 2015 11:47:07 +0100 Subject: [PATCH 3/8] tabs instead of spaces for code I added --- .../reveng/GrailsEntityPOJOClass.groovy | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index cccfda1..4692ef8 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -341,18 +341,18 @@ 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 - } + String propertyNameForColumn(Column column) { + def finder = { Property property -> + Column propColumn = property.columnIterator.next() + propColumn == column + } - def columnProperty = getAllPropertiesIterator().find(finder) + def columnProperty = getAllPropertiesIterator().find(finder) - if (!columnProperty) { columnProperty = newProperties.find(finder) } + if (!columnProperty) { columnProperty = newProperties.find(finder) } - columnProperty?.name ?: column.name - } + columnProperty?.name ?: column.name + } protected boolean isDateType(Type type) { (type instanceof DateType) || (type instanceof TimestampType) || (type instanceof TimeType) || @@ -536,26 +536,26 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { mapping.append renderId() mapping.append renderVersion() mapping.append renderTable() - mapping.append renderColumnMapping() + mapping.append renderColumnMapping() mapping.length() ? "\tstatic mapping = {$newline$mapping\t}" : '' } - String renderColumnMapping() { - def mapping = new StringBuilder() - getAllPropertiesIterator().each { Property property -> - Column column = property.columnIterator.next() - if (property.name != column.name) - mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) - } - - for (property in newProperties) { - Column column = property.columnIterator.next() - if (property.name + '_id' != column.name) - mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) - } - mapping.toString() - } + String renderColumnMapping() { + def mapping = new StringBuilder() + getAllPropertiesIterator().each { Property property -> + Column column = property.columnIterator.next() + if (property.name != column.name) + mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + } + + for (property in newProperties) { + Column column = property.columnIterator.next() + if (property.name + '_id' != column.name) + mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + } + mapping.toString() + } String renderClassStart() { "class ${getDeclarationName()}${renderImplements()}{" From 8d3a434d17ad090c86646211ac58345a25f8926c Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Fri, 20 Feb 2015 14:06:17 +0100 Subject: [PATCH 4/8] add special mapping when foreign key is also a primary key When foreign key is also a primary key it causes a repeated column in mapping and an org.hibernate.MappingException. It is avoided with: "propName insertable:false, updateable:false" --- .../grails/plugin/reveng/GrailsEntityPOJOClass.groovy | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 4692ef8..3f2e8e1 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -547,16 +547,25 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { Column column = property.columnIterator.next() if (property.name != column.name) mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) } - for (property in newProperties) { + newProperties.each { Property property -> Column column = property.columnIterator.next() if (property.name + '_id' != column.name) mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) + mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) } mapping.toString() } + String renderWhenForeignKeyIsAlsoAPrimaryKey(Column column, Property property) { + def identityColumn = getIdentifierProperty().columnIterator.next() + if (column == identityColumn) + return "\t\t${property.name} insertable:false, updateable:false\n".toString() + return '' + } + String renderClassStart() { "class ${getDeclarationName()}${renderImplements()}{" } From 6b7168c680a4fac84f44ca14ee87a7fdbd726233 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Fri, 20 Feb 2015 15:08:08 +0100 Subject: [PATCH 5/8] DRY --- .../plugin/reveng/GrailsEntityPOJOClass.groovy | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 3f2e8e1..76d7ab2 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -543,19 +543,22 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { String renderColumnMapping() { def mapping = new StringBuilder() - getAllPropertiesIterator().each { Property property -> + + def appender = { Property property, Closure appendCondition -> Column column = property.columnIterator.next() - if (property.name != column.name) + if (appendCondition(property, column)) mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) } + getAllPropertiesIterator().each { Property property -> + appender(property, {p, c -> p.name != c.name}) + } + newProperties.each { Property property -> - Column column = property.columnIterator.next() - if (property.name + '_id' != column.name) - mapping.append("\t\t${property.name} column:'${column.name}'\n".toString()) - mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) + appender(property, {p, c -> p.name + '_id' != c.name}) } + mapping.toString() } From bc61fe7620f76d882bed9043248a3cb265bd9bc2 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Wed, 25 Feb 2015 15:37:22 +0100 Subject: [PATCH 6/8] fix error that adds insertable:false for identifier named other than 'id' --- src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 76d7ab2..5676e7e 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -564,7 +564,7 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { String renderWhenForeignKeyIsAlsoAPrimaryKey(Column column, Property property) { def identityColumn = getIdentifierProperty().columnIterator.next() - if (column == identityColumn) + if (column == identityColumn && property != getIdentifierProperty()) return "\t\t${property.name} insertable:false, updateable:false\n".toString() return '' } From 2ac5b93e0d07331088e46115a2dd91debd9acc9c Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Wed, 25 Feb 2015 15:47:35 +0100 Subject: [PATCH 7/8] don't add column mapping when prop name is camel case of column name --- .../grails/plugin/reveng/GrailsEntityPOJOClass.groovy | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index 5676e7e..a43ffb8 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 @@ -551,12 +554,16 @@ class GrailsEntityPOJOClass extends EntityPOJOClass { mapping.append renderWhenForeignKeyIsAlsoAPrimaryKey(column, property) } + def properName = { String columnName -> + Introspector.decapitalize( ReverseEngineeringStrategyUtil.toUpperCamelCase(columnName) ) + } + getAllPropertiesIterator().each { Property property -> - appender(property, {p, c -> p.name != c.name}) + appender(property, {p, c -> p.name != properName(c.name)}) } newProperties.each { Property property -> - appender(property, {p, c -> p.name + '_id' != c.name}) + appender(property, {p, c -> p.name + 'Id' != properName(c.name)}) } mapping.toString() From 7e4f4810481c9f93f5800d6f130073c845c23fe6 Mon Sep 17 00:00:00 2001 From: Lucija Vojnovic Date: Wed, 25 Feb 2015 17:43:22 +0100 Subject: [PATCH 8/8] remove ; --- src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy index a43ffb8..22924e8 100644 --- a/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy +++ b/src/groovy/grails/plugin/reveng/GrailsEntityPOJOClass.groovy @@ -14,7 +14,7 @@ */ package grails.plugin.reveng -import java.beans.Introspector; +import java.beans.Introspector import org.hibernate.cfg.Configuration import org.hibernate.cfg.reveng.ReverseEngineeringStrategyUtil