You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/02/17 18:42:08 UTC

(grails-core) 09/26: Refactor OneToOneBinder to internally manage OneToOne instantiation

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 ef37f2a428a9cd16faf411e060ba68e084aba4c4
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Mon Feb 16 01:18:52 2026 -0600

    Refactor OneToOneBinder to internally manage OneToOne instantiation
    
    - Add MetadataBuildingContext dependency to OneToOneBinder.
    - Refactor bindOneToOne to create and return OneToOne instances.
    - Update ComponentBinder and GrailsPropertyBinder to use the updated signature.
    - Synchronize all relevant test specifications (OneToOneBinderSpec, ComponentBinderSpec, GrailsPropertyBinderSpec, etc.) with the new binder constructors and method signatures.
---
 .../grails/orm/hibernate/cfg/GrailsDomainBinder.java   |  2 +-
 .../cfg/domainbinding/binder/ComponentBinder.java      |  3 +--
 .../cfg/domainbinding/binder/GrailsPropertyBinder.java |  3 +--
 .../cfg/domainbinding/binder/OneToOneBinder.java       | 18 +++++++++++++-----
 .../cfg/domainbinding/CollectionBinderSpec.groovy      |  2 +-
 .../CollectionSecondPassBinderSpec.groovy              |  2 +-
 .../cfg/domainbinding/ComponentBinderSpec.groovy       |  3 ++-
 .../cfg/domainbinding/GrailsPropertyBinderSpec.groovy  |  2 +-
 .../cfg/domainbinding/ListSecondPassBinderSpec.groovy  |  2 +-
 .../cfg/domainbinding/MapSecondPassBinderSpec.groovy   |  2 +-
 .../cfg/domainbinding/OneToOneBinderSpec.groovy        | 12 +++++-------
 11 files changed, 28 insertions(+), 23 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 e733e1c43a..d4b6f2446f 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
@@ -170,7 +170,7 @@ public class GrailsDomainBinder
                 backticksRemover,
                 simpleValueBinder
         );
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder);
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder);
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher);
 
         CollectionBinder collectionBinder = new CollectionBinder(
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 db977a1ffd..936c645744 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
@@ -125,8 +125,7 @@ public class ComponentBinder {
                 LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as OneToOne");
 
             if (association.canBindOneToOneWithSingleColumnAndForeignKey()) {
-                value = new OneToOne(metadataBuildingContext, table, persistentClass);
-                oneToOneBinder.bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, (OneToOne) value, path);
+                value = oneToOneBinder.bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, persistentClass, table, path);
             }
             else {
                 value = manyToOneBinder.bindManyToOne((Association) currentGrailsProp, table, path);
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
index f14ce2656c..6150f1074b 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java
@@ -110,8 +110,7 @@ public class GrailsPropertyBinder {
             enumTypeBinder.bindEnumType(currentGrailsProp, currentGrailsProp.getType(), simpleValue, columnName);
         }
         else if (currentGrailsProp.isHibernateOneToOne()) {
-            value = new OneToOne(metadataBuildingContext, table, persistentClass);
-            oneToOneBinder.bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne)currentGrailsProp, (OneToOne)value, EMPTY_PATH);
+            value = oneToOneBinder.bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne)currentGrailsProp, persistentClass, table, EMPTY_PATH);
         } else if(currentGrailsProp.isHibernateManyToOne()) {
             value = manyToOneBinder.bindManyToOne((Association)currentGrailsProp, table, EMPTY_PATH);
         }
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java
index bc1109d7e6..95ec4b8ec0 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java
@@ -1,8 +1,10 @@
 package org.grails.orm.hibernate.cfg.domainbinding.binder;
 
 import org.hibernate.FetchMode;
+import org.hibernate.boot.spi.MetadataBuildingContext;
 import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
 import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.PersistentClass;
 import org.hibernate.type.ForeignKeyDirection;
 
 import org.grails.datastore.mapping.model.types.Association;
