This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch merge-hibernate6
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 8cbd4aced63bfe1af0b57824815c39632a39006c
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Sat Jul 12 19:23:28 2025 -0500

    refactor ColumnConfigToColumnBinder
---
 .../orm/hibernate/cfg/GrailsDomainBinder.java      | 44 ++++------
 .../domainbinding/ColumnConfigToColumnBinder.java  | 29 +++++++
 .../ColumnConfigToColumnBinderSpec.groovy          | 94 ++++++++++++++++++++++
 3 files changed, 137 insertions(+), 30 deletions(-)

diff --git 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
index 53cc91f2e2..5cf0186fbe 100644
--- 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
+++ 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
@@ -35,6 +35,7 @@ import org.grails.datastore.mapping.reflect.EntityReflector;
 import org.grails.datastore.mapping.reflect.NameUtils;
 import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy;
 import org.grails.orm.hibernate.cfg.domainbinding.ClassBinder;
+import org.grails.orm.hibernate.cfg.domainbinding.ColumnConfigToColumnBinder;
 import 
org.grails.orm.hibernate.cfg.domainbinding.ConfigureDerivedPropertiesConsumer;
 import org.grails.orm.hibernate.cfg.domainbinding.NamingStrategyProvider;
 import org.grails.orm.hibernate.cfg.domainbinding.SimpleValueBinder;
@@ -285,7 +286,10 @@ public class GrailsDomainBinder implements 
MetadataContributor {
         new SimpleValueBinder().bindSimpleValue(value, type, columnName1, 
true);
         PropertyConfig pc = getPropertyConfig(property);
         if (pc != null && pc.getIndexColumn() != null) {
-            bindColumnConfigToColumn(property, getColumnForSimpleValue(value), 
getSingleColumnConfig(pc.getIndexColumn()));
+            Column column = getColumnForSimpleValue(value);
+            ColumnConfig columnConfig = 
getSingleColumnConfig(pc.getIndexColumn());
+            final PropertyConfig mappedForm = getPropertyConfig(property);
+            new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, 
columnConfig, mappedForm);
         }
 
         if (!value.isTypeSpecified()) {
@@ -771,7 +775,10 @@ public class GrailsDomainBinder implements 
MetadataContributor {
 
                 new SimpleValueBinder().bindSimpleValue(element, typeName, 
columnName, true);
                 if (hasJoinColumnMapping) {
-                    bindColumnConfigToColumn(property, 
getColumnForSimpleValue(element), config.getJoinTable().getColumn());
+                    Column column = getColumnForSimpleValue(element);
+                    ColumnConfig columnConfig = 
config.getJoinTable().getColumn();
+                    final PropertyConfig mappedForm = 
getPropertyConfig(property);
+                    new 
ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, columnConfig, 
mappedForm);
                 }
             }
         } else {
@@ -813,31 +820,6 @@ public class GrailsDomainBinder implements 
MetadataContributor {
         return element.getColumns().iterator().next();
     }
 
-    private void bindColumnConfigToColumn(PersistentProperty property, Column 
column, ColumnConfig columnConfig) {
-        final PropertyConfig mappedForm = getPropertyConfig(property);
-        boolean allowUnique = mappedForm != null && 
!mappedForm.isUniqueWithinGroup();
-
-        if (columnConfig == null) {
-            return;
-        }
-
-        if (columnConfig.getLength() != -1) {
-            column.setLength(columnConfig.getLength());
-        }
-        if (columnConfig.getPrecision() != -1) {
-            column.setPrecision(columnConfig.getPrecision());
-        }
-        if (columnConfig.getScale() != -1) {
-            column.setScale(columnConfig.getScale());
-        }
-        if (columnConfig.getSqlType() != null && 
!columnConfig.getSqlType().isEmpty()) {
-            column.setSqlType(columnConfig.getSqlType());
-        }
-        if(allowUnique) {
-            column.setUnique(columnConfig.getUnique());
-        }
-    }
-
     private boolean hasJoinColumnMapping(PropertyConfig config) {
         return config != null && config.getJoinTable() != null && 
config.getJoinTable().getColumn() != null;
     }
@@ -1712,7 +1694,7 @@ public class GrailsDomainBinder implements 
MetadataContributor {
                 if (cc.getName() != null) {
                     c.setName(cc.getName());
                 }
-                bindColumnConfigToColumn(null, c, cc);
+                new ColumnConfigToColumnBinder().bindColumnConfigToColumn(c, 
cc, null);
             }
         }
 
@@ -2128,8 +2110,10 @@ public class GrailsDomainBinder implements 
MetadataContributor {
 
         PropertyConfig propertyConfig = getPropertyConfig(property);
         if (propertyConfig != null && !propertyConfig.getColumns().isEmpty()) {
-            bindIndex(columnName, column, propertyConfig.getColumns().get(0), 
t);
-            bindColumnConfigToColumn(property, column, 
propertyConfig.getColumns().get(0));
+            ColumnConfig columnConfig = propertyConfig.getColumns().get(0);
+            bindIndex(columnName, column, columnConfig, t);
+            final PropertyConfig mappedForm = getPropertyConfig(property);
+            new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, 
columnConfig, mappedForm);
         }
     }
 
