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 66a245ec858d0b3b16fdbe49460f0e7f6b30e4e2
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon Feb 16 21:35:36 2026 -0600

    Refactor TableNameFetcher logic into GrailsHibernatePersistentEntity
---
 .../orm/hibernate/cfg/GrailsDomainBinder.java      |  4 +--
 .../cfg/GrailsHibernatePersistentEntity.java       | 15 ++++++++
 .../CompositeIdentifierToManyToOneBinder.java      |  7 +---
 .../domainbinding/binder/JoinedSubClassBinder.java |  3 +-
 .../domainbinding/binder/UnionSubclassBinder.java  |  3 +-
 .../domainbinding/util/TableForManyCalculator.java |  8 ++---
 .../cfg/domainbinding/util/TableNameFetcher.java   | 29 ---------------
 .../cfg/GrailsHibernatePersistentEntitySpec.groovy | 38 ++++++++++++++++++++
 .../cfg/domainbinding/CollectionBinderSpec.groovy  |  2 --
 .../CollectionSecondPassBinderSpec.groovy          |  2 --
 ...CompositeIdentifierToManyToOneBinderSpec.groovy | 42 +++++++++++-----------
 .../domainbinding/GrailsPropertyBinderSpec.groovy  |  2 --
 .../domainbinding/ListSecondPassBinderSpec.groovy  |  2 --
 .../domainbinding/MapSecondPassBinderSpec.groovy   |  2 --
 .../TableForManyCalculatorSpec.groovy              |  5 +--
 .../cfg/domainbinding/TableNameFetcherSpec.groovy  | 41 ---------------------
 16 files changed, 81 insertions(+), 124 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 1b44fb0c22..3e97972035 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
@@ -47,7 +47,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover;
 import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyWrapper;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher;
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher;
 
 import org.checkerframework.checker.nullness.qual.NonNull;
 import org.hibernate.boot.ResourceStreamLocator;
@@ -165,7 +164,6 @@ public class GrailsDomainBinder
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
@@ -455,7 +453,7 @@ public class GrailsDomainBinder
         // create the table
         var table = mappings.addTable(schema
                 , catalog
-                , new 
TableNameFetcher(getNamingStrategy()).getTableName(domainClass)
+                , domainClass.getTableName(getNamingStrategy())
                 , null
                 , domainClass.isTableAbstract()
                 , metadataBuildingContext
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java
index 5df2c4c683..486e946aba 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java
@@ -198,6 +198,21 @@ package org.grails.orm.hibernate.cfg;
 
     }
 
