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
