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 67f4d5b98b7a0770a7d0daed04c286ebf50dd833
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Thu Feb 19 13:10:02 2026 -0600

    Refactor GrailsDomainBinder.bindRoot into RootBinder and add spec
---
 .../domainbinding/binder/GrailsDomainBinder.java   |  36 +------
 .../cfg/domainbinding/binder/RootBinder.java       |  80 +++++++++++++++
 .../cfg/domainbinding/CollectionBinderSpec.groovy  |  19 ++--
 .../domainbinding/GrailsPropertyBinderSpec.groovy  |  19 ++--
 .../cfg/domainbinding/binder/RootBinderSpec.groovy | 114 +++++++++++++++++++++
 .../secondpass/ListSecondPassBinderSpec.groovy     |  19 ++--
 .../secondpass/MapSecondPassBinderSpec.groovy      |  19 ++--
 7 files changed, 238 insertions(+), 68 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 6c71c38f8b..e028eb1301 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
@@ -211,12 +211,15 @@ public class GrailsDomainBinder
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder);
         SubClassBinder subClassBinder = new SubClassBinder(mappingCacheHolder, 
subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, 
dataSourceName);
+        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, 
getNamingStrategy(), identityBinder, versionBinder, classBinder, 
classPropertiesBinder);
+        DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
SimpleValueColumnBinder(), new ColumnConfigToColumnBinder());
+        RootBinder rootBinder = new RootBinder(metadataBuildingContext, 
dataSourceName, getNamingStrategy(), multiTenantFilterBinder, subClassBinder, 
defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder);
 
         hibernateMappingContext
                 .getHibernatePersistentEntities(dataSourceName)
                 .stream()
                 .filter(persistentEntity -> 
persistentEntity.forGrailsDomainMapping(dataSourceName))
-                .forEach(hibernatePersistentEntity -> 
bindRoot(hibernatePersistentEntity, metadataCollector, 
defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, 
classPropertiesBinder, multiTenantFilterBinder, subClassBinder));
+                .forEach(hibernatePersistentEntity -> 
rootBinder.bindRoot(hibernatePersistentEntity, metadataCollector));
     }
 
 
@@ -239,37 +242,6 @@ public class GrailsDomainBinder
 
 
 
-    /**
-     * Binds a root class (one with no super classes) to the runtime meta model
-     * based on the supplied Grails domain class
-     *
-     * @param entity The Grails domain class
-     * @param mappings    The Hibernate Mappings object
-     */
-    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;
-        }
-        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, 
getNamingStrategy(), identityBinder, versionBinder, classBinder, 
classPropertiesBinder);
-        var children = entity.getChildEntities(dataSourceName);
-        RootClass root = 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity,
 children, mappings);
