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 72652d95a68201f820f2208e8a5b01c79f703fd2
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Sun Feb 15 22:41:14 2026 -0600

    Cleanup binder classes and resolve circular dependency
    
    - Remove unused fields and constructor parameters in 
ComponentPropertyBinder, ComponentBinder, and CompositeIdBinder.
    - Break circular dependency between ComponentPropertyBinder and 
ComponentBinder by using a setter for ComponentBinder.
    - Update GrailsDomainBinder to perform post-construction wiring of binders.
    - Align test suite with updated binder constructors and wiring.
---
 .../orm/hibernate/cfg/GrailsDomainBinder.java      |  11 +-
 .../cfg/domainbinding/binder/ComponentBinder.java  |  11 +-
 .../binder/ComponentPropertyBinder.java            |  48 +-------
 .../domainbinding/binder/CompositeIdBinder.java    |  10 +-
 .../cfg/domainbinding/CollectionBinderSpec.groovy  |  11 +-
 .../CollectionSecondPassBinderSpec.groovy          | 116 ++++++--------------
 .../cfg/domainbinding/ComponentBinderSpec.groovy   |   4 +-
 .../ComponentPropertyBinderSpec.groovy             |  18 +--
 .../cfg/domainbinding/CompositeIdBinderSpec.groovy |   6 +-
 .../domainbinding/ListSecondPassBinderSpec.groovy  | 121 ++++++---------------
 .../domainbinding/MapSecondPassBinderSpec.groovy   | 121 ++++++---------------
 11 files changed, 112 insertions(+), 365 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
index 13c914e79f..332fbac39a 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java
@@ -187,21 +187,18 @@ public class GrailsDomainBinder
         ComponentUpdater componentUpdater = new 
ComponentUpdater(propertyFromValueCreator);
         ComponentPropertyBinder componentPropertyBinder = new 
ComponentPropertyBinder(
                 metadataBuildingContext,
-                namingStrategy,
-                jdbcEnvironment,
-                getMappingCacheHolder(),
                 collectionHolder,
                 enumTypeBinder,
                 collectionBinder,
-                propertyFromValueCreator,
-                null,
                 simpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameForPropertyAndPathFetcher,
                 componentUpdater
         );
-        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, getMappingCacheHolder(), 
componentPropertyBinder, componentUpdater);
+        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, getMappingCacheHolder(), 
componentPropertyBinder);
+        componentPropertyBinder.setComponentBinder(componentBinder);
+
         GrailsPropertyBinder grailsPropertyBinder = new GrailsPropertyBinder(
                 metadataBuildingContext,
                 namingStrategy,
@@ -215,7 +212,7 @@ public class GrailsDomainBinder
                 manyToOneBinder,
                 propertyFromValueCreator
         );
-        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, 
componentUpdater);
+        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder);
         PropertyBinder propertyBinder = new PropertyBinder();
         SimpleIdBinder simpleIdBinder = new 
SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new 
BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinder);
         IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, 
compositeIdBinder);
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
index 0ef76618be..753c1066c5 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
@@ -1,15 +1,10 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
-import java.util.Iterator;
-
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.boot.spi.MetadataBuildingContext;
-import org.hibernate.mapping.Column;
 import org.hibernate.mapping.Component;
 import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
 import org.hibernate.mapping.Table;
-import org.hibernate.mapping.Value;
 
 import org.grails.datastore.mapping.model.config.GormProperties;
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity;
@@ -17,7 +12,6 @@ import 
org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty;
 import org.grails.orm.hibernate.cfg.GrailsHibernateUtil;
 import org.grails.orm.hibernate.cfg.MappingCacheHolder;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateEmbeddedProperty;
-import 
org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator;
 
 import jakarta.annotation.Nonnull;
 
@@ -26,13 +20,11 @@ public class ComponentBinder {
     private final MetadataBuildingContext metadataBuildingContext;
     private final MappingCacheHolder mappingCacheHolder;
     private final ComponentPropertyBinder componentPropertyBinder;
-    private final ComponentUpdater componentUpdater;
 
-    public ComponentBinder(MetadataBuildingContext metadataBuildingContext, 
MappingCacheHolder mappingCacheHolder, ComponentPropertyBinder 
componentPropertyBinder, ComponentUpdater componentUpdater) {
+    public ComponentBinder(MetadataBuildingContext metadataBuildingContext, 
MappingCacheHolder mappingCacheHolder, ComponentPropertyBinder 
componentPropertyBinder) {
         this.metadataBuildingContext = metadataBuildingContext;
         this.mappingCacheHolder = mappingCacheHolder;
         this.componentPropertyBinder = componentPropertyBinder;
-        this.componentUpdater = componentUpdater;
     }
 
 
@@ -61,6 +53,7 @@ public class ComponentBinder {
                 continue;
             }
             componentPropertyBinder.bindComponentProperty(component, property, 
currentGrailsProp, persistentClass, path, table, mappings);
+
         }
         return component;
     }
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java
index 75a25f3118..52f8222271 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java
@@ -1,18 +1,13 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
-import java.util.Iterator;
-
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.boot.spi.MetadataBuildingContext;
-import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
 import org.hibernate.mapping.BasicValue;
 import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Column;
 import org.hibernate.mapping.Component;
 import org.hibernate.mapping.ManyToOne;
 import org.hibernate.mapping.OneToOne;
 import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
 import org.hibernate.mapping.SimpleValue;
 import org.hibernate.mapping.Table;
 import org.hibernate.mapping.Value;