diff --git 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java
 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java
new file mode 100644
index 0000000000..795b31d740
--- /dev/null
+++ 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinder.java
@@ -0,0 +1,29 @@
+package org.grails.orm.hibernate.cfg.domainbinding;
+
+import org.grails.orm.hibernate.cfg.ColumnConfig;
+import org.grails.orm.hibernate.cfg.PropertyConfig;
+import org.hibernate.mapping.Column;
+
+public class ColumnConfigToColumnBinder {
+
+    public void bindColumnConfigToColumn(Column column, ColumnConfig 
columnConfig, PropertyConfig mappedForm) {
+        if (columnConfig == null) {
+            return;
+        }
+        if (columnConfig.getLength() != -1) {
+            column.setLength(columnConfig.getLength());
+        }
+        if (columnConfig.getPrecision() != -1) {
+            column.setPrecision(columnConfig.getPrecision());
+        }
+        if (columnConfig.getScale() != -1) {
+            column.setScale(columnConfig.getScale());
+        }
+        if (columnConfig.getSqlType() != null && 
!columnConfig.getSqlType().isEmpty()) {
+            column.setSqlType(columnConfig.getSqlType());
+        }
+        if(mappedForm != null && !mappedForm.isUniqueWithinGroup()) {
+            column.setUnique(columnConfig.getUnique());
+        }
+    }
+}
diff --git 
a/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy
 
b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy
new file mode 100644
index 0000000000..84c12f7390
--- /dev/null
+++ 
b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnConfigToColumnBinderSpec.groovy
@@ -0,0 +1,94 @@
+package org.grails.orm.hibernate.cfg.domainbinding
+
+import org.grails.orm.hibernate.cfg.ColumnConfig
+import org.grails.orm.hibernate.cfg.PropertyConfig
+import org.hibernate.mapping.Column
+import spock.lang.Specification
+
+class ColumnConfigToColumnBinderSpec extends Specification {
+
+    def binder = new ColumnConfigToColumnBinder()
+    def column = Mock(Column)
+
+    def "should handle null column config"() {
+        when:
+        binder.bindColumnConfigToColumn(column, null, null)
+
+        then:
+        0 * column._  // verifies no interactions with column
+    }
+
+    def "should bind column properties when values are valid"() {
+        given:
+        def columnConfig = new ColumnConfig()
+        columnConfig.length = 100
+        columnConfig.precision = 10
+        columnConfig.scale = 2
+        columnConfig.sqlType = "VARCHAR"
+        columnConfig.unique = true
+
+        when:
+        binder.bindColumnConfigToColumn(column, columnConfig, null)
+
+        then:
+        1 * column.setLength(100)
+        1 * column.setPrecision(10)
+        1 * column.setScale(2)
+        1 * column.setSqlType("VARCHAR")
+        0 * column.setUnique(_)
+    }
+
+    def "should not bind properties when values are -1"() {
+        given:
+        def columnConfig = new ColumnConfig()
+        columnConfig.length = -1
+        columnConfig.precision = -1
+        columnConfig.scale = -1
+
+        when:
+        binder.bindColumnConfigToColumn(column, columnConfig, null)
+
+        then:
+        0 * column.setLength(_)
+        0 * column.setPrecision(_)
+        0 * column.setScale(_)
+        0 * column.setUnique(_)
+    }
+
+    def "column config honors uniqueness property"() {
+        given:
+        def columnConfig = new ColumnConfig()
+        columnConfig.length = -1
+        columnConfig.precision = -1
+        columnConfig.scale = -1
+        PropertyConfig mappedForm = new PropertyConfig()
+        mappedForm.setUnique("name")
+
+        when:
+        binder.bindColumnConfigToColumn(column, columnConfig, mappedForm)
+
+        then:
+        0 * column.setLength(_)
+        0 * column.setPrecision(_)
+        0 * column.setScale(_)
+        0 * column.setUnique(_)
+    }
+
+    def "column config honors uniqueness property"() {
+        given:
+        def columnConfig = new ColumnConfig()
+        columnConfig.length = -1
+        columnConfig.precision = -1
+        columnConfig.scale = -1
+        PropertyConfig mappedForm = new PropertyConfig()
+
+        when:
+        binder.bindColumnConfigToColumn(column, columnConfig, mappedForm)
+
+        then:
+        0 * column.setLength(_)
+        0 * column.setPrecision(_)
+        0 * column.setScale(_)
+        1 * column.setUnique(_)
+    }
+}
\ No newline at end of file

Reply via email to