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

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

commit 56e95f1ce1e7fb75ecc3ad2662a558ee6962966b
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon Mar 9 17:20:04 2026 -0500

    hibernate7: SubClassBinder now returns a list of subclasses
---
 .../cfg/domainbinding/binder/GrailsDomainBinder.java    |  2 +-
 .../hibernate/cfg/domainbinding/binder/RootBinder.java  |  4 +++-
 .../cfg/domainbinding/binder/SubClassBinder.java        | 17 +++++++++--------
 .../cfg/domainbinding/CollectionBinderSpec.groovy       |  2 +-
 .../cfg/domainbinding/GrailsPropertyBinderSpec.groovy   |  2 +-
 .../cfg/domainbinding/binder/RootBinderSpec.groovy      |  2 +-
 .../cfg/domainbinding/binder/SubClassBinderSpec.groovy  | 16 +++++-----------
 .../secondpass/ListSecondPassBinderSpec.groovy          |  2 +-
 .../secondpass/MapSecondPassBinderSpec.groovy           |  2 +-
 9 files changed, 23 insertions(+), 26 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java
index 3fb45b072f..c538ba14db 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java
@@ -215,7 +215,7 @@ public class GrailsDomainBinder implements 
AdditionalMappingContributor, TypeCon
             classPropertiesBinder);
     SubClassBinder subClassBinder =
         new SubClassBinder(
-            mappingCacheHolder, subclassMappingBinder, 
multiTenantFilterBinder, dataSourceName, metadataCollector);
+            mappingCacheHolder, subclassMappingBinder, 
multiTenantFilterBinder, dataSourceName);
     RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder =
         new RootPersistentClassCommonValuesBinder(
             metadataBuildingContext,
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java
index 5fd2a224f5..46cd3a65b0 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java
@@ -78,7 +78,9 @@ public class RootBinder {
     }
 
     // bind the sub classes
-    children.forEach(sub -> subClassBinder.bindSubClass(sub, root));
+    children.stream()
+        .flatMap(sub -> subClassBinder.bindSubClass(sub, root).stream())
+        .forEach(mappings::addEntityBinding);
 
     multiTenantFilterBinder.bind(entity, root);
 
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java
index 45100d436c..c8e5058e46 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java
@@ -19,10 +19,11 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
 import jakarta.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.List;
 import org.grails.orm.hibernate.cfg.MappingCacheHolder;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity;
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder;
-import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.mapping.JoinedSubclass;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.SingleTableSubclass;
@@ -36,19 +37,16 @@ public class SubClassBinder {
   private final SubclassMappingBinder subclassMappingBinder;
   private final MultiTenantFilterBinder multiTenantFilterBinder;
   private final String dataSourceName;
-  private final InFlightMetadataCollector mappings;
 
   public SubClassBinder(
       MappingCacheHolder mappingCacheHolder,
       SubclassMappingBinder subclassMappingBinder,
       MultiTenantFilterBinder multiTenantFilterBinder,
-      String dataSourceName,
-      InFlightMetadataCollector mappings) {
+      String dataSourceName) {
     this.mappingCacheHolder = mappingCacheHolder;
     this.subclassMappingBinder = subclassMappingBinder;
     this.multiTenantFilterBinder = multiTenantFilterBinder;
     this.dataSourceName = dataSourceName;
-    this.mappings = mappings;
   }
 
   /**
@@ -56,16 +54,19 @@ public class SubClassBinder {
    *
    * @param sub The sub domain class instance
    * @param parent The parent persistent class instance
+   * @return The list of subclasses created
    */
-  public void bindSubClass(
+  public List<Subclass> bindSubClass(
       @Nonnull GrailsHibernatePersistentEntity sub,
       PersistentClass parent) {
     mappingCacheHolder.cacheMapping(sub);
     Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, 
parent);
     parent.addSubclass(subClass);
-    mappings.addEntityBinding(subClass);
     bindMultiTenantFilter(sub, subClass);
-    sub.getChildEntities(dataSourceName).forEach(sub1 -> bindSubClass(sub1, 
subClass));
+    List<Subclass> subclasses = new ArrayList<>();
+    subclasses.add(subClass);
+    sub.getChildEntities(dataSourceName).forEach(sub1 -> 
subclasses.addAll(bindSubClass(sub1, subClass)));
+    return subclasses;
   }
 
   private void bindMultiTenantFilter(GrailsHibernatePersistentEntity sub, 
Subclass subClass) {
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy
index 65d5e1bab6..c218bf044a 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy
@@ -123,7 +123,7 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
-        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource", getCollector())
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource")
         RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder, 
getCollector())
         DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, 
binder.getMappingCacheHolder(), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder()), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...]
         RootBinder rootBinder = new RootBinder("default", 
multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder, getCollector())
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy
index 6d8f7dc9b5..3d34296eaf 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy
@@ -189,7 +189,7 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
-        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource", collector)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource")
         RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder, collector)
         DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, 