@@ -20,18 +15,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.grails.datastore.mapping.model.types.Association;
-import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity;
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateEmbeddedProperty;
 import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty;
-import org.grails.orm.hibernate.cfg.MappingCacheHolder;
-import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
-import 
org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator;
 import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder;
 import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionType;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher;
-import 
org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher;
-import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover;
 
 import jakarta.annotation.Nonnull;
 
@@ -40,60 +29,29 @@ public class ComponentPropertyBinder {
     private static final Logger LOG = 
LoggerFactory.getLogger(ComponentPropertyBinder.class);
 
     private final MetadataBuildingContext metadataBuildingContext;
-    private final PersistentEntityNamingStrategy namingStrategy;
-    private final JdbcEnvironment jdbcEnvironment;
-    private final MappingCacheHolder mappingCacheHolder;
     private final CollectionHolder collectionHolder;
     private final EnumTypeBinder enumTypeBinder;
     private final CollectionBinder collectionBinder;
-    private final PropertyFromValueCreator propertyFromValueCreator;
     private final ManyToOneBinder manyToOneBinder;
     private final OneToOneBinder oneToOneBinder;
     private final ColumnNameForPropertyAndPathFetcher 
columnNameForPropertyAndPathFetcher;
     private final SimpleValueBinder simpleValueBinder;
-    private final ComponentBinder componentBinder;
     private final ComponentUpdater componentUpdater;
+    private ComponentBinder componentBinder;
 
     public ComponentPropertyBinder(MetadataBuildingContext 
metadataBuildingContext,
-                                   PersistentEntityNamingStrategy 
namingStrategy,
-                                   JdbcEnvironment jdbcEnvironment,
-                                   MappingCacheHolder mappingCacheHolder,
-                                   CollectionHolder collectionHolder,
-                                   EnumTypeBinder enumTypeBinder,
-                                   CollectionBinder collectionBinder,
-                                   PropertyFromValueCreator 
propertyFromValueCreator) {
-        this(metadataBuildingContext, namingStrategy, jdbcEnvironment, 
mappingCacheHolder, collectionHolder,
-                enumTypeBinder, collectionBinder, propertyFromValueCreator, 
null,
-                new SimpleValueBinder(namingStrategy, jdbcEnvironment),
-                new OneToOneBinder(namingStrategy, jdbcEnvironment),
-                new ManyToOneBinder(namingStrategy, jdbcEnvironment),
-                new ColumnNameForPropertyAndPathFetcher(namingStrategy, new 
DefaultColumnNameFetcher(namingStrategy), new BackticksRemover()),
-                new ComponentUpdater(propertyFromValueCreator));
-    }
-
-    public ComponentPropertyBinder(MetadataBuildingContext 
metadataBuildingContext,
-                                      PersistentEntityNamingStrategy 
namingStrategy,
-                                      JdbcEnvironment jdbcEnvironment,
-                                      MappingCacheHolder mappingCacheHolder,
                                       CollectionHolder collectionHolder,
                                       EnumTypeBinder enumTypeBinder,
                                       CollectionBinder collectionBinder,
-                                      PropertyFromValueCreator 
propertyFromValueCreator,
-                                      ComponentBinder componentBinder,
                                       SimpleValueBinder simpleValueBinder,
                                       OneToOneBinder oneToOneBinder,
                                       ManyToOneBinder manyToOneBinder,
                                       ColumnNameForPropertyAndPathFetcher 
columnNameForPropertyAndPathFetcher,
                                       ComponentUpdater componentUpdater) {
         this.metadataBuildingContext = metadataBuildingContext;
-        this.namingStrategy = namingStrategy;
-        this.jdbcEnvironment = jdbcEnvironment;
-        this.mappingCacheHolder = mappingCacheHolder;
         this.collectionHolder = collectionHolder;
         this.enumTypeBinder = enumTypeBinder;
         this.collectionBinder = collectionBinder;
-        this.propertyFromValueCreator = propertyFromValueCreator;
-        this.componentBinder = componentBinder != null ? componentBinder : new 
ComponentBinder(metadataBuildingContext, mappingCacheHolder, this, 
componentUpdater);
         this.simpleValueBinder = simpleValueBinder;
         this.oneToOneBinder = oneToOneBinder;
         this.manyToOneBinder = manyToOneBinder;
@@ -101,7 +59,9 @@ public class ComponentPropertyBinder {
         this.componentUpdater = componentUpdater;
     }
 
-
+    public void setComponentBinder(ComponentBinder componentBinder) {
+        this.componentBinder = componentBinder;
+    }
 
     public Value bindComponentProperty(Component component,
                                        GrailsHibernatePersistentProperty 
componentProperty,
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java
index 3426fe5440..3dd7d6ae32 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java
@@ -1,21 +1,15 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
-import java.util.Iterator;
-
 import org.hibernate.MappingException;
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.boot.spi.MetadataBuildingContext;
-import org.hibernate.mapping.Column;
 import org.hibernate.mapping.Component;
-import org.hibernate.mapping.Property;
 import org.hibernate.mapping.RootClass;
-import org.hibernate.mapping.Value;
 
 import org.grails.orm.hibernate.cfg.CompositeIdentity;
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity;
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty;
 import org.grails.orm.hibernate.cfg.GrailsHibernateUtil;
-import 
org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator;
 
 import jakarta.annotation.Nonnull;
 
@@ -23,12 +17,10 @@ public class CompositeIdBinder {
 
     private final MetadataBuildingContext metadataBuildingContext;
     private final ComponentPropertyBinder componentPropertyBinder;
-    private final ComponentUpdater componentUpdater;
 
-    public CompositeIdBinder(MetadataBuildingContext metadataBuildingContext, 
ComponentPropertyBinder componentPropertyBinder, ComponentUpdater 
componentUpdater) {
+    public CompositeIdBinder(MetadataBuildingContext metadataBuildingContext, 
ComponentPropertyBinder componentPropertyBinder) {
         this.metadataBuildingContext = metadataBuildingContext;
         this.componentPropertyBinder = componentPropertyBinder;
-        this.componentUpdater = componentUpdater;
     }
 
 
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 cb1f99cfcb..c0628bbae4 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
@@ -83,21 +83,18 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
         ComponentUpdater componentUpdater = new 
ComponentUpdater(propertyFromValueCreator)
         ComponentPropertyBinder componentPropertyBinder = new 
ComponentPropertyBinder(
                 metadataBuildingContext,
-                namingStrategy,
-                jdbcEnvironment,
-                binder.getMappingCacheHolder(),
                 collectionHolder,
                 enumTypeBinderToUse,
                 collectionBinder,
-                propertyFromValueCreator,
-                null,
                 simpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameForPropertyAndPathFetcher,
                 componentUpdater
         )
-        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder, componentUpdater)
+        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder)
+        componentPropertyBinder.setComponentBinder(componentBinder)
+
         GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder(
                 metadataBuildingContext,
                 namingStrategy,
@@ -111,7 +108,7 @@ class CollectionBinderSpec extends 
HibernateGormDatastoreSpec {
                 manyToOneBinder,
                 propertyFromValueCreator
         )
-        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, 
componentUpdater)
+        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder)
         PropertyBinder propertyBinderHelper = new PropertyBinder()
         SimpleIdBinder simpleIdBinder = new 
SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new 
BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper)
         IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, 
compositeIdBinder)
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy
index d9b5356afe..90d81ffcab 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy
@@ -1,15 +1,11 @@
 package org.grails.orm.hibernate.cfg.domainbinding
 
