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

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


The following commit(s) were added to refs/heads/8.0.x-hibernate7 by this push:
     new 4f837a4f13 Issue 14716: H5 fix for this
4f837a4f13 is described below

commit 4f837a4f13718190e9a97c639752d1037e5b2886
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon May 18 21:43:29 2026 -0500

    Issue 14716: H5 fix for this
---
 .../orm/hibernate/cfg/GrailsDomainBinder.java      | 13 +++++++-----
 .../hibernate/cfg/HibernateMappingBuilder.groovy   |  7 ++++++-
 .../org/grails/orm/hibernate/cfg/JoinTable.groovy  | 23 ++++++++++++++++++----
 .../grails/orm/hibernate/cfg/PropertyConfig.groovy | 10 +++++++++-
 .../mapping/HibernateMappingBuilderTests.groovy    |  4 ++--
 .../hibernate/mapping/MappingBuilderSpec.groovy    |  4 ++--
 .../CompositeKeyJoinTableIntegrationSpec.groovy    |  1 -
 7 files changed, 46 insertions(+), 16 deletions(-)

diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
index 1c5715728c..cfc0bae3d5 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
@@ -499,7 +499,8 @@ public class GrailsDomainBinder implements 
MetadataContributor {
             }
         } else {
             if (hasJoinKeyMapping(propConfig)) {
-                bindSimpleValue("long", key, false, 
propConfig.getJoinTable().getKey().getName(), mappings);
+                java.util.List<ColumnConfig> keys = 
propConfig.getJoinTable().getKeys();
+                bindSimpleValue("long", key, false, keys.get(0).getName(), 
mappings);
             } else {
                 bindDependentKeyValue(property, key, mappings, 
sessionFactoryBeanName);
             }
@@ -2392,7 +2393,9 @@ public class GrailsDomainBinder implements 
MetadataContributor {
                     final ColumnConfig columnConfig = new ColumnConfig();
                     
columnConfig.setName(namingStrategy.propertyToColumnName(property.getName()) +
                             UNDERSCORE + FOREIGN_KEY_SUFFIX);
-                    jt.setKey(columnConfig);
+                    java.util.List<ColumnConfig> keys = new 
java.util.ArrayList<>();
+                    keys.add(columnConfig);
+                    jt.setKeys(keys);
                     pc.setJoinTable(jt);
                 }
                 bindSimpleValue(property, manyToOne, path, pc, 
sessionFactoryBeanName);
@@ -3143,7 +3146,7 @@ public class GrailsDomainBinder implements 
MetadataContributor {
                 PropertyConfig c = m.getPropertyConfig(grailsProp.getName());
 
                 if (supportsJoinColumnMapping(grailsProp) && 
hasJoinKeyMapping(c)) {
-                    columnName = c.getJoinTable().getKey().getName();
+                    columnName = c.getJoinTable().getKeys().get(0).getName();
                 }
                 else if (c != null && c.getColumn() != null) {
                     columnName = c.getColumn();
@@ -3154,7 +3157,7 @@ public class GrailsDomainBinder implements 
MetadataContributor {
             if (supportsJoinColumnMapping(grailsProp)) {
                 PropertyConfig pc = getPropertyConfig(grailsProp);
                 if (hasJoinKeyMapping(pc)) {
-                    columnName = pc.getJoinTable().getKey().getName();
+                    columnName = pc.getJoinTable().getKeys().get(0).getName();
                 }
                 else {
                     columnName = cc.getName();
@@ -3177,7 +3180,7 @@ public class GrailsDomainBinder implements 
MetadataContributor {
     }
 
     protected boolean hasJoinKeyMapping(PropertyConfig c) {
-        return c != null && c.getJoinTable() != null && 
c.getJoinTable().getKey() != null;
+        return c != null && c.getJoinTable() != null && 
c.getJoinTable().getKeys() != null && !c.getJoinTable().getKeys().isEmpty();
     }
 
     protected boolean supportsJoinColumnMapping(PersistentProperty grailsProp) 
{
diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy
index b7d7e55b00..4e9ac40c95 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy
@@ -588,7 +588,12 @@ class HibernateMappingBuilder implements 
MappingConfigurationBuilder<Mapping, Pr
                     if (joinArgs.catalog) join.catalog = 
joinArgs.remove('catalog')
                     if (joinArgs.name) join.name = joinArgs.remove('name')
                     if (joinArgs.key) {
-                        join.key = new ColumnConfig(name: 
joinArgs.remove('key'))
+                        def keyVal = joinArgs.remove('key')
+                        if (keyVal instanceof Collection || 
keyVal.getClass().isArray()) {
+                            join.keys(keyVal as List)
+                        } else {
+                            join.key(keyVal.toString())
+                        }
                     }
                     if (joinArgs.column) {
                         ColumnConfig cc = new ColumnConfig(name: 
joinArgs.column)
diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy
index c3bc008128..45cfb36128 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy
@@ -36,9 +36,24 @@ import groovy.transform.builder.SimpleStrategy
 class JoinTable extends Table {
 
     /**
-     * The foreign key column
+     * The foreign key columns (composite key support)
      */
-    ColumnConfig key
+    List<ColumnConfig> keys = []
+
+    void setKeys(List<ColumnConfig> keys) {
+        this.keys = keys
+    }
+
+    /**
+     * Configures the keys
+     * @param names The key names
+     * @return This join table config
+     */
+    JoinTable keys(List names) {
+        this.keys = (List<ColumnConfig>) names.collect { it instanceof 
ColumnConfig ? it : new ColumnConfig(name: it.toString()) }
+        return this
+    }
+
     /**
      * The child id column
      */
@@ -50,7 +65,7 @@ class JoinTable extends Table {
      * @return This join table config
      */
     JoinTable key(@DelegatesTo(ColumnConfig) Closure columnConfig) {
-        key = ColumnConfig.configureNew(columnConfig)
+        keys = [ColumnConfig.configureNew(columnConfig)]
         return this
     }
     /**
@@ -69,7 +84,7 @@ class JoinTable extends Table {
      * @return This join table config
      */
     JoinTable key(String columnName) {
-        key = new ColumnConfig(name: columnName)
+        keys = [new ColumnConfig(name: columnName)]
         return this
     }
 
diff --git 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy
 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy
index 77c36e15a0..fcab77a84f 100644
--- 
a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy
+++ 
b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy
@@ -232,7 +232,11 @@ class PropertyConfig extends Property {
         DataBinder dataBinder = new DataBinder(joinTable)
         dataBinder.bind(new MutablePropertyValues(joinTableDef))
         if (joinTableDef.key) {
-            joinTable.key(joinTableDef.key.toString())
+            if (joinTableDef.key instanceof Collection || 
joinTableDef.key.getClass().isArray()) {
+                joinTable.keys(joinTableDef.key as List)
+            } else {
+                joinTable.key(joinTableDef.key.toString())
+            }
         }
         if (joinTableDef.column) {
             joinTable.column(joinTableDef.column.toString())
@@ -472,4 +476,8 @@ class PropertyConfig extends Property {
         }
         return pc
     }
+
+    boolean hasJoinKeyMapping() {
+        joinTable?.keys
+    }
 }
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/HibernateMappingBuilderTests.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/HibernateMappingBuilderTests.groovy
index 284a0af7d1..342cc44b93 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/HibernateMappingBuilderTests.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/HibernateMappingBuilderTests.groovy
@@ -380,7 +380,7 @@ class HibernateMappingBuilderTests {
         property = mapping.getPropertyConfig('things')
         assert property?.joinTable
         assertEquals "foo", property.joinTable.name
-        assertEquals "foo_id", property.joinTable.key.name
+        assertEquals "foo_id", property.joinTable.keys[0].name
         assertEquals "bar_id", property.joinTable.column.name
     }
 
@@ -408,7 +408,7 @@ class HibernateMappingBuilderTests {
         property = mapping.getPropertyConfig('things')
         assert property?.joinTable
         assertEquals "foo", property.joinTable.name
-        assertEquals "foo_id", property.joinTable.key.name
+        assertEquals "foo_id", property.joinTable.keys[0].name
         assertEquals "bar_id", property.joinTable.column.name
     }
 
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/MappingBuilderSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/MappingBuilderSpec.groovy
index 876bbcd3c8..afea25aa23 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/MappingBuilderSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/hibernate/mapping/MappingBuilderSpec.groovy
@@ -259,7 +259,7 @@ class MappingBuilderSpec extends Specification {
         config != null
         config.joinTable != null
         config.joinTable.name == 'foo'
-        config.joinTable.key.name == 'foo_id'
+        config.joinTable.keys[0].name == 'foo_id'
         config.joinTable.column.name == 'bar_id'
 
     }
@@ -280,7 +280,7 @@ class MappingBuilderSpec extends Specification {
         config != null
         config.joinTable != null
         config.joinTable.name == 'foo'
-        config.joinTable.key.name == 'foo_id'
+        config.joinTable.keys[0].name == 'foo_id'
         config.joinTable.column.name == 'bar_id'
 
     }
diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/CompositeKeyJoinTableIntegrationSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/CompositeKeyJoinTableIntegrationSpec.groovy
index 16ad4e010c..267c09c954 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/CompositeKeyJoinTableIntegrationSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/CompositeKeyJoinTableIntegrationSpec.groovy
@@ -32,7 +32,6 @@ class CompositeKeyJoinTableIntegrationSpec extends 
HibernateGormDatastoreSpec {
 
         expect:
         joinTable.keys*.name == ['a_col', 'b_col']
-        joinTable.getKey().name == 'a_col'
         joinTable.column.name == 'c'
     }
 

Reply via email to