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

commit 84804ede7fc8287af44c30e94d45f82caf5c3a20
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Thu Feb 19 12:54:09 2026 -0600

    Refactor GrailsDomainBinder.bindSubClass into SubClassBinder and add spec
---
 .../domainbinding/binder/GrailsDomainBinder.java   | 47 ++--------
 .../cfg/domainbinding/binder/SubClassBinder.java   | 65 ++++++++++++++
 .../cfg/domainbinding/CollectionBinderSpec.groovy  | 12 ++-
 .../domainbinding/GrailsPropertyBinderSpec.groovy  | 12 ++-
 .../domainbinding/binder/SubClassBinderSpec.groovy | 99 ++++++++++++++++++++++
 .../secondpass/ListSecondPassBinderSpec.groovy     | 12 ++-
 .../secondpass/MapSecondPassBinderSpec.groovy      | 12 ++-
 7 files changed, 202 insertions(+), 57 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 1943517cf5..6c71c38f8b 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
@@ -209,11 +209,14 @@ public class GrailsDomainBinder
         UnionSubclassBinder unionSubclassBinder = new 
UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder);
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder);
 
+        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder);
+        SubClassBinder subClassBinder = new SubClassBinder(mappingCacheHolder, 
subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, 
dataSourceName);
+
         hibernateMappingContext
                 .getHibernatePersistentEntities(dataSourceName)
                 .stream()
                 .filter(persistentEntity -> 
persistentEntity.forGrailsDomainMapping(dataSourceName))
-                .forEach(hibernatePersistentEntity -> 
bindRoot(hibernatePersistentEntity, metadataCollector, 
defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, 
classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder));
+                .forEach(hibernatePersistentEntity -> 
bindRoot(hibernatePersistentEntity, metadataCollector, 
defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, 
classPropertiesBinder, multiTenantFilterBinder, subClassBinder));
     }
 
 
@@ -242,9 +245,8 @@ public class GrailsDomainBinder
      *
      * @param entity The Grails domain class
      * @param mappings    The Hibernate Mappings object
-     * @param sessionFactoryBeanName  the session factory bean name
      */