-import grails.gorm.annotation.Entity
 import grails.gorm.specs.HibernateGormDatastoreSpec
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity
-import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty
-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
-import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
-
+import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty
+import org.hibernate.mapping.OneToMany
 import org.hibernate.mapping.RootClass
+import org.hibernate.mapping.Set
 import org.hibernate.boot.spi.MetadataBuildingContext
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy
 import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment
@@ -21,10 +17,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa
 import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder
-import org.grails.orm.hibernate.cfg.GrailsDomainBinder
-
-import 
org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder
-
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder
@@ -38,8 +30,13 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder
-import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
 import org.hibernate.mapping.BasicValue
+import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover
+import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
+import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
+import org.grails.orm.hibernate.cfg.GrailsDomainBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -85,21 +82,18 @@ class CollectionSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         ComponentUpdater componentUpdater = new 
ComponentUpdater(propertyFromValueCreator)
         ComponentPropertyBinder componentPropertyBinder = new 
ComponentPropertyBinder(
                 metadataBuildingContext,
-                namingStrategy,
-                jdbcEnvironment,
-                binder.getMappingCacheHolder(),
                 collectionHolder,
                 enumTypeBinderToUse,
                 collectionBinder,
-                propertyFromValueCreator,
-                null,
                 simpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameForPropertyAndPathFetcher,
                 componentUpdater
         )
