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 d33fb6b2740316c2d84f0eca29dfe6c1046a0cba
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Fri Feb 13 23:25:28 2026 -0600

    Refactor BasicValueIdCreator and SimpleIdBinder for improved statelessness 
and testability.
    
    - BasicValueIdCreator: Removed BasicValue from state; it's now passed into 
getBasicValueId.
    - SimpleIdBinder: Updated protected constructor to accept 
MetadataBuildingContext and JdbcEnvironment, avoiding NPEs in tests.
    - Updated binder logic to instantiate BasicValue at the point of use and 
pass it to the creator.
    - Adjusted test specifications to align with new signatures.
---
 .../cfg/domainbinding/binder/SimpleIdBinder.java    | 14 +++++++++-----
 .../cfg/domainbinding/util/BasicValueIdCreator.java | 10 ++--------
 .../domainbinding/BasicValueIdCreatorSpec.groovy    | 12 ++++++------
 .../cfg/domainbinding/SimpleIdBinderSpec.groovy     | 21 +++++++++++++++------
 4 files changed, 32 insertions(+), 25 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java
index 17137b288f..2fc0853ebd 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java
@@ -36,9 +36,13 @@ public class SimpleIdBinder {
         this.basicValueIdCreator = null;
     }
 
-    protected SimpleIdBinder(BasicValueIdCreator basicValueIdCreator, 
SimpleValueBinder simpleValueBinder, PropertyBinder propertyBinder) {
-        this.metadataBuildingContext = null;
-        this.jdbcEnvironment = null;
+    public MetadataBuildingContext getMetadataBuildingContext() {
+        return metadataBuildingContext;
+    }
+
+    protected SimpleIdBinder(MetadataBuildingContext metadataBuildingContext, 
JdbcEnvironment jdbcEnvironment, BasicValueIdCreator basicValueIdCreator, 
SimpleValueBinder simpleValueBinder, PropertyBinder propertyBinder) {
+        this.metadataBuildingContext = metadataBuildingContext;
+        this.jdbcEnvironment = jdbcEnvironment;
         this.simpleValueBinder = simpleValueBinder;
         this.propertyBinder = propertyBinder;
         this.basicValueIdCreator = basicValueIdCreator;
@@ -51,8 +55,8 @@ public class SimpleIdBinder {
         boolean useSequence = result != null && 
result.isTablePerConcreteClass();
         // create the id value
 
-        BasicValueIdCreator idCreator = this.basicValueIdCreator != null ? 
this.basicValueIdCreator : new BasicValueIdCreator(metadataBuildingContext, 
jdbcEnvironment, table);
-        BasicValue id = idCreator.getBasicValueId(mappedId, domainClass, 
useSequence);
+        BasicValueIdCreator idCreator = this.basicValueIdCreator != null ? 
this.basicValueIdCreator : new BasicValueIdCreator(jdbcEnvironment);
+        BasicValue id = idCreator.getBasicValueId(mappedId, domainClass, new 
BasicValue(metadataBuildingContext, table), useSequence);
 
         var identifier = domainClass.getIdentity();
         if (mappedId != null) {
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java
index 75090e6339..d2c2cbd01d 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java
@@ -15,13 +15,9 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceWrappe
 public class BasicValueIdCreator {
 
     private final JdbcEnvironment jdbcEnvironment;
-    @SuppressWarnings("unused") // kept for tests that want to provide a 
prototype BasicValue
-    private final BasicValue id;
     private final GrailsSequenceWrapper grailsSequenceWrapper;
 
-    public BasicValueIdCreator(MetadataBuildingContext 
metadataBuildingContext, JdbcEnvironment jdbcEnvironment, Table table) {
-        // create a prototype BasicValue (table will be set per-entity when 
creating the actual BasicValue)
-        this.id =  new BasicValue(metadataBuildingContext, table);
+    public BasicValueIdCreator(JdbcEnvironment jdbcEnvironment) {
         this.jdbcEnvironment = jdbcEnvironment;
         this.grailsSequenceWrapper = new GrailsSequenceWrapper();
     }
@@ -29,15 +25,13 @@ public class BasicValueIdCreator {
 
 
     protected BasicValueIdCreator(JdbcEnvironment  jdbcEnvironment
-            , BasicValue prototypeBasicValue
     , GrailsSequenceWrapper grailsSequenceWrapper) {
         this.jdbcEnvironment = jdbcEnvironment;
-        this.id = prototypeBasicValue;
         this.grailsSequenceWrapper = grailsSequenceWrapper;
     }
 
 
-    public BasicValue getBasicValueId(Identity mappedId, 
GrailsHibernatePersistentEntity domainClass, boolean useSequence) {
+    public BasicValue getBasicValueId(Identity mappedId, 
GrailsHibernatePersistentEntity domainClass, BasicValue id, boolean 
useSequence) {
         // create a BasicValue for the specific entity table (do not reuse the 
prototype directly because table differs)
         String generatorName = Identity.determineGeneratorName(mappedId, 
useSequence);
         id.setCustomIdGeneratorCreator(context -> createGenerator(mappedId, 
domainClass, context, generatorName));
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreatorSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreatorSpec.groovy
index 0446618c62..0f92b72999 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreatorSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreatorSpec.groovy
@@ -36,7 +36,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         entity.setTable(table)
         // Use a real BasicValue to test that the generator creator lambda is 
correctly set and executable
         basicValue = new BasicValue(metadataBuildingContext, table)
-        creator = new BasicValueIdCreator(jdbcEnvironment, basicValue, 
grailsSequenceWrapper)
+        creator = new BasicValueIdCreator(jdbcEnvironment, 
grailsSequenceWrapper)
     }
 
     @Unroll
@@ -49,7 +49,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         def context = Mock(GeneratorCreationContext)
 
         when:
-        BasicValue id = creator.getBasicValueId(mappedId, domainClass, 
useSequence)
+        BasicValue id = creator.getBasicValueId(mappedId, domainClass, 
basicValue, useSequence)
         def generatorCreator = id.getCustomIdGeneratorCreator()
         Generator generator = generatorCreator.createGenerator(context)
 
@@ -78,7 +78,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         def context = Mock(GeneratorCreationContext)
 
         when:
-        BasicValue id = creator.getBasicValueId(null, domainClass, false)
+        BasicValue id = creator.getBasicValueId(null, domainClass, basicValue, 
false)
         def generatorCreator = id.getCustomIdGeneratorCreator()
         Generator generator = generatorCreator.createGenerator(context)
 
@@ -94,7 +94,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         def context = Mock(GeneratorCreationContext)
 
         when:
-        BasicValue id = creator.getBasicValueId(null, domainClass, true)
+        BasicValue id = creator.getBasicValueId(null, domainClass, basicValue, 
true)
         def generatorCreator = id.getCustomIdGeneratorCreator()
         Generator generator = generatorCreator.createGenerator(context)
 
@@ -112,7 +112,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         def context = Mock(GeneratorCreationContext)
 
         when:
-        BasicValue id = creator.getBasicValueId(mappedId, domainClass, true)
+        BasicValue id = creator.getBasicValueId(mappedId, domainClass, 
basicValue, true)
         def generatorCreator = id.getCustomIdGeneratorCreator()
         Generator generator = generatorCreator.createGenerator(context)
 
@@ -129,7 +129,7 @@ class BasicValueIdCreatorSpec extends 
HibernateGormDatastoreSpec {
         def context = Mock(GeneratorCreationContext)
 
         when:
-        BasicValue id = creator.getBasicValueId(mappedId, domainClass, false)
+        BasicValue id = creator.getBasicValueId(mappedId, domainClass, 
basicValue, false)
         def generatorCreator = id.getCustomIdGeneratorCreator()
         generatorCreator.createGenerator(context)
 
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy
index 5cc6b3115c..9a5b103935 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy
@@ -30,20 +30,28 @@ class SimpleIdBinderSpec extends HibernateGormDatastoreSpec 
{
     def simpleIdBinder
 
     def setup() {
-        metadataBuildingContext = 
getGrailsDomainBinder().getMetadataBuildingContext()
-        jdbcEnvironment = getGrailsDomainBinder().getJdbcEnvironment()
+        def domainBinder = getGrailsDomainBinder()
+        def metadataCollector = 
domainBinder.getMetadataBuildingContext().getMetadataCollector()
+        metadataBuildingContext = new 
org.hibernate.boot.internal.MetadataBuildingContextRootImpl(
+                "default",
+                metadataCollector.getBootstrapContext(),
+                metadataCollector.getMetadataBuildingOptions(),
+                metadataCollector,
+                null
+        )
+        jdbcEnvironment = domainBinder.getJdbcEnvironment()
 
         // Use a Mock for BasicValueIdCreator and return a BasicValue based on 
the currentTable
         basicValueIdCreator = Mock(BasicValueIdCreator)
-        basicValueIdCreator.getBasicValueId(_, _, _) >> { Identity id, 
GrailsHibernatePersistentEntity domainClass, boolean useSeq ->
-            new BasicValue(metadataBuildingContext, currentTable)
+        basicValueIdCreator.getBasicValueId(_, _, _, _) >> { Identity id, 
GrailsHibernatePersistentEntity domainClass, BasicValue val, boolean useSeq ->
+            return val
         }
 
         // Mock the collaborators that can be safely mocked
         simpleValueBinder = Mock(SimpleValueBinder)
         propertyBinder = Spy(PropertyBinder)
 
-        simpleIdBinder = new SimpleIdBinder(basicValueIdCreator, 
simpleValueBinder, propertyBinder)
+        simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, 
jdbcEnvironment, basicValueIdCreator, simpleValueBinder, propertyBinder)
     }
 
     def "bindSimpleId with identity generator"() {
@@ -114,9 +122,10 @@ class SimpleIdBinderSpec extends 
HibernateGormDatastoreSpec {
             getIdentity() >> Mock(GrailsHibernatePersistentProperty)
         }
         def rootClass = new RootClass(metadataBuildingContext)
+        def table = Mock(Table)
 
         when:
-        simpleIdBinder.bindSimpleId(domainClass, rootClass, new Identity(name: 
"nonExistent"), rootClass.getTable())
+        simpleIdBinder.bindSimpleId(domainClass, rootClass, new Identity(name: 
"nonExistent"), table)
 
         then:
         thrown(org.hibernate.MappingException)

Reply via email to