-    protected void bindRoot(@Nonnull GrailsHibernatePersistentEntity 
entity,@Nonnull InFlightMetadataCollector mappings, DefaultColumnNameFetcher 
defaultColumnNameFetcher, IdentityBinder identityBinder, VersionBinder 
versionBinder, ClassBinder classBinder, ClassPropertiesBinder 
classPropertiesBinder, MultiTenantFilterBinder multiTenantFilterBinder, 
JoinedSubClassBinder joinedSubClassBinder, UnionSubclassBinder 
unionSubclassBinder, SingleTableSubclassBinder singleTableSubclassBinder) {
+    protected void bindRoot(@Nonnull GrailsHibernatePersistentEntity 
entity,@Nonnull InFlightMetadataCollector mappings, DefaultColumnNameFetcher 
defaultColumnNameFetcher, IdentityBinder identityBinder, VersionBinder 
versionBinder, ClassBinder classBinder, ClassPropertiesBinder 
classPropertiesBinder, MultiTenantFilterBinder multiTenantFilterBinder, 
SubClassBinder subClassBinder) {
         if (mappings.getEntityBinding(entity.getName()) != null) {
             LOG.info("[GrailsDomainBinder] Class [" + entity.getName() + "] is 
already mapped, skipping.. ");
             return;
@@ -259,7 +261,7 @@ public class GrailsDomainBinder
             discriminatorPropertyBinder.bindDiscriminatorProperty(root, m);
         }
         // bind the sub classes
-        children.forEach(sub -> bindSubClass(sub, root, mappings, 
finalMapping,mappingCacheHolder, defaultColumnNameFetcher, classBinder, 
classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder));
+        children.forEach(sub -> subClassBinder.bindSubClass(sub, root, 
mappings, finalMapping));
 
         multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, 
mappings, defaultColumnNameFetcher);
 
@@ -275,43 +277,6 @@ public class GrailsDomainBinder
         return namingStrategy;
     }
 
-    /**
-     * Binds a sub class.
-     *
-     * @param sub                The sub domain class instance
-     * @param parent             The parent persistent class instance
-     * @param mappings           The mappings instance
-     * @param mappingCacheHolder
-     */
-    private void bindSubClass(@Nonnull GrailsHibernatePersistentEntity sub,
-                              PersistentClass parent,
-                              @Nonnull InFlightMetadataCollector mappings,
-                              Mapping m, MappingCacheHolder 
mappingCacheHolder, DefaultColumnNameFetcher defaultColumnNameFetcher, 
ClassBinder classBinder, ClassPropertiesBinder classPropertiesBinder, 
MultiTenantFilterBinder multiTenantFilterBinder, JoinedSubClassBinder 
joinedSubClassBinder, UnionSubclassBinder unionSubclassBinder, 
SingleTableSubclassBinder singleTableSubclassBinder) {
-        mappingCacheHolder.cacheMapping(sub);
-        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder);
-        Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, 
parent, mappings, m);
-
-
-        parent.addSubclass(subClass);
-        mappings.addEntityBinding(subClass);
-
-        multiTenantFilterBinder.addMultiTenantFilterIfNecessary(sub, subClass, 
mappings, defaultColumnNameFetcher);
-
-        var children = sub.getChildEntities(dataSourceName);
-        if (!children.isEmpty()) {
-            // bind the sub classes
-            children.forEach(sub1 -> bindSubClass(sub1, subClass, mappings, 
m,mappingCacheHolder, defaultColumnNameFetcher, classBinder, 
classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder ));
-        }
-    }
-
-
-    /**
-     * Binds a sub-class using table-per-hierarchy inheritance mapping
-     *
-     * @param sub      The Grails domain class instance representing the 
sub-class
-     * @param subClass The Hibernate SubClass instance
-     * @param mappings The mappings instance
-     */
     public MetadataBuildingContext getMetadataBuildingContext() {
         return metadataBuildingContext;
     }
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
new file mode 100644
index 0000000000..6eae67b676
--- /dev/null
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java
@@ -0,0 +1,65 @@
+package org.grails.orm.hibernate.cfg.domainbinding.binder;
+
+import jakarta.annotation.Nonnull;
+import org.grails.orm.hibernate.cfg.Mapping;
+import org.grails.orm.hibernate.cfg.MappingCacheHolder;
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity;
+import 
org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher;
+import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder;
+import org.hibernate.boot.spi.InFlightMetadataCollector;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Subclass;
+
+import java.util.Collection;
+
+/**
+ * Binder for subclasses.
+ */
+public class SubClassBinder {
+
+    private final MappingCacheHolder mappingCacheHolder;
+    private final SubclassMappingBinder subclassMappingBinder;
+    private final MultiTenantFilterBinder multiTenantFilterBinder;
+    private final DefaultColumnNameFetcher defaultColumnNameFetcher;
+    private final String dataSourceName;
+
+    public SubClassBinder(
+            MappingCacheHolder mappingCacheHolder,
+            SubclassMappingBinder subclassMappingBinder,
+            MultiTenantFilterBinder multiTenantFilterBinder,
+            DefaultColumnNameFetcher defaultColumnNameFetcher,
+            String dataSourceName) {
+        this.mappingCacheHolder = mappingCacheHolder;
+        this.subclassMappingBinder = subclassMappingBinder;
+        this.multiTenantFilterBinder = multiTenantFilterBinder;
+        this.defaultColumnNameFetcher = defaultColumnNameFetcher;
+        this.dataSourceName = dataSourceName;
+    }
+
+    /**
+     * Binds a sub class.
+     *
+     * @param sub                The sub domain class instance
+     * @param parent             The parent persistent class instance
+     * @param mappings           The mappings instance
+     * @param m                  The mapping config
+     */
+    public void bindSubClass(@Nonnull GrailsHibernatePersistentEntity sub,
+                              PersistentClass parent,
+                              @Nonnull InFlightMetadataCollector mappings,
+                              Mapping m) {
+        mappingCacheHolder.cacheMapping(sub);
+        Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, 
parent, mappings, m);
+
+        parent.addSubclass(subClass);
+        mappings.addEntityBinding(subClass);
+
+        multiTenantFilterBinder.addMultiTenantFilterIfNecessary(sub, subClass, 
mappings, defaultColumnNameFetcher);
+
+        Collection<GrailsHibernatePersistentEntity> children = 
sub.getChildEntities(dataSourceName);
+        if (!children.isEmpty()) {
+            // bind the sub classes
+            children.forEach(sub1 -> bindSubClass(sub1, subClass, mappings, 
m));
+        }
+    }
+}
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 090fd9e286..5eb1164955 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
@@ -18,6 +18,8 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder
@@ -117,6 +119,9 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
         UnionSubclassBinder unionSubclassBinder = new 
UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder)
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
+        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+
         return [
             propertyBinder: propertyBinder,
             collectionBinder: collectionBinder,
@@ -129,7 +134,8 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
             multiTenantFilterBinder: multiTenantFilterBinder,
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
-            singleTableSubclassBinder: singleTableSubclassBinder
+            singleTableSubclassBinder: singleTableSubclassBinder,
+            subClassBinder: subClassBinder
         ]
     }
 
@@ -142,9 +148,7 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.classBinder as ClassBinder, 
             binders.classPropertiesBinder as ClassPropertiesBinder, 
             binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.joinedSubClassBinder as JoinedSubClassBinder, 
-            binders.unionSubclassBinder as UnionSubclassBinder, 
-            binders.singleTableSubclassBinder as SingleTableSubclassBinder)
+            binders.subClassBinder as SubClassBinder)
     }
 
     void setupSpec() {
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 299a32c857..9651232933 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
@@ -28,6 +28,8 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher
 import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
@@ -177,6 +179,9 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         UnionSubclassBinder unionSubclassBinder = new 
UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder)
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
+        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+
         return [
             propertyBinder: propertyBinder,
             collectionBinder: collectionBinder,
@@ -190,7 +195,8 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
             naturalIdentifierBinder: naturalIdentifierBinder,
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
-            singleTableSubclassBinder: singleTableSubclassBinder
+            singleTableSubclassBinder: singleTableSubclassBinder,
+            subClassBinder: subClassBinder
         ]
     }
 
@@ -203,9 +209,7 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.classBinder as ClassBinder, 
             binders.classPropertiesBinder as ClassPropertiesBinder, 
             binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.joinedSubClassBinder as JoinedSubClassBinder, 