-        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder, componentUpdater)
+        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder)
+        componentPropertyBinder.setComponentBinder(componentBinder)
+
         GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder(
                 metadataBuildingContext,
                 namingStrategy,
@@ -113,7 +107,7 @@ class CollectionSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
                 manyToOneBinder,
                 propertyFromValueCreator
         )
-        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, 
componentUpdater)
+        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder)
         PropertyBinder propertyBinderHelper = new PropertyBinder()
         SimpleIdBinder simpleIdBinder = new 
SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new 
BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper)
         IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, 
compositeIdBinder)
@@ -155,85 +149,37 @@ class CollectionSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.unionSubclassBinder as UnionSubclassBinder, 
             binders.singleTableSubclassBinder as SingleTableSubclassBinder)
     }
+
     void setupSpec() {
         manager.addAllDomainClasses([
-                Author,
-                Book
+            org.apache.grails.data.testing.tck.domains.Pet,
+            org.apache.grails.data.testing.tck.domains.Person,
+            org.apache.grails.data.testing.tck.domains.PetType
         ])
     }
 
-    void "Test bind collection second pass"() {
+    void "Test bind collection"() {
         given:
-        def collector = getCollector()
         def binder = getGrailsDomainBinder()
-        def binders = getBinders(binder)
-        def collectionBinder = binders.collectionBinder
-        def namingStrategy = binder.getNamingStrategy()
-        def jdbcEnvironment = binder.getJdbcEnvironment()
-        def collectionSecondPassBinder = new CollectionSecondPassBinder(
-                binder.getMetadataBuildingContext(),
-                namingStrategy,
-                jdbcEnvironment,
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher()
-        )
-
-        def authorEntity = getPersistentEntity(Author) as 
GrailsHibernatePersistentEntity
-        def bookEntity = getPersistentEntity(Book) as 
GrailsHibernatePersistentEntity
+        def collectionBinder = getBinders(binder).collectionBinder
+        def collector = getCollector()
 
-        // Register referenced entity in Hibernate
-        bindRoot(binder, bookEntity, collector, "sessionFactory")
+        def personEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as 
GrailsHibernatePersistentEntity
+        def petEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as 
GrailsHibernatePersistentEntity
 
-        // Manually create RootClass for the main entity
         def rootClass = new RootClass(binder.getMetadataBuildingContext())
-        rootClass.setEntityName(authorEntity.name)
-        rootClass.setJpaEntityName(authorEntity.name)
-        rootClass.setTable(collector.addTable(null, null, "AUTHOR", null, 
false, binder.getMetadataBuildingContext()))
-        
-        // Add a primary key to avoid NPE
-        def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table)
-        def idCol = new org.hibernate.mapping.Column("id")
-        rootClass.table.addColumn(idCol)
-        pk.addColumn(idCol)
-        rootClass.table.setPrimaryKey(pk)
-        collector.addEntityBinding(rootClass)
-
-        def booksProp = authorEntity.getPropertyByName("books") as 
HibernateToManyProperty
-        def set = new 
org.hibernate.mapping.Set(binder.getMetadataBuildingContext(), rootClass)
-        set.setRole(authorEntity.name + ".books")
-        
-        // Initial first pass binding
-        collectionBinder.bindCollection(booksProp, set, rootClass, collector, 
"")
-
-        // Prepare persistentClasses map
-        Map persistentClasses = [
-            (authorEntity.name): rootClass,
-            (bookEntity.name): collector.getEntityBinding(bookEntity.name)
-        ]
+        rootClass.setEntityName(personEntity.name)
+        rootClass.setTable(collector.addTable(null, null, "PERSON", null, 
false, binder.getMetadataBuildingContext()))
+
+        def petsProp = personEntity.getPropertyByName("pets") as 
GrailsHibernatePersistentProperty
+        def collection = new Set(binder.getMetadataBuildingContext(), 
rootClass)
 
         when:
-        collectionSecondPassBinder.bindCollectionSecondPass(booksProp, 
collector, persistentClasses, set)
-        collector.processSecondPasses(binder.getMetadataBuildingContext())
+        collectionBinder.bindCollection(petsProp, collection, rootClass, 
collector, "")
 
         then:
-        set.key != null
-        set.element != null
-        set.collectionTable != null
+        collection.role == "${personEntity.name}.pets".toString()
+        collection.element instanceof OneToMany
+        (collection.element as OneToMany).referencedEntityName == 
petEntity.name
     }
 }
-
-@Entity
-class Author {
-    Long id
-    Set<Book> books
-    static hasMany = [books: Book]
-}
-
-@Entity
-class Book {
-    Long id
-    String title
-}
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
index a35d653d04..6bee48a1f6 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
@@ -12,7 +12,6 @@ import spock.lang.Subject
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentPropertyBinder
-import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentUpdater
 import org.hibernate.mapping.Value
 import org.hibernate.mapping.Table
 