-        Mapping m = entity.getMappedForm();
-        final Mapping finalMapping = m;
-        if (!children.isEmpty() && entity.isTablePerHierarchy()) {
-            DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
SimpleValueColumnBinder(), new ColumnConfigToColumnBinder());
-            discriminatorPropertyBinder.bindDiscriminatorProperty(root, m);
-        }
-        // bind the sub classes
-        children.forEach(sub -> subClassBinder.bindSubClass(sub, root, 
mappings, finalMapping));
-
-        multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, 
mappings, defaultColumnNameFetcher);
-
-        mappings.addEntityBinding(root);
-    }
-
-
-
     public PersistentEntityNamingStrategy getNamingStrategy() {
         if (namingStrategy == null) {
             namingStrategy = new 
NamingStrategyWrapper(NAMING_STRATEGY_PROVIDER.getPhysicalNamingStrategy(sessionFactoryName),
 getJdbcEnvironment());
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
new file mode 100644
index 0000000000..17b11a4522
--- /dev/null
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java
@@ -0,0 +1,80 @@
+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.PersistentEntityNamingStrategy;
+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.boot.spi.MetadataBuildingContext;
+import org.hibernate.mapping.RootClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+
+/**
+ * Binder for root classes.
+ */
+public class RootBinder {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(RootBinder.class);
+
+    private final MetadataBuildingContext metadataBuildingContext;
+    private final String dataSourceName;
+    private final PersistentEntityNamingStrategy namingStrategy;
+    private final MultiTenantFilterBinder multiTenantFilterBinder;
+    private final SubClassBinder subClassBinder;
+    private final DefaultColumnNameFetcher defaultColumnNameFetcher;
+    private final RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder;
+    private final DiscriminatorPropertyBinder discriminatorPropertyBinder;
+
+    public RootBinder(
+            MetadataBuildingContext metadataBuildingContext,
+            String dataSourceName,
+            PersistentEntityNamingStrategy namingStrategy,
+            MultiTenantFilterBinder multiTenantFilterBinder,
+            SubClassBinder subClassBinder,
+            DefaultColumnNameFetcher defaultColumnNameFetcher,
+            RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder,
+            DiscriminatorPropertyBinder discriminatorPropertyBinder) {
+        this.metadataBuildingContext = metadataBuildingContext;
+        this.dataSourceName = dataSourceName;
+        this.namingStrategy = namingStrategy;
+        this.multiTenantFilterBinder = multiTenantFilterBinder;
+        this.subClassBinder = subClassBinder;
+        this.defaultColumnNameFetcher = defaultColumnNameFetcher;
+        this.rootPersistentClassCommonValuesBinder = 
rootPersistentClassCommonValuesBinder;
+        this.discriminatorPropertyBinder = discriminatorPropertyBinder;
+    }
+
+    /**
+     * Binds a root class (one with no super classes) to the runtime meta model
+     * based on the supplied Grails domain class
+     *
+     * @param entity The Grails domain class
+     * @param mappings    The Hibernate Mappings object
+     */
+    public void bindRoot(@Nonnull GrailsHibernatePersistentEntity entity, 
@Nonnull InFlightMetadataCollector mappings) {
+        if (mappings.getEntityBinding(entity.getName()) != null) {
+            LOG.info("[RootBinder] Class [" + entity.getName() + "] is already 
mapped, skipping.. ");
+            return;
+        }
+
+        Collection<GrailsHibernatePersistentEntity> children = 
entity.getChildEntities(dataSourceName);
+        RootClass root = 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity,
 children, mappings);
+        Mapping m = entity.getMappedForm();
+        
+        if (!children.isEmpty() && entity.isTablePerHierarchy()) {
+            discriminatorPropertyBinder.bindDiscriminatorProperty(root, m);
+        }
+        
+        // bind the sub classes
+        children.forEach(sub -> subClassBinder.bindSubClass(sub, root, 
mappings, m));
+
+        multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, 
mappings, defaultColumnNameFetcher);
+
+        mappings.addEntityBinding(root);
+    }
+}
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 5eb1164955..50797e3374 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
@@ -20,6 +20,10 @@ 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.RootBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder
@@ -121,6 +125,9 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
         SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder)
+        DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder())
+        RootBinder rootBinder = new RootBinder(metadataBuildingContext, 
"default", namingStrategy, multiTenantFilterBinder, subClassBinder, 
defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder)
 
         return [
             propertyBinder: propertyBinder,
@@ -135,20 +142,14 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
             singleTableSubclassBinder: singleTableSubclassBinder,
-            subClassBinder: subClassBinder
+            subClassBinder: subClassBinder,
+            rootBinder: rootBinder
         ]
     }
 
     protected void bindRoot(GrailsDomainBinder binder, 
GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, 
String sessionFactoryBeanName) {
         def binders = getBinders(binder)
-        binder.bindRoot(entity, mappings, 
-            binders.defaultColumnNameFetcher, 
-            binders.identityBinder as IdentityBinder, 
-            binders.versionBinder as VersionBinder, 
-            binders.classBinder as ClassBinder, 
-            binders.classPropertiesBinder as ClassPropertiesBinder, 
-            binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.subClassBinder as SubClassBinder)
+        binders.rootBinder.bindRoot(entity, mappings)
     }
 
     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 9651232933..795cf6356e 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
@@ -30,6 +30,10 @@ 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.binder.RootBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder
 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
@@ -181,6 +185,9 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
         SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder)