-            binders.unionSubclassBinder as UnionSubclassBinder, 
-            binders.singleTableSubclassBinder as SingleTableSubclassBinder)
+            binders.subClassBinder as SubClassBinder)
     }
     void setupSpec() {
         manager.addAllDomainClasses([
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
new file mode 100644
index 0000000000..72646b2c22
--- /dev/null
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy
@@ -0,0 +1,99 @@
+package org.grails.orm.hibernate.cfg.domainbinding.binder
+
+import grails.gorm.annotation.Entity
+import grails.gorm.specs.HibernateGormDatastoreSpec
+import org.grails.orm.hibernate.cfg.Mapping
+import org.grails.orm.hibernate.cfg.MappingCacheHolder
+import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity
+import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
+import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
+import org.hibernate.boot.spi.MetadataBuildingContext
+import org.hibernate.mapping.PersistentClass
+import org.hibernate.mapping.RootClass
+import org.hibernate.mapping.Subclass
+import spock.lang.Shared
+
+class SubClassBinderSpec extends HibernateGormDatastoreSpec {
+
+    SubClassBinder binder
+    SubclassMappingBinder subclassMappingBinder
+    MultiTenantFilterBinder multiTenantFilterBinder
+    DefaultColumnNameFetcher defaultColumnNameFetcher
+    MappingCacheHolder mappingCacheHolder
+    MetadataBuildingContext metadataBuildingContext
+
+    void setup() {
+        def gdb = getGrailsDomainBinder()
+        
+        metadataBuildingContext = gdb.getMetadataBuildingContext()
+        mappingCacheHolder = gdb.getMappingCacheHolder()
+        subclassMappingBinder = Mock(SubclassMappingBinder)
+        multiTenantFilterBinder = Mock(MultiTenantFilterBinder)
+        defaultColumnNameFetcher = Mock(DefaultColumnNameFetcher)
+        
+        binder = new SubClassBinder(
+                mappingCacheHolder,
+                subclassMappingBinder,
+                multiTenantFilterBinder,
+                defaultColumnNameFetcher,
+                "default"
+        )
+    }
+
+    def "test bindSubClass with no children"() {
+        given:
+        def subEntity = Mock(GrailsHibernatePersistentEntity)
+        subEntity.getName() >> "Child"
+        subEntity.getChildEntities("default") >> []
+        def rootClass = new RootClass(metadataBuildingContext)
+        rootClass.setEntityName("Parent")
+        rootClass.setJpaEntityName("Parent")
+        def mappings = getCollector()
+        def mapping = new Mapping()
+        def subClass = new 
org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext)
+        subClass.setEntityName("Child")
+        subClass.setJpaEntityName("Child")
+
+        when:
+        binder.bindSubClass(subEntity, rootClass, mappings, mapping)
+
+        then:
+        1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass, 
mappings, mapping) >> subClass
+        1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(subEntity, 
subClass, mappings, defaultColumnNameFetcher)
+        rootClass.getSubclasses().contains(subClass)
+        mappings.getEntityBinding(subClass.getEntityName()) == subClass
+    }
+
+    def "test bindSubClass with children"() {
+        given:
+        def subEntity = Mock(GrailsHibernatePersistentEntity)
+        def grandChildEntity = Mock(GrailsHibernatePersistentEntity)
+        subEntity.getName() >> "Child"
+        grandChildEntity.getName() >> "GrandChild"
+        subEntity.getChildEntities("default") >> [grandChildEntity]
+        grandChildEntity.getChildEntities("default") >> []
+
+        def rootClass = new RootClass(metadataBuildingContext)
+        rootClass.setEntityName("Parent")
+        rootClass.setJpaEntityName("Parent")
+        def mappings = getCollector()
+        def mapping = new Mapping()
+        
+        def subClass = new 
org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext)
+        subClass.setEntityName("Child")
+        subClass.setJpaEntityName("Child")
+        def grandChildSubClass = new 
org.hibernate.mapping.SingleTableSubclass(subClass, metadataBuildingContext)
+        grandChildSubClass.setEntityName("GrandChild")
+        grandChildSubClass.setJpaEntityName("GrandChild")
+
+        when:
+        binder.bindSubClass(subEntity, rootClass, mappings, mapping)
+
+        then:
+        1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass, 
mappings, mapping) >> subClass
+        1 * subclassMappingBinder.createSubclassMapping(grandChildEntity, 
subClass, mappings, mapping) >> grandChildSubClass
+        2 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(_, _, 
mappings, defaultColumnNameFetcher)
+        rootClass.getSubclasses().contains(subClass)
+        subClass.getSubclasses().contains(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 7aea0465ee..e109677df0 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
@@ -34,6 +34,8 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndP
 import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
 import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
 import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -116,6 +118,9 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         UnionSubclassBinder unionSubclassBinder = new 
UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder)
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
+        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+
         return [
             propertyBinder: propertyBinder,
             collectionBinder: collectionBinder,
@@ -128,7 +133,8 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             multiTenantFilterBinder: multiTenantFilterBinder,
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
-            singleTableSubclassBinder: singleTableSubclassBinder
+            singleTableSubclassBinder: singleTableSubclassBinder,
+            subClassBinder: subClassBinder
         ]
     }
 
@@ -141,9 +147,7 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.classBinder as ClassBinder, 
             binders.classPropertiesBinder as ClassPropertiesBinder, 
             binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.joinedSubClassBinder as JoinedSubClassBinder, 
-            binders.unionSubclassBinder as UnionSubclassBinder, 
-            binders.singleTableSubclassBinder as SingleTableSubclassBinder)
+            binders.subClassBinder as SubClassBinder)
     }
 
     void setupSpec() {
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 3a0ec3fde4..05035d071d 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
@@ -34,6 +34,8 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndP
 import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
 import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
 import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder
+import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -116,6 +118,9 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         UnionSubclassBinder unionSubclassBinder = new 
UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder)
         SingleTableSubclassBinder singleTableSubclassBinder = new 
SingleTableSubclassBinder(classBinder)
 
+        SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
+        SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+
         return [
             propertyBinder: propertyBinder,
             collectionBinder: collectionBinder,
@@ -128,7 +133,8 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             multiTenantFilterBinder: multiTenantFilterBinder,
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
-            singleTableSubclassBinder: singleTableSubclassBinder
+            singleTableSubclassBinder: singleTableSubclassBinder,
+            subClassBinder: subClassBinder
         ]
     }
 
@@ -141,9 +147,7 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.classBinder as ClassBinder, 
             binders.classPropertiesBinder as ClassPropertiesBinder, 
             binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.joinedSubClassBinder as JoinedSubClassBinder, 
-            binders.unionSubclassBinder as UnionSubclassBinder, 
-            binders.singleTableSubclassBinder as SingleTableSubclassBinder)
+            binders.subClassBinder as SubClassBinder)
     }
 
     void setupSpec() {

Reply via email to