binder.getMappingCacheHolder(), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder()), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...]
         RootBinder rootBinder = new RootBinder("default", 
multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder, collector)
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy
index 790546e79d..6baf5c9f56 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy
@@ -86,7 +86,7 @@ class RootBinderSpec extends HibernateGormDatastoreSpec {
         then:
         1 * 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity)
 >> rootClass
         1 * discriminatorPropertyBinder.bindDiscriminatorProperty(rootClass)
-        1 * subClassBinder.bindSubClass(childEntity, rootClass)
+        1 * subClassBinder.bindSubClass(childEntity, rootClass) >> []
         1 * multiTenantFilterBinder.bind(entity, rootClass)
         mappings.getEntityBinding("Parent") == rootClass
     }
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy
index becc03ce0b..fe89406f1d 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy
@@ -16,11 +16,9 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec {
     MultiTenantFilterBinder multiTenantFilterBinder
     MappingCacheHolder mappingCacheHolder
     MetadataBuildingContext metadataBuildingContext
-    def sharedCollector
 
     void setup() {
         def gdb = getGrailsDomainBinder()
-        sharedCollector = getCollector()
         
         metadataBuildingContext = gdb.getMetadataBuildingContext()
         mappingCacheHolder = gdb.getMappingCacheHolder()
@@ -31,8 +29,7 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec {
                 mappingCacheHolder,
                 subclassMappingBinder,
                 multiTenantFilterBinder,
-                "default",
-                sharedCollector
+                "default"
         )
     }
 
@@ -44,20 +41,18 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec 
{
         def rootClass = new RootClass(metadataBuildingContext)
         rootClass.setEntityName("Parent")
         rootClass.setJpaEntityName("Parent")
-        def mappings = sharedCollector
-        def mapping = new Mapping()
         def subClass = new 
org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext)
         subClass.setEntityName("Child")
         subClass.setJpaEntityName("Child")
 
         when:
-        binder.bindSubClass(subEntity, rootClass)
+        def results = binder.bindSubClass(subEntity, rootClass)
 
         then:
         1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass) 
>> subClass
         1 * multiTenantFilterBinder.bind(subEntity, subClass)
         rootClass.getSubclasses().contains(subClass)
-        mappings.getEntityBinding(subClass.getEntityName()) == subClass
+        results == [subClass]
     }
 
     def "test bindSubClass with children"() {
@@ -72,8 +67,6 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec {
         def rootClass = new RootClass(metadataBuildingContext)
         rootClass.setEntityName("Parent")
         rootClass.setJpaEntityName("Parent")
-        def mappings = sharedCollector
-        def mapping = new Mapping()
         
         def subClass = new 
org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext)
         subClass.setEntityName("Child")
@@ -83,7 +76,7 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec {
         grandChildSubClass.setJpaEntityName("GrandChild")
 
         when:
-        binder.bindSubClass(subEntity, rootClass)
+        def results = binder.bindSubClass(subEntity, rootClass)
 
         then:
         1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass) 
>> subClass
@@ -91,5 +84,6 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec {
         2 * multiTenantFilterBinder.bind(_, _)
         rootClass.getSubclasses().contains(subClass)
         subClass.getSubclasses().contains(grandChildSubClass)
+        results == [subClass, grandChildSubClass]
     }
 }
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy
index 1b3f1b68a8..6c560b489c 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy
@@ -125,7 +125,7 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
-        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource", collector)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource")
         RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder, collector)
         DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, 
binder.getMappingCacheHolder(), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder()), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...]
         RootBinder rootBinder = new RootBinder("default", 
multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder, collector)
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy
index 6df8a1aa53..b9a673e292 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy
@@ -123,7 +123,7 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
-        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource", getCollector())
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, "dataSource")
         RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder, 
getCollector())
         DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, 
binder.getMappingCacheHolder(), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder()), new 
org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new
 org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...]
         RootBinder rootBinder = new RootBinder("default", 
multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder, getCollector())

Reply via email to