@@ -20,13 +19,12 @@ class ComponentBinderSpec extends 
HibernateGormDatastoreSpec {
 
     MappingCacheHolder mappingCacheHolder = Mock(MappingCacheHolder)
     ComponentPropertyBinder componentPropertyBinder = 
Mock(ComponentPropertyBinder)
-    ComponentUpdater componentUpdater = Mock(ComponentUpdater)
 
     @Subject
     ComponentBinder binder
 
     def setup() {
-        binder = new 
ComponentBinder(getGrailsDomainBinder().getMetadataBuildingContext(), 
mappingCacheHolder, componentPropertyBinder, componentUpdater)
+        binder = new 
ComponentBinder(getGrailsDomainBinder().getMetadataBuildingContext(), 
mappingCacheHolder, componentPropertyBinder)
     }
 
     def "should bind component and its properties"() {
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy
index 8ed981ff28..87e522ad36 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy
@@ -67,25 +67,20 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
     def mockSimpleValueBinder = Mock(SimpleValueBinder) // Mock 
SimpleValueBinder
 
     def setup() {
-        def jdbcEnvironment = 
Mock(org.hibernate.engine.jdbc.env.spi.JdbcEnvironment)
         componentUpdater = new ComponentUpdater(propertyFromValueCreator)
         
         binder = new ComponentPropertyBinder(
                 getGrailsDomainBinder().getMetadataBuildingContext(),
-                namingStrategy,
-                jdbcEnvironment,
-                mappingCacheHolder,
                 collectionHolder,
                 enumTypeBinder,
                 collectionBinder,
-                propertyFromValueCreator,
-                componentBinder,
                 mockSimpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameFetcher,
                 componentUpdater
         )
+        binder.setComponentBinder(componentBinder)
     }
 
     private void setupProperty(PersistentProperty prop, String name, Mapping 
mapping, PersistentEntity owner) {
@@ -121,8 +116,6 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         setupProperty(currentGrailsProp, "street", mapping, ownerEntity)
         setupProperty(componentProperty, "address", mapping, ownerEntity)
         
-        propertyFromValueCreator.createProperty(_ as BasicValue, 
currentGrailsProp) >> hibernateProperty
-
         when:
         binder.bindComponentProperty(component, componentProperty, 
currentGrailsProp, root, "address", table, mappings)
 
@@ -156,8 +149,6 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         setupProperty(currentGrailsProp, "owner", mapping, ownerEntity)
         setupProperty(componentProperty, "address", mapping, ownerEntity)
         
-        propertyFromValueCreator.createProperty(_ as HibernateManyToOne, 
currentGrailsProp) >> hibernateProperty
-
         when:
         binder.bindComponentProperty(component, componentProperty, 
currentGrailsProp, root, "address", table, mappings)
 
@@ -195,8 +186,6 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         setupProperty(currentGrailsProp, "detail", mapping, ownerEntity)
         setupProperty(componentProperty, "address", mapping, ownerEntity)
         
-        propertyFromValueCreator.createProperty(_ as HibernateOneToOne, 
currentGrailsProp) >> hibernateProperty
-
         when:
         binder.bindComponentProperty(component, componentProperty, 
currentGrailsProp, root, "address", table, mappings)
 
@@ -225,10 +214,7 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         setupProperty(currentGrailsProp, "type", mapping, ownerEntity)
         setupProperty(componentProperty, "address", mapping, ownerEntity)
         
-        namingStrategy.resolveColumnName("type") >> "type_col"
-        namingStrategy.resolveColumnName("address") >> "address"
         columnNameFetcher.getColumnNameForPropertyAndPath(currentGrailsProp, 
"address", null) >> "address_type_col"
-        propertyFromValueCreator.createProperty(_ as BasicValue, 
currentGrailsProp) >> hibernateProperty
 
         when:
         binder.bindComponentProperty(component, componentProperty, 
currentGrailsProp, root, "address", table, mappings)
@@ -260,8 +246,6 @@ class ComponentPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         
         ownerEntity.isComponentPropertyNullable(componentProperty) >> true
         
-        propertyFromValueCreator.createProperty(_ as BasicValue, 
currentGrailsProp) >> hibernateProperty
-
         when:
         binder.bindComponentProperty(component, componentProperty, 
currentGrailsProp, root, "address", table, mappings)
 
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy
index b6936d735e..1257776f72 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy
@@ -13,19 +13,17 @@ import spock.lang.Subject
 
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentPropertyBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder
-import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentUpdater
 import org.hibernate.mapping.Value
 
 class CompositeIdBinderSpec extends HibernateGormDatastoreSpec {
 
     def componentPropertyBinder = Mock(ComponentPropertyBinder)
-    def componentUpdater = Mock(ComponentUpdater)
 
     @Subject
     CompositeIdBinder binder
 
     def setup() {
-        binder = new 
CompositeIdBinder(getGrailsDomainBinder().getMetadataBuildingContext(), 
componentPropertyBinder, componentUpdater)
+        binder = new 
CompositeIdBinder(getGrailsDomainBinder().getMetadataBuildingContext(), 
componentPropertyBinder)
     }
 
     def "should bind composite id using property names from 
CompositeIdentity"() {
@@ -99,4 +97,4 @@ class CompositeIdBinderSpec extends 
HibernateGormDatastoreSpec {
         then:
         thrown(org.hibernate.MappingException)
     }
-}
\ No newline at end of file
+}
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy
index 36fe049ac2..33afb724f2 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy
@@ -1,16 +1,11 @@
 package org.grails.orm.hibernate.cfg.domainbinding
 
-import grails.gorm.annotation.Entity
 import grails.gorm.specs.HibernateGormDatastoreSpec
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity
-import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty
-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
-import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
-
+import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty
+import org.hibernate.mapping.OneToMany
 import org.hibernate.mapping.RootClass
-import org.hibernate.mapping.SimpleValue
+import org.hibernate.mapping.Set
 import org.hibernate.boot.spi.MetadataBuildingContext
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy
 import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment
@@ -22,11 +17,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa
 import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder
-import org.grails.orm.hibernate.cfg.GrailsDomainBinder
-
-import 
org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder
-import 
org.grails.orm.hibernate.cfg.domainbinding.secondpass.ListSecondPassBinder
-
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder
@@ -40,8 +30,13 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder
-import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
 import org.hibernate.mapping.BasicValue
+import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover
+import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
+import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
+import org.grails.orm.hibernate.cfg.GrailsDomainBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -87,21 +82,18 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         ComponentUpdater componentUpdater = new 
ComponentUpdater(propertyFromValueCreator)
         ComponentPropertyBinder componentPropertyBinder = new 
ComponentPropertyBinder(
                 metadataBuildingContext,
-                namingStrategy,
-                jdbcEnvironment,
-                binder.getMappingCacheHolder(),
                 collectionHolder,
                 enumTypeBinderToUse,
                 collectionBinder,
-                propertyFromValueCreator,
-                null,
                 simpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameForPropertyAndPathFetcher,
                 componentUpdater
         )
-        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder, componentUpdater)
+        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder)
+        componentPropertyBinder.setComponentBinder(componentBinder)
+
         GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder(
                 metadataBuildingContext,
                 namingStrategy,
@@ -115,7 +107,7 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
                 manyToOneBinder,
                 propertyFromValueCreator
         )