+        DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder())
+        RootBinder rootBinder = new RootBinder(metadataBuildingContext, 
"default", namingStrategy, multiTenantFilterBinder, subClassBinder, 
defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder)
 
         return [
             propertyBinder: propertyBinder,
@@ -196,20 +203,14 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
             singleTableSubclassBinder: singleTableSubclassBinder,
-            subClassBinder: subClassBinder
+            subClassBinder: subClassBinder,
+            rootBinder: rootBinder
         ]
     }
 
     protected void bindRoot(GrailsDomainBinder binder, 
GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, 
String sessionFactoryBeanName) {
         def binders = getBinders(binder)
-        binder.bindRoot(entity, mappings, 
-            binders.defaultColumnNameFetcher, 
-            binders.identityBinder as IdentityBinder, 
-            binders.versionBinder as VersionBinder, 
-            binders.classBinder as ClassBinder, 
-            binders.classPropertiesBinder as ClassPropertiesBinder, 
-            binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.subClassBinder as SubClassBinder)
+        binders.rootBinder.bindRoot(entity, mappings)
     }
     void setupSpec() {
         manager.addAllDomainClasses([
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
new file mode 100644
index 0000000000..3e68798d1f
--- /dev/null
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy
@@ -0,0 +1,114 @@
+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.PersistentEntityNamingStrategy
+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.RootClass
+import spock.lang.Shared
+
+class RootBinderSpec extends HibernateGormDatastoreSpec {
+
+    RootBinder binder
+    MultiTenantFilterBinder multiTenantFilterBinder
+    SubClassBinder subClassBinder
+    DefaultColumnNameFetcher defaultColumnNameFetcher
+    RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder
+    DiscriminatorPropertyBinder discriminatorPropertyBinder
+    MetadataBuildingContext metadataBuildingContext
+    PersistentEntityNamingStrategy namingStrategy
+
+    void setup() {
+        def gdb = getGrailsDomainBinder()
+        metadataBuildingContext = gdb.getMetadataBuildingContext()
+        namingStrategy = gdb.getNamingStrategy()
+        
+        multiTenantFilterBinder = Mock(MultiTenantFilterBinder)
+        subClassBinder = Mock(SubClassBinder)
+        defaultColumnNameFetcher = Mock(DefaultColumnNameFetcher)
+        rootPersistentClassCommonValuesBinder = 
Mock(RootPersistentClassCommonValuesBinder)
+        discriminatorPropertyBinder = Mock(DiscriminatorPropertyBinder)
+        
+        binder = new RootBinder(
+                metadataBuildingContext,
+                "default",
+                namingStrategy,
+                multiTenantFilterBinder,
+                subClassBinder,
+                defaultColumnNameFetcher,
+                rootPersistentClassCommonValuesBinder,
+                discriminatorPropertyBinder
+        )
+    }
+
+    def "test bindRoot with no children"() {
+        given:
+        def entity = Mock(GrailsHibernatePersistentEntity)
+        entity.getName() >> "Parent"
+        entity.getChildEntities("default") >> []
+        entity.getMappedForm() >> new Mapping()
+        
+        def mappings = getCollector()
+        def rootClass = new RootClass(metadataBuildingContext)
+        rootClass.setEntityName("Parent")
+        rootClass.setJpaEntityName("Parent")
+
+        when:
+        binder.bindRoot(entity, mappings)
+
+        then:
+        1 * 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity,
 [], mappings) >> rootClass
+        0 * discriminatorPropertyBinder.bindDiscriminatorProperty(_, _)
+        0 * subClassBinder.bindSubClass(_, _, _, _)
+        1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, 
rootClass, mappings, defaultColumnNameFetcher)
+        mappings.getEntityBinding("Parent") == rootClass
+    }
+
+    def "test bindRoot with children and table-per-hierarchy"() {
+        given:
+        def entity = Mock(GrailsHibernatePersistentEntity)
+        def childEntity = Mock(GrailsHibernatePersistentEntity)
+        entity.getName() >> "Parent"
+        entity.getChildEntities("default") >> [childEntity]
+        def mapping = new Mapping()
+        mapping.setTablePerHierarchy(true)
+        entity.getMappedForm() >> mapping
+        entity.isTablePerHierarchy() >> true
+        
+        def mappings = getCollector()
+        def rootClass = new RootClass(metadataBuildingContext)
+        rootClass.setEntityName("Parent")
+        rootClass.setJpaEntityName("Parent")
+
+        when:
+        binder.bindRoot(entity, mappings)
+
+        then:
+        1 * 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity,
 [childEntity], mappings) >> rootClass
+        1 * discriminatorPropertyBinder.bindDiscriminatorProperty(rootClass, 
mapping)
+        1 * subClassBinder.bindSubClass(childEntity, rootClass, mappings, 
mapping)
+        1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, 
rootClass, mappings, defaultColumnNameFetcher)
+        mappings.getEntityBinding("Parent") == rootClass
+    }
+
+    def "test bindRoot already mapped"() {
+        given:
+        def entity = Mock(GrailsHibernatePersistentEntity)
+        entity.getName() >> "Parent"
+        def mappings = getCollector()
+        def rootClass = new RootClass(metadataBuildingContext)
+        rootClass.setEntityName("Parent")
+        rootClass.setJpaEntityName("Parent")
+        mappings.addEntityBinding(rootClass)
+
+        when:
+        binder.bindRoot(entity, mappings)
+
+        then:
+        0 * 
rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(_, _, 
_)
+    }
+}
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 e109677df0..884ceeb9ca 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
@@ -36,6 +36,10 @@ 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.RootBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -120,6 +124,9 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
         SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder)