@@ -12,20 +14,25 @@ import org.grails.orm.hibernate.cfg.PropertyConfig;
 
 public class OneToOneBinder {
 
+    private final MetadataBuildingContext metadataBuildingContext;
     private final PersistentEntityNamingStrategy namingStrategy;
     private final SimpleValueBinder simpleValueBinder;
 
-    public OneToOneBinder(PersistentEntityNamingStrategy namingStrategy, SimpleValueBinder simpleValueBinder) {
+    public OneToOneBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, SimpleValueBinder simpleValueBinder) {
+        this.metadataBuildingContext = metadataBuildingContext;
         this.namingStrategy = namingStrategy;
         this.simpleValueBinder = simpleValueBinder;
     }
 
-    public OneToOneBinder(PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) {
-        this(namingStrategy, new SimpleValueBinder(namingStrategy, jdbcEnvironment));
+    public OneToOneBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) {
+        this(metadataBuildingContext, namingStrategy, new SimpleValueBinder(namingStrategy, jdbcEnvironment));
     }
 
-    public void bindOneToOne(final org.grails.datastore.mapping.model.types.OneToOne property, OneToOne oneToOne,
-                              String path) {
+    public OneToOne bindOneToOne(final org.grails.datastore.mapping.model.types.OneToOne property
+            , PersistentClass owner
+            , org.hibernate.mapping.Table table
+            , String path) {
+        OneToOne oneToOne = new OneToOne(metadataBuildingContext, table, owner);
         PropertyConfig config = ((GrailsHibernatePersistentProperty) property).getMappedForm();
         final Association otherSide = property.getInverseSide();
 
@@ -53,5 +60,6 @@ public class OneToOneBinder {
         else {
             oneToOne.setReferencedPropertyName(otherSide.getName());
         }
+        return oneToOne;
     }
 }
\ No newline at end of file
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 d687080e50..5420cf8df1 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
@@ -65,7 +65,7 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec {
                 backticksRemover,
                 simpleValueBinder
         )
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder)
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder)
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher)
 
         CollectionBinder collectionBinder = new CollectionBinder(
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 464e2abb0a..3106e7eba0 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
@@ -64,7 +64,7 @@ class CollectionSecondPassBinderSpec extends HibernateGormDatastoreSpec {
                 backticksRemover,
                 simpleValueBinder
         )
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder)
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder)
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher)
 
         CollectionBinder collectionBinder = new CollectionBinder(
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 6b3e427944..2fb24c3bb7 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
@@ -219,12 +219,13 @@ class ComponentBinderSpec extends HibernateGormDatastoreSpec {
         ((Association)currentGrailsProp).canBindOneToOneWithSingleColumnAndForeignKey() >> true
         setupProperty(currentGrailsProp, "detail", mapping, ownerEntity)
         setupProperty(componentProperty, "address", mapping, ownerEntity)
+        def hibernateOneToOne = new HibernateOneToOne(metadataBuildingContext, table, root)
         
         when:
         binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings)
 
         then:
-        1 * oneToOneBinder.bindOneToOne(currentGrailsProp, _ as HibernateOneToOne, "address")
+        1 * oneToOneBinder.bindOneToOne(currentGrailsProp, root, table, "address") >> hibernateOneToOne
         0 * componentUpdater.updateComponent(_, _, _, _)
     }
 
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 55f3312fde..11a16fab9f 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
@@ -69,7 +69,7 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec {
                 backticksRemover,
                 simpleValueBinder
         )
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder)
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder)
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher)
 
         CollectionBinder collectionBinder = new CollectionBinder(
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 621fcaff53..3a74ef261a 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
@@ -64,7 +64,7 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec {
                 backticksRemover,
                 simpleValueBinder
         )
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder)
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder)
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher)
 
         CollectionBinder collectionBinder = new CollectionBinder(
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 e1c26709f6..d703278360 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
@@ -64,7 +64,7 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec {
                 backticksRemover,
                 simpleValueBinder
         )
-        OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder)
+        OneToOneBinder oneToOneBinder = new OneToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder)
         ManyToOneBinder manyToOneBinder = new ManyToOneBinder(metadataBuildingContext, namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher)
 
         CollectionBinder collectionBinder = new CollectionBinder(
diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/OneToOneBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/OneToOneBinderSpec.groovy
index 036a05ef59..1ec1f899f5 100644
--- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/OneToOneBinderSpec.groovy
+++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/OneToOneBinderSpec.groovy
@@ -22,14 +22,13 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
     SimpleValueBinder mockSimpleValueBinder = Mock(SimpleValueBinder)
 
     def setup() {
-        binder = new OneToOneBinder(getGrailsDomainBinder().getNamingStrategy(), mockSimpleValueBinder)
+        binder = new OneToOneBinder(getGrailsDomainBinder().getMetadataBuildingContext(), getGrailsDomainBinder().getNamingStrategy(), mockSimpleValueBinder)
     }
 
     def "should bind one-to-one mapping with defaults"() {
         given:
         def metadataBuildingContext = getGrailsDomainBinder().getMetadataBuildingContext()
         def ownerRoot = new RootClass(metadataBuildingContext)
-        def hibernateOneToOne = new HibernateOneToOne(metadataBuildingContext, null, ownerRoot)
         
         def gormOneToOne = Mock(GormOneToOne, additionalInterfaces: [GrailsHibernatePersistentProperty])
         def otherSide = Mock(GormOneToOne)
@@ -49,9 +48,10 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
         ((GrailsHibernatePersistentProperty)gormOneToOne).getMappedForm() >> new PropertyConfig()
 
         when:
-        binder.bindOneToOne(gormOneToOne as GormOneToOne, hibernateOneToOne, "")
+        def hibernateOneToOne = binder.bindOneToOne(gormOneToOne as GormOneToOne, ownerRoot, null, "")
 
         then:
+        hibernateOneToOne instanceof HibernateOneToOne
         !hibernateOneToOne.isConstrained()
         hibernateOneToOne.getForeignKeyType() == ForeignKeyDirection.TO_PARENT
         hibernateOneToOne.isAlternateUniqueKey()
@@ -65,7 +65,6 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
         given:
         def metadataBuildingContext = getGrailsDomainBinder().getMetadataBuildingContext()
         def ownerRoot = new RootClass(metadataBuildingContext)
-        def hibernateOneToOne = new HibernateOneToOne(metadataBuildingContext, null, ownerRoot)
         
         def gormOneToOne = Mock(GormOneToOne, additionalInterfaces: [GrailsHibernatePersistentProperty])
         def otherSide = Mock(GormOneToOne)
@@ -85,7 +84,7 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
         ((GrailsHibernatePersistentProperty)gormOneToOne).getMappedForm() >> propertyConfig
 
         when:
-        binder.bindOneToOne(gormOneToOne as GormOneToOne, hibernateOneToOne, "")
+        def hibernateOneToOne = binder.bindOneToOne(gormOneToOne as GormOneToOne, ownerRoot, null, "")
 
         then:
         hibernateOneToOne.isConstrained()
@@ -97,7 +96,6 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
         given:
         def metadataBuildingContext = getGrailsDomainBinder().getMetadataBuildingContext()
         def ownerRoot = new RootClass(metadataBuildingContext)
-        def hibernateOneToOne = new HibernateOneToOne(metadataBuildingContext, null, ownerRoot)
         
         def gormOneToOne = Mock(GormOneToOne, additionalInterfaces: [GrailsHibernatePersistentProperty])
         def otherSide = Mock(GormOneToOne)
@@ -115,7 +113,7 @@ class OneToOneBinderSpec extends HibernateGormDatastoreSpec {
         ((GrailsHibernatePersistentProperty)gormOneToOne).getMappedForm() >> propertyConfig
 
         when:
-        binder.bindOneToOne(gormOneToOne as GormOneToOne, hibernateOneToOne, "")
+        def hibernateOneToOne = binder.bindOneToOne(gormOneToOne as GormOneToOne, ownerRoot, null, "")
 
         then:
         hibernateOneToOne.getFetchMode() == FetchMode.JOIN