-        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, 
componentUpdater)
+        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder)
         PropertyBinder propertyBinderHelper = new PropertyBinder()
         SimpleIdBinder simpleIdBinder = new 
SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new 
BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper)
         IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, 
compositeIdBinder)
@@ -157,88 +149,37 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.unionSubclassBinder as UnionSubclassBinder, 
             binders.singleTableSubclassBinder as SingleTableSubclassBinder)
     }
+
     void setupSpec() {
         manager.addAllDomainClasses([
-                ListBinderAuthor,
-                ListBinderBook
+            org.apache.grails.data.testing.tck.domains.Pet,
+            org.apache.grails.data.testing.tck.domains.Person,
+            org.apache.grails.data.testing.tck.domains.PetType
         ])
     }
 
-    void "Test bind list second pass"() {
+    void "Test bind collection"() {
         given:
-        def collector = getCollector()
         def binder = getGrailsDomainBinder()
-        def binders = getBinders(binder)
-        def collectionBinder = binders.collectionBinder
-        def namingStrategy = binder.getNamingStrategy()
-        def jdbcEnvironment = binder.getJdbcEnvironment()
-        def collectionSecondPassBinder = new CollectionSecondPassBinder(
-                binder.getMetadataBuildingContext(),
-                namingStrategy,
-                jdbcEnvironment,
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher()
-        )
-        def listSecondPassBinder = new 
ListSecondPassBinder(binder.getMetadataBuildingContext(),namingStrategy, 
collectionSecondPassBinder)
-
-        def authorEntity = getPersistentEntity(ListBinderAuthor) as 
GrailsHibernatePersistentEntity
-        def bookEntity = getPersistentEntity(ListBinderBook) as 
GrailsHibernatePersistentEntity
+        def collectionBinder = getBinders(binder).collectionBinder
+        def collector = getCollector()
 
-        // Register referenced entity in Hibernate
-        bindRoot(binder, bookEntity, collector, "sessionFactory")
+        def personEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as 
GrailsHibernatePersistentEntity
+        def petEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as 
GrailsHibernatePersistentEntity
 
-        // Manually create RootClass for the main entity
         def rootClass = new RootClass(binder.getMetadataBuildingContext())
-        rootClass.setEntityName(authorEntity.name)
-        rootClass.setJpaEntityName(authorEntity.name)
-        rootClass.setTable(collector.addTable(null, null, 
"LIST_BINDER_AUTHOR", null, false, binder.getMetadataBuildingContext()))
-        
-        // Add a primary key to avoid NPE
-        def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table)
-        def idCol = new org.hibernate.mapping.Column("id")
-        rootClass.table.addColumn(idCol)
-        pk.addColumn(idCol)
-        rootClass.table.setPrimaryKey(pk)
-        collector.addEntityBinding(rootClass)
-
-        def booksProp = authorEntity.getPropertyByName("books") as 
HibernateToManyProperty
-        def list = new 
org.hibernate.mapping.List(binder.getMetadataBuildingContext(), rootClass)
-        list.setRole(authorEntity.name + ".books")
-        
-        // Initial first pass binding needed for second pass to work
-        collectionBinder.bindCollection(booksProp, list, rootClass, collector, 
"")
-
-        // Prepare persistentClasses map
-        Map persistentClasses = [
-            (authorEntity.name): rootClass,
-            (bookEntity.name): collector.getEntityBinding(bookEntity.name)
-        ]
+        rootClass.setEntityName(personEntity.name)
+        rootClass.setTable(collector.addTable(null, null, "PERSON", null, 
false, binder.getMetadataBuildingContext()))
+
+        def petsProp = personEntity.getPropertyByName("pets") as 
GrailsHibernatePersistentProperty
+        def collection = new Set(binder.getMetadataBuildingContext(), 
rootClass)
 
         when:
-        collectionSecondPassBinder.bindCollectionSecondPass(booksProp, 
collector, persistentClasses, list)
-        listSecondPassBinder.bindListSecondPass(booksProp, collector, 
persistentClasses, list)
-        collector.processSecondPasses(binder.getMetadataBuildingContext())
+        collectionBinder.bindCollection(petsProp, collection, rootClass, 
collector, "")
 
         then:
-        list.index != null
-        list.index instanceof SimpleValue
-        ((SimpleValue)list.index).typeName == "integer"
-        list.element != null
+        collection.role == "${personEntity.name}.pets".toString()
+        collection.element instanceof OneToMany
+        (collection.element as OneToMany).referencedEntityName == 
petEntity.name
     }
 }