+        DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder())
+        RootBinder rootBinder = new RootBinder(metadataBuildingContext, 
"default", namingStrategy, multiTenantFilterBinder, subClassBinder, 
defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder)
 
         return [
             propertyBinder: propertyBinder,
@@ -134,20 +141,14 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
             singleTableSubclassBinder: singleTableSubclassBinder,
-            subClassBinder: subClassBinder
+            subClassBinder: subClassBinder,
+            rootBinder: rootBinder
         ]
     }
 
     protected void bindRoot(GrailsDomainBinder binder, 
GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, 
String sessionFactoryBeanName) {
         def binders = getBinders(binder)
-        binder.bindRoot(entity, mappings, 
-            binders.defaultColumnNameFetcher, 
-            binders.identityBinder as IdentityBinder, 
-            binders.versionBinder as VersionBinder, 
-            binders.classBinder as ClassBinder, 
-            binders.classPropertiesBinder as ClassPropertiesBinder, 
-            binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.subClassBinder as SubClassBinder)
+        binders.rootBinder.bindRoot(entity, mappings)
     }
 
     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 05035d071d..61915a4e3e 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
@@ -36,6 +36,10 @@ 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.RootBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder
+import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -120,6 +124,9 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
 
         SubclassMappingBinder subclassMappingBinder = new 
SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, 
unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder)
         SubClassBinder subClassBinder = new 
SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, 
multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource")
+        RootPersistentClassCommonValuesBinder 
rootPersistentClassCommonValuesBinder = new 
RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, 
identityBinder, versionBinder, classBinder, classPropertiesBinder)
+        DiscriminatorPropertyBinder discriminatorPropertyBinder = new 
DiscriminatorPropertyBinder(metadataBuildingContext, new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), 
new ColumnConfigToColumnBinder())
+        RootBinder rootBinder = new RootBinder(metadataBuildingContext, 
"default", namingStrategy, multiTenantFilterBinder, subClassBinder, 
defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, 
discriminatorPropertyBinder)
 
         return [
             propertyBinder: propertyBinder,
@@ -134,20 +141,14 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             joinedSubClassBinder: joinedSubClassBinder,
             unionSubclassBinder: unionSubclassBinder,
             singleTableSubclassBinder: singleTableSubclassBinder,
-            subClassBinder: subClassBinder
+            subClassBinder: subClassBinder,
+            rootBinder: rootBinder
         ]
     }
 
     protected void bindRoot(GrailsDomainBinder binder, 
GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, 
String sessionFactoryBeanName) {
         def binders = getBinders(binder)
-        binder.bindRoot(entity, mappings, 
-            binders.defaultColumnNameFetcher, 
-            binders.identityBinder as IdentityBinder, 
-            binders.versionBinder as VersionBinder, 
-            binders.classBinder as ClassBinder, 
-            binders.classPropertiesBinder as ClassPropertiesBinder, 
-            binders.multiTenantFilterBinder as MultiTenantFilterBinder, 
-            binders.subClassBinder as SubClassBinder)
+        binders.rootBinder.bindRoot(entity, mappings)
     }
 
     void setupSpec() {

Reply via email to