+    /**
+     * Evaluates the table name for the given entity
+     *
+     * @param persistentEntityNamingStrategy The naming strategy
+     * @return The table name
+     */
+    default String getTableName(PersistentEntityNamingStrategy 
persistentEntityNamingStrategy) {
+        return Optional.ofNullable(getMappedForm())
+                .map(Mapping::getTableName)
+                .or(() -> Optional.ofNullable(getRootMapping())
+                        .filter(Mapping::isTablePerHierarchy)
+                        .map(Mapping::getTableName))
+                .orElseGet(() -> 
persistentEntityNamingStrategy.resolveTableName(this));
+    }
+
      default String getDiscriminatorColumnName() {
         return Optional.ofNullable(getRootMapping())
                 .map(Mapping::getDiscriminator)
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java
index 84f6e45960..e4cd1f8e35 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java
@@ -16,7 +16,6 @@ import 
org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty;
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator;
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher;
 import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover;
 
 import static org.grails.orm.hibernate.cfg.GrailsDomainBinder.UNDERSCORE;
@@ -24,7 +23,6 @@ import static 
org.grails.orm.hibernate.cfg.GrailsDomainBinder.UNDERSCORE;
 public class CompositeIdentifierToManyToOneBinder {
     private final MetadataBuildingContext metadataBuildingContext;
     private final ForeignKeyColumnCountCalculator 
foreignKeyColumnCountCalculator;
-    private final TableNameFetcher tableNameFetcher;
     private final PersistentEntityNamingStrategy namingStrategy;
     private final DefaultColumnNameFetcher defaultColumnNameFetcher;
     private final BackticksRemover backticksRemover;
@@ -33,14 +31,12 @@ public class CompositeIdentifierToManyToOneBinder {
     public CompositeIdentifierToManyToOneBinder(
             MetadataBuildingContext metadataBuildingContext,
             ForeignKeyColumnCountCalculator foreignKeyColumnCountCalculator,
-            TableNameFetcher tableNameFetcher,
             PersistentEntityNamingStrategy namingStrategy,
             DefaultColumnNameFetcher defaultColumnNameFetcher,
             BackticksRemover backticksRemover,
             SimpleValueBinder simpleValueBinder) {
         this.metadataBuildingContext = metadataBuildingContext;
         this.foreignKeyColumnCountCalculator = foreignKeyColumnCountCalculator;
-        this.tableNameFetcher =tableNameFetcher;
         this.namingStrategy = namingStrategy;
         this.defaultColumnNameFetcher = defaultColumnNameFetcher;
         this.backticksRemover = backticksRemover;
@@ -50,7 +46,6 @@ public class CompositeIdentifierToManyToOneBinder {
     public CompositeIdentifierToManyToOneBinder(MetadataBuildingContext 
metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, 
JdbcEnvironment jdbcEnvironment){
         this(metadataBuildingContext,
                 new ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 new DefaultColumnNameFetcher(namingStrategy),
                 new BackticksRemover(),
@@ -82,7 +77,7 @@ public class CompositeIdentifierToManyToOneBinder {
                 // if the name is null then configure the name by convention
                 if (cc.getName() == null) {
                     // use the referenced table name as a prefix
-                    String prefix = refDomainClass instanceof 
GrailsHibernatePersistentEntity ghpe ? tableNameFetcher.getTableName(ghpe) : 
refDomainClass.getName();
+                    String prefix = refDomainClass instanceof 
GrailsHibernatePersistentEntity ghpe ? ghpe.getTableName(namingStrategy) : 
refDomainClass.getName();
                     PersistentProperty referencedProperty = 
refDomainClass.getPropertyByName(propertyName);
 
                     // if the referenced property is a ToOne and it has a 
composite id
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/JoinedSubClassBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/JoinedSubClassBinder.java
index b4b78c44fd..f042b9ad35 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/JoinedSubClassBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/JoinedSubClassBinder.java
@@ -6,7 +6,6 @@ import org.grails.orm.hibernate.cfg.GrailsHibernateUtil;
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher;
 import 
org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator;
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher;
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.boot.spi.MetadataBuildingContext;
 import org.hibernate.mapping.DependantValue;
@@ -82,7 +81,7 @@ public class JoinedSubClassBinder {
             InFlightMetadataCollector mappings) {
 
         String logicalTableName = 
GrailsHibernateUtil.unqualify(model.getEntityName());
-        String physicalTableName = new 
TableNameFetcher(namingStrategy).getTableName(sub);
+        String physicalTableName = sub.getTableName(namingStrategy);
 
         String schemaName = sub.getSchema(mappings);
         String catalogName = sub.getCatalog(mappings);
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/UnionSubclassBinder.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/UnionSubclassBinder.java
index 7982ed1005..a7fe3b4a02 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/UnionSubclassBinder.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/UnionSubclassBinder.java
@@ -3,7 +3,6 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder;
 import jakarta.annotation.Nonnull;
 import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity;
 import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher;
 import org.hibernate.MappingException;
 import org.hibernate.boot.spi.InFlightMetadataCollector;
 import org.hibernate.boot.spi.MetadataBuildingContext;
@@ -49,7 +48,7 @@ public class UnionSubclassBinder {
         Table mytable = mappings.addDenormalizedTable(
                 schema,
                 catalog,
-                new TableNameFetcher(namingStrategy).getTableName(subClass),
+                subClass.getTableName(namingStrategy),
                 Boolean.TRUE.equals(unionSubclass.isAbstract()),
                 null,
                 denormalizedSuperTable, metadataBuildingContext
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java
index 1756a6900c..8877091026 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java
@@ -18,20 +18,16 @@ import static 
org.grails.orm.hibernate.cfg.GrailsDomainBinder.UNDERSCORE;
 public class TableForManyCalculator {
 
     private final PersistentEntityNamingStrategy namingStrategy;
-    private final TableNameFetcher tableNameFetcher;
     private final BackticksRemover backticksRemover;
 
     public TableForManyCalculator(PersistentEntityNamingStrategy 
namingStrategy) {
         this.namingStrategy = namingStrategy;
-        tableNameFetcher = new TableNameFetcher(namingStrategy);
         backticksRemover = new BackticksRemover();
     }
 
     protected TableForManyCalculator(PersistentEntityNamingStrategy 
namingStrategy
-             , TableNameFetcher tableNameFetcher
             , BackticksRemover backticksRemover) {
         this.namingStrategy = namingStrategy;
-        this.tableNameFetcher = tableNameFetcher;
         this.backticksRemover = backticksRemover;
     }
 
@@ -48,7 +44,7 @@ public class TableForManyCalculator {
         JoinTable jt = config.getJoinTable();
         boolean hasJoinTableMapping = jt != null && jt.getName() != null;
         GrailsHibernatePersistentEntity domainClass1 = 
property.getHibernateOwner();
-        String left = tableNameFetcher.getTableName(domainClass1);
+        String left = domainClass1.getTableName(namingStrategy);
 
         if (Map.class.isAssignableFrom(property.getType())) {
             if (hasJoinTableMapping) {
@@ -71,7 +67,7 @@ public class TableForManyCalculator {
         if (domainClass == null) {
             throw new MappingException("Expected an entity to be associated 
with the association (" + property + ") and none was found. ");
         }
-        String right = tableNameFetcher.getTableName(domainClass);
+        String right = domainClass.getTableName(namingStrategy);
 
         if (property instanceof HibernateManyToManyProperty property1) {
             if (hasJoinTableMapping) {
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableNameFetcher.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableNameFetcher.java
deleted file mode 100644
index 6074a98f50..0000000000
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableNameFetcher.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.grails.orm.hibernate.cfg.domainbinding.util;
-
-import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity;
-import org.grails.orm.hibernate.cfg.Mapping;
-import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy;
-
-/**
- * Evaluates the table name for the given property
- *
- */
-public class TableNameFetcher {
-
-    private final PersistentEntityNamingStrategy 
persistentEntityNamingStrategy;
-
-    public TableNameFetcher(PersistentEntityNamingStrategy 
persistentEntityNamingStrategy) {
-        this.persistentEntityNamingStrategy = persistentEntityNamingStrategy;
-    }
-
-    public String getTableName(GrailsHibernatePersistentEntity domainClass) {
-        GrailsHibernatePersistentEntity root = 
(GrailsHibernatePersistentEntity) domainClass.getRootEntity();
-        Mapping rootMapping = root.getMappedForm();
-        Mapping result = domainClass.getMappedForm();
-        var tableName = result != null ? result.getTableName() : null;
-        if (tableName == null && rootMapping != null && 
rootMapping.isTablePerHierarchy()) {
-            tableName = rootMapping.getTableName();
-        }
-        return tableName != null ? tableName  
:persistentEntityNamingStrategy.resolveTableName(domainClass);
-    }
-}
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy
index 9c7351ee2e..1abecd09b0 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy
@@ -20,10 +20,40 @@ class GrailsHibernatePersistentEntitySpec extends 
HibernateGormDatastoreSpec {
                 Person,
                 AddressOwner,
                 CustomTableEntity,
+                CustomTableNameEntity,
                 DerivedPropertyEntity
         ])
     }
 
+    void "test getTableName"() {
+        given:
+        GrailsHibernatePersistentEntity simple = getPersistentEntity(Simple) 
as GrailsHibernatePersistentEntity
+        GrailsHibernatePersistentEntity custom = 
getPersistentEntity(CustomTableNameEntity) as GrailsHibernatePersistentEntity
+        GrailsHibernatePersistentEntity car = getPersistentEntity(Car) as 
GrailsHibernatePersistentEntity
+        def namingStrategy = Mock(PersistentEntityNamingStrategy)
+
+        when: "Basic entity with no explicit table name"
+        def name1 = simple.getTableName(namingStrategy)
+
+        then:
+        1 * namingStrategy.resolveTableName(simple) >> "resolved_simple"
+        name1 == "resolved_simple"
+
+        when: "Entity with explicit table name"
+        def name2 = custom.getTableName(namingStrategy)
+
+        then:
+        0 * namingStrategy.resolveTableName(custom)
+        name2 == "my_custom_table"
+
+        when: "Subclass in table-per-hierarchy using root table name"
+        def name3 = car.getTableName(namingStrategy)
+
+        then:
+        1 * namingStrategy.resolveTableName(_) >> "vehicle_table"
+        name3 == "vehicle_table"
+    }
+
     void "test buildDiscriminatorSet for simple entity"() {
         given:
         GrailsHibernatePersistentEntity entity = getPersistentEntity(Simple) 
as GrailsHibernatePersistentEntity
@@ -230,6 +260,14 @@ class CustomTableEntity {
     }
 }
 
+@Entity
+class CustomTableNameEntity {
+    Long id
+    static mapping = {
+        table "my_custom_table"
+    }
+}
+
 @Entity
 class DerivedPropertyEntity {
     Long id
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 8624f02f5a..2d8d5571ed 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
@@ -15,7 +15,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder
 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.domainbinding.binder.ClassBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder
@@ -60,7 +59,6 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec 
{
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
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 5530b3d9a5..e97d42f1ad 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
@@ -15,7 +15,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder
 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.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
@@ -59,7 +58,6 @@ class CollectionSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdentifierToManyToOneBinderSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdentifierToManyToOneBinderSpec.groovy
index 6c6ce81a64..cecf208650 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdentifierToManyToOneBinderSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdentifierToManyToOneBinderSpec.groovy
@@ -17,7 +17,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder
 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.ForeignKeyColumnCountCalculator
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
 
 class CompositeIdentifierToManyToOneBinderSpec extends Specification {
 
@@ -25,7 +24,6 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
         given:
         // 1. Stub all dependencies for the protected constructor
         def calculator = Stub(ForeignKeyColumnCountCalculator)
-        def tableNameFetcher = Stub(TableNameFetcher)
         def namingStrategy = Stub(PersistentEntityNamingStrategy)
         def columnNameFetcher = Stub(DefaultColumnNameFetcher)
         def backticksRemover = Stub(BackticksRemover)
@@ -33,12 +31,13 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
         def metadataBuildingContext = 
Mock(org.hibernate.boot.spi.MetadataBuildingContext)
 
         // Instantiate the binder with stubs
-        def binder = new 
CompositeIdentifierToManyToOneBinder(metadataBuildingContext, calculator, 
tableNameFetcher, namingStrategy, columnNameFetcher, backticksRemover, 
simpleValueBinder)
+        def binder = new 
CompositeIdentifierToManyToOneBinder(metadataBuildingContext, calculator, 
namingStrategy, columnNameFetcher, backticksRemover, simpleValueBinder)
 
         // 2. Set up stubs for the method arguments
-        def association = Stub(ToOne, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
-        def value = Stub(SimpleValue)
-        def refDomainClass = Stub(PersistentEntity, additionalInterfaces: 
[GrailsHibernatePersistentEntity])
+        def association = Mock(ToOne)
+        association.asType(GrailsHibernatePersistentProperty) >> association
+        def value = Mock(SimpleValue)
+        def refDomainClass = Mock(GrailsHibernatePersistentEntity)
         def path = "/test"
 
         // Use a real CompositeIdentity object to avoid final method mocking 
issues
@@ -52,20 +51,21 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
 
         calculator.calculateForeignKeyColumnCount(refDomainClass, 
propertyNames) >> 2
 
-        def nestedEntityProp = Stub(ToOne, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
+        def nestedEntityProp = Mock(ToOne)
+        nestedEntityProp.asType(GrailsHibernatePersistentProperty) >> 
nestedEntityProp
         refDomainClass.getPropertyByName("nestedEntity") >> nestedEntityProp
         nestedEntityProp.name >> "nestedEntity"
 
-        def nestedAssociatedEntity = Stub(PersistentEntity, 
additionalInterfaces: [GrailsHibernatePersistentEntity])
+        def nestedAssociatedEntity = Mock(GrailsHibernatePersistentEntity)
         nestedEntityProp.getAssociatedEntity() >> nestedAssociatedEntity
 
-        def nestedPartA = Stub(PersistentProperty, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
-        def nestedPartB = Stub(PersistentProperty, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
+        def nestedPartA = Mock(GrailsHibernatePersistentProperty)
+        def nestedPartB = Mock(GrailsHibernatePersistentProperty)
         def perArray = [nestedPartA, nestedPartB] as PersistentProperty[]
         nestedAssociatedEntity.getCompositeIdentity() >> perArray
 
         // 4. Mock the behavior of the dependency methods
-        tableNameFetcher.getTableName(refDomainClass) >> "ref_table"
+        refDomainClass.getTableName(namingStrategy) >> "ref_table"
         namingStrategy.resolveColumnName("nestedEntity") >> "nested_entity_col"
         columnNameFetcher.getDefaultColumnName(nestedPartA) >> "part_a_col"
         columnNameFetcher.getDefaultColumnName(nestedPartB) >> "part_b_col"
@@ -74,7 +74,7 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
         backticksRemover.apply(_) >> { String s -> s }
 
         when:
-        binder.bindCompositeIdentifierToManyToOne(association as ToOne, value, 
compositeId, refDomainClass, path)
+        binder.bindCompositeIdentifierToManyToOne(association as 
GrailsHibernatePersistentProperty, value, compositeId, refDomainClass, path)
 
         then:
         // 5. Verify the final generated column names
@@ -84,28 +84,28 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
         finalColumns[1].getName() == "ref_table_nested_entity_col_part_b_col"
 
         and: // 6. Verify the call to the simple value binder
-        1 * simpleValueBinder.bindSimpleValue(association as 
GrailsHibernatePersistentProperty, null, value, path)
+        1 * simpleValueBinder.bindSimpleValue(_ as 
GrailsHibernatePersistentProperty, null, value, path)
     }
 
     def "Test bindCompositeIdentifierToManyToOne when column count matches"() {
         given:
         // 1. Use Mocks for dependencies that require interaction verification
         def calculator = Stub(ForeignKeyColumnCountCalculator)
-        def tableNameFetcher = Mock(TableNameFetcher)
         def namingStrategy = Mock(PersistentEntityNamingStrategy)
         def columnNameFetcher = Mock(DefaultColumnNameFetcher)
         def backticksRemover = Mock(BackticksRemover)
         def simpleValueBinder = Mock(SimpleValueBinder)
         def metadataBuildingContext = 
Mock(org.hibernate.boot.spi.MetadataBuildingContext)
 
-        def binder = new 
CompositeIdentifierToManyToOneBinder(metadataBuildingContext, calculator, 
tableNameFetcher, namingStrategy, columnNameFetcher, backticksRemover, 
simpleValueBinder)
+        def binder = new 
CompositeIdentifierToManyToOneBinder(metadataBuildingContext, calculator, 
namingStrategy, columnNameFetcher, backticksRemover, simpleValueBinder)
 
         // 2. Set up arguments
-        def association = Stub(ToOne, additionalInterfaces: 
[GrailsHibernatePersistentProperty])
-        def value = Stub(SimpleValue)
+        def association = Mock(ToOne)
+        association.asType(GrailsHibernatePersistentProperty) >> association
+        def value = Mock(SimpleValue)
         def compositeId = new CompositeIdentity()
         compositeId.setPropertyNames(["prop1", "prop2"] as String[])
-        def refDomainClass = Stub(PersistentEntity, additionalInterfaces: 
[GrailsHibernatePersistentEntity])
+        def refDomainClass = Mock(GrailsHibernatePersistentEntity)
         def path = "/test"
 
         // 3. Set up the "match" condition
@@ -118,16 +118,16 @@ class CompositeIdentifierToManyToOneBinderSpec extends 
Specification {
         calculator.calculateForeignKeyColumnCount(refDomainClass, _ as 
String[]) >> 2
 
         when:
-        binder.bindCompositeIdentifierToManyToOne(association as ToOne, value, 
compositeId, refDomainClass, path)
+        binder.bindCompositeIdentifierToManyToOne(association as 
GrailsHibernatePersistentProperty, value, compositeId, refDomainClass, path)
 
         then:
         // 4. Verify the column name generation logic is skipped
-        0 * tableNameFetcher._
+        0 * refDomainClass.getTableName(_)
         0 * namingStrategy._
         0 * columnNameFetcher._
         0 * backticksRemover._
 
         and: // 5. Verify the simple value binder is still called
-        1 * simpleValueBinder.bindSimpleValue(association as 
GrailsHibernatePersistentProperty, null, value, path)
+        1 * simpleValueBinder.bindSimpleValue(_ as 
GrailsHibernatePersistentProperty, null, value, path)
     }
 }
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 1c1ec02083..aa85b27d30 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
@@ -41,7 +41,6 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder
 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.IdentityBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder
@@ -119,7 +118,6 @@ class GrailsPropertyBinderSpec extends 
HibernateGormDatastoreSpec {
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
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 7bbb222ad4..f6f6df3c9e 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
@@ -15,7 +15,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder
 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.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
@@ -59,7 +58,6 @@ class ListSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
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 fb869edfe0..054430be5c 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
@@ -15,7 +15,6 @@ import 
org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder
 import 
org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder
 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.domainbinding.binder.OneToOneBinder
 import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder
@@ -59,7 +58,6 @@ class MapSecondPassBinderSpec extends 
HibernateGormDatastoreSpec {
         CompositeIdentifierToManyToOneBinder 
compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(
                 metadataBuildingContext,
                 new 
org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(),
-                new TableNameFetcher(namingStrategy),
                 namingStrategy,
                 defaultColumnNameFetcher,
                 backticksRemover,
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableForManyCalculatorSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableForManyCalculatorSpec.groovy
index c4b1f95d7f..794c80ff96 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableForManyCalculatorSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableForManyCalculatorSpec.groovy
@@ -7,10 +7,8 @@ import 
org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty
 import org.grails.orm.hibernate.cfg.JoinTable
 
 import spock.lang.Unroll
-
 import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover
 import org.grails.orm.hibernate.cfg.domainbinding.util.TableForManyCalculator
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
 
 class TableForManyCalculatorSpec extends HibernateGormDatastoreSpec {
 
@@ -18,10 +16,9 @@ class TableForManyCalculatorSpec extends 
HibernateGormDatastoreSpec {
     def "Test calculateTableForMany for #scenario"() {
         given:
         def namingStrategy = getGrailsDomainBinder().getNamingStrategy()
-        def tableNameFetcher = new TableNameFetcher(namingStrategy)
         def backticksRemover = new BackticksRemover()
 
-        def calculator = new TableForManyCalculator(namingStrategy, 
tableNameFetcher, backticksRemover)
+        def calculator = new TableForManyCalculator(namingStrategy, 
backticksRemover)
 
         GrailsHibernatePersistentEntity ownerEntityInstance
         GrailsHibernatePersistentEntity associatedEntityInstance
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy
deleted file mode 100644
index 070876d0dd..0000000000
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.grails.orm.hibernate.cfg.domainbinding
-
-
-import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity
-import org.grails.orm.hibernate.cfg.Mapping
-import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher
-
-class TableNameFetcherSpec extends Specification {
-
-    @Unroll
-    def "Test getTableName when mapped form returns '#tableName'"() {
-        given:
-        def namingStrategy = Mock(PersistentEntityNamingStrategy)
-        def fetcher = new TableNameFetcher(namingStrategy)
-        def mapping = Mock(Mapping)
-        def persistentEntity = Mock(GrailsHibernatePersistentEntity)
-
-        persistentEntity.getMappedForm() >> mapping
-        persistentEntity.getRootEntity() >> persistentEntity
-
-        // The table name from the mapping can be explicit or null
-        mapping.getTableName() >> tableName
-        // The naming strategy will provide a fallback
-        namingStrategy.resolveTableName(persistentEntity) >> 
"strategy_table_name"
-
-        when:
-        String result = fetcher.getTableName(persistentEntity)
-
-        then:
-        result == expectedResult
-
-        where:
-        scenario              | tableName             | expectedResult
-        "explicit table name" | "explicit_table_name" | "explicit_table_name"
-        "null table name"     | null                  | "strategy_table_name"
-    }
-}
\ No newline at end of file


Reply via email to