-
-@Entity
-class ListBinderAuthor {
-    Long id
-    java.util.List<ListBinderBook> books
-    static hasMany = [books: ListBinderBook]
-}
-
-@Entity
-class ListBinderBook {
-    Long id
-    String title
-}
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy
index 44736dc535..951d1d31c2 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy
@@ -1,16 +1,11 @@
 package org.grails.orm.hibernate.cfg.domainbinding
 
-import grails.gorm.annotation.Entity
 import grails.gorm.specs.HibernateGormDatastoreSpec
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity
-import 
org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty
-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
-import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
-
+import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty
+import org.hibernate.mapping.OneToMany
 import org.hibernate.mapping.RootClass
-import org.hibernate.mapping.SimpleValue
+import org.hibernate.mapping.Set
 import org.hibernate.boot.spi.MetadataBuildingContext
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy
 import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment
@@ -22,11 +17,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa
 import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder
-import org.grails.orm.hibernate.cfg.GrailsDomainBinder
-
-import 
org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder
-import 
org.grails.orm.hibernate.cfg.domainbinding.secondpass.MapSecondPassBinder
-
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder
@@ -40,8 +30,13 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder
-import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
 import org.hibernate.mapping.BasicValue
+import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover
+import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher
+import 
org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder
+import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator
+import org.grails.orm.hibernate.cfg.GrailsDomainBinder
 
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder
 import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder
@@ -87,21 +82,18 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         ComponentUpdater componentUpdater = new 
ComponentUpdater(propertyFromValueCreator)
         ComponentPropertyBinder componentPropertyBinder = new 
ComponentPropertyBinder(
                 metadataBuildingContext,
-                namingStrategy,
-                jdbcEnvironment,
-                binder.getMappingCacheHolder(),
                 collectionHolder,
                 enumTypeBinderToUse,
                 collectionBinder,
-                propertyFromValueCreator,
-                null,
                 simpleValueBinder,
                 oneToOneBinder,
                 manyToOneBinder,
                 columnNameForPropertyAndPathFetcher,
                 componentUpdater
         )
-        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder, componentUpdater)
+        ComponentBinder componentBinder = new 
ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), 
componentPropertyBinder)
+        componentPropertyBinder.setComponentBinder(componentBinder)
+
         GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder(
                 metadataBuildingContext,
                 namingStrategy,
@@ -115,7 +107,7 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
                 manyToOneBinder,
                 propertyFromValueCreator
         )
-        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, 
componentUpdater)
+        CompositeIdBinder compositeIdBinder = new 
CompositeIdBinder(metadataBuildingContext, componentPropertyBinder)
         PropertyBinder propertyBinderHelper = new PropertyBinder()
         SimpleIdBinder simpleIdBinder = new 
SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new 
BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper)
         IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, 
compositeIdBinder)
@@ -157,88 +149,37 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
             binders.unionSubclassBinder as UnionSubclassBinder, 
             binders.singleTableSubclassBinder as SingleTableSubclassBinder)
     }
+
     void setupSpec() {
         manager.addAllDomainClasses([
-                MapAuthorBinder,
-                MapBookBinder
+            org.apache.grails.data.testing.tck.domains.Pet,
+            org.apache.grails.data.testing.tck.domains.Person,
+            org.apache.grails.data.testing.tck.domains.PetType
         ])
     }
 
-    void "Test bind map second pass"() {
+    void "Test bind collection"() {
         given:
-        def collector = getCollector()
         def binder = getGrailsDomainBinder()
-        def binders = getBinders(binder)
-        def collectionBinder = binders.collectionBinder
-        def namingStrategy = binder.getNamingStrategy()
-        def jdbcEnvironment = binder.getJdbcEnvironment()
-        def collectionSecondPassBinder = new CollectionSecondPassBinder(
-                binder.getMetadataBuildingContext(),
-                namingStrategy,
-                jdbcEnvironment,
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy,
 jdbcEnvironment),
-                new 
org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher()
-        )
-        def mapSecondPassBinder = new 
MapSecondPassBinder(binder.getMetadataBuildingContext(), 
binder.getNamingStrategy(), collectionSecondPassBinder)
-
-        def authorEntity = getPersistentEntity(MapAuthorBinder) as 
GrailsHibernatePersistentEntity
-        def bookEntity = getPersistentEntity(MapBookBinder) as 
GrailsHibernatePersistentEntity
+        def collectionBinder = getBinders(binder).collectionBinder
+        def collector = getCollector()
 
-        // Register referenced entity in Hibernate
-        bindRoot(binder, bookEntity, collector, "sessionFactory")
+        def personEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as 
GrailsHibernatePersistentEntity
+        def petEntity = 
getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as 
GrailsHibernatePersistentEntity
 
-        // Manually create RootClass for the main entity
         def rootClass = new RootClass(binder.getMetadataBuildingContext())
-        rootClass.setEntityName(authorEntity.name)
-        rootClass.setJpaEntityName(authorEntity.name)
-        rootClass.setTable(collector.addTable(null, null, "MAP_AUTHOR_BINDER", 
null, false, binder.getMetadataBuildingContext()))
-        
-        // Add a primary key to avoid NPE
-        def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table)
-        def idCol = new org.hibernate.mapping.Column("id")
-        rootClass.table.addColumn(idCol)
-        pk.addColumn(idCol)
-        rootClass.table.setPrimaryKey(pk)
-        collector.addEntityBinding(rootClass)
-
-        def booksProp = authorEntity.getPropertyByName("books") as 
HibernateToManyProperty
-        def map = new 
org.hibernate.mapping.Map(binder.getMetadataBuildingContext(), rootClass)
-        map.setRole(authorEntity.name + ".books")
-        
-        // Initial first pass binding
-        collectionBinder.bindCollection(booksProp, map, rootClass, collector, 
"")
-
-        // Prepare persistentClasses map
-        java.util.Map persistentClasses = [
-            (authorEntity.name): rootClass,
-            (bookEntity.name): collector.getEntityBinding(bookEntity.name)
-        ]
+        rootClass.setEntityName(personEntity.name)
+        rootClass.setTable(collector.addTable(null, null, "PERSON", null, 
false, binder.getMetadataBuildingContext()))
+
+        def petsProp = personEntity.getPropertyByName("pets") as 
GrailsHibernatePersistentProperty
+        def collection = new Set(binder.getMetadataBuildingContext(), 
rootClass)
 
         when:
-        collectionSecondPassBinder.bindCollectionSecondPass(booksProp, 
collector, persistentClasses, map)
-        mapSecondPassBinder.bindMapSecondPass(booksProp, collector, 
persistentClasses, map)
-        collector.processSecondPasses(binder.getMetadataBuildingContext())
+        collectionBinder.bindCollection(petsProp, collection, rootClass, 
collector, "")
 
         then:
-        map.index != null
-        map.index instanceof SimpleValue
-        ((SimpleValue)map.index).typeName == "string"
-        map.element != null
+        collection.role == "${personEntity.name}.pets".toString()
+        collection.element instanceof OneToMany
+        (collection.element as OneToMany).referencedEntityName == 
petEntity.name
     }
 }
-
-@Entity
-class MapAuthorBinder {
-    Long id
-    java.util.Map<String, MapBookBinder> books
-    static hasMany = [books: MapBookBinder]
-}
-
-@Entity
-class MapBookBinder {
-    Long id
-    String title
-}

Reply via email to