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 e2919c70c4ebb48708f3fd062aea09738920d763 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Feb 23 12:22:09 2026 -0600 removed deprecated implementation from GrailsIncrementGenerator --- grails-data-hibernate7/REMOVAL_WARNINGS.md | 39 ++++ .../domainbinding/binder/GrailsDomainBinder.java | 2 +- .../domainbinding/binder/SimpleValueBinder.java | 3 +- .../generator/GrailsIncrementGenerator.java | 200 ++++----------------- .../generator/GrailsSequenceGeneratorEnum.groovy | 11 +- .../generator/GrailsSequenceWrapper.java | 6 +- .../domainbinding/util/BasicValueIdCreator.java | 10 +- .../domainbinding/BasicValueIdCreatorSpec.groovy | 15 +- .../cfg/domainbinding/CollectionBinderSpec.groovy | 2 +- .../domainbinding/GrailsPropertyBinderSpec.groovy | 2 +- ...ootPersistentClassCommonValuesBinderSpec.groovy | 2 +- .../generator/GrailsSequenceWrapperSpec.groovy | 6 +- .../secondpass/ListSecondPassBinderSpec.groovy | 2 +- .../secondpass/MapSecondPassBinderSpec.groovy | 2 +- 14 files changed, 113 insertions(+), 189 deletions(-) diff --git a/grails-data-hibernate7/REMOVAL_WARNINGS.md b/grails-data-hibernate7/REMOVAL_WARNINGS.md new file mode 100644 index 0000000000..28ef82e37c --- /dev/null +++ b/grails-data-hibernate7/REMOVAL_WARNINGS.md @@ -0,0 +1,39 @@ +# Removal Deprecation Warnings — grails-data-hibernate7-core + +Warnings collected by compiling `grails-data-hibernate7-core` with `-Xlint:removal`. +These APIs are **marked for removal** in a future Hibernate / JDK release and must be migrated. + +Generated from: Hibernate `7.1.11.Final` + +--- + +| Fully Qualified Class | Line | Warning | +|---|---|---| +| `org.grails.orm.hibernate.GrailsHibernateTemplate` | 388 | `<T>get(Class<T>,Object) in Session` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.GrailsHibernateTemplate` | 419 | `<T>get(Class<T>,Object,LockOptions) in Session` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.GrailsHibernateTemplate` | 419 | `LockOptions in org.hibernate` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.GrailsHibernateTemplate` | 467 | `LockOptions in org.hibernate` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.GrailsHibernateTemplate` | 467 | `refresh(Object,LockOptions) in Session` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.HibernateDatastore` | 686 | `SchemaAutoTooling in org.hibernate.boot` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.HibernateDatastore` | 687 | `SchemaAutoTooling in org.hibernate.boot` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.HibernateDatastore` | 689 | `SchemaAutoTooling in org.hibernate.boot` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.HibernateDatastore` | 690 | `SchemaAutoTooling in org.hibernate.boot` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.cfg.domainbinding.util.GrailsOneToOne` | 98 | `createGenerator(Dialect,RootClass) in KeyValue` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.cfg.domainbinding.util.GrailsOneToOne` | 99 | `createGenerator(Dialect,RootClass) in SimpleValue` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.support.ClosureEventListener` | 342 | `EntityMetamodel in org.hibernate.tuple.entity` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor` | 286 | `EntityMetamodel in org.hibernate.tuple.entity` has been deprecated and marked for removal | +| `org.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor` | 305 | `EntityMetamodel in org.hibernate.tuple.entity` has been deprecated and marked for removal | + +--- + +## Summary by API + +| Deprecated API | Affected Classes | Occurrences | +|---|---|---| +| `LockOptions` (`org.hibernate`) | `GrailsHibernateTemplate` | 3 | +| `Session.get(Class,Object)` / `get(Class,Object,LockOptions)` | `GrailsHibernateTemplate` | 2 | +| `Session.refresh(Object,LockOptions)` | `GrailsHibernateTemplate` | 1 | +| `SchemaAutoTooling` (`org.hibernate.boot`) | `HibernateDatastore` | 4 | +| `IdentifierGenerator.configure(Type,Properties,ServiceRegistry)` | `GrailsIncrementGenerator` | 1 | +| `KeyValue/SimpleValue.createGenerator(Dialect,RootClass)` | `GrailsOneToOne` | 2 | +| `EntityMetamodel` (`org.hibernate.tuple.entity`) | `ClosureEventListener`, `ClosureEventTriggeringInterceptor` | 3 | diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java index b06b402758..90f8735489 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java @@ -184,7 +184,7 @@ public class GrailsDomainBinder implements AdditionalMappingContributor, TypeCon metadataBuildingContext, namingStrategy, jdbcEnvironment, - new BasicValueIdCreator(jdbcEnvironment), + new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinder); IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java index f26978aaa6..71735e7910 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java @@ -146,6 +146,7 @@ public class SimpleValueBinder { context, null, (GrailsHibernatePersistentEntity) property.getHibernateOwner(), - jdbcEnvironment); + jdbcEnvironment, + namingStrategy); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java index 91c17114fa..42caacf91a 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java @@ -20,195 +20,65 @@ package org.grails.orm.hibernate.cfg.domainbinding.generator; import java.util.Properties; import org.grails.orm.hibernate.cfg.Identity; +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.IncrementGenerator; +import static org.hibernate.id.IncrementGenerator.COLUMN; +import static org.hibernate.id.IncrementGenerator.TABLES; +import static org.hibernate.id.PersistentIdentifierGenerator.CATALOG; +import static org.hibernate.id.PersistentIdentifierGenerator.SCHEMA; + /** - * Custom increment ID generator for Grails that extends Hibernate's IncrementGenerator. - * - * <p>⚠️ WARNING: This class contains REFLECTION-BASED HACKS and uses LEGACY HIBERNATE METHODS that - * will be removed in Hibernate 8. This is a workaround for Hibernate 7 limitations. - * - * <p>ISSUES WITH HIBERNATE 7: - IncrementGenerator.configure() does not properly initialize all - * internal state - physicalTableNames, sql, and previousValueHolder fields are not set correctly - - * The initialize() method may not work as expected with the default configuration - These issues - * appear to be fixed in later Hibernate versions but present in early Hibernate 7 - * - * <p>MIGRATION PATH FOR HIBERNATE 8: 1. Check if IncrementGenerator.configure() properly - * initializes all fields 2. Remove all reflection-based field access (returnClassField, - * columnField, etc.) 3. Remove the manual initialize() method calls 4. Remove the - * previousValueHolder initialization hack 5. Simplify the generate() method to rely on parent class - * behavior 6. Run full integration tests to verify increment ID generation works correctly - * - * @see org.hibernate.id.IncrementGenerator + * Grails-aware increment ID generator. Builds the standard {@link IncrementGenerator} parameters + * from GORM mapping metadata and delegates entirely to the parent class — no reflection required. */ public class GrailsIncrementGenerator extends IncrementGenerator { - private boolean initialized = false; - private String resolvedTableName; - private String resolvedColumnName; - private Class<?> resolvedReturnClass; - public GrailsIncrementGenerator( GeneratorCreationContext context, Identity mappedId, - GrailsHibernatePersistentEntity domainClass) { + GrailsHibernatePersistentEntity domainClass, + PersistentEntityNamingStrategy namingStrategy) { + Properties params = new Properties(); if (mappedId != null && mappedId.getProperties() != null) { params.putAll(mappedId.getProperties()); } - // Fix the blank FROM clause: Resolve table name - org.grails.orm.hibernate.cfg.Mapping mapping = domainClass.getMappedForm(); - String tableName = (mapping != null) ? mapping.getTableName() : null; - if (tableName == null || tableName.isEmpty()) { - tableName = - domainClass - .getJavaClass() - .getSimpleName() - .replaceAll("([a-z])([A-Z])", "$1_$2") - .toLowerCase(); - } - this.resolvedTableName = tableName; - params.put("table", tableName); + // Use the entity's naming-strategy-aware table resolution: + // handles explicit mapping, table-per-hierarchy root, and PhysicalNamingStrategy fallback. + params.put(TABLES, domainClass.getTableName(namingStrategy)); + org.grails.orm.hibernate.cfg.Mapping mapping = domainClass.getMappedForm(); if (mapping != null && mapping.getTable() != null) { - if (mapping.getTable().getCatalog() != null) { - params.put("catalog", mapping.getTable().getCatalog()); - } - if (mapping.getTable().getSchema() != null) { - params.put("schema", mapping.getTable().getSchema()); - } + if (mapping.getTable().getCatalog() != null) params.put(CATALOG, mapping.getTable().getCatalog()); + if (mapping.getTable().getSchema() != null) params.put(SCHEMA, mapping.getTable().getSchema()); } - // Resolve column name + // Resolve column name — fall back to "id" if the property path is dotted (composite) String columnName = context.getProperty().getName(); if (columnName == null || columnName.contains(".")) { - columnName = - (mappedId != null && mappedId.getName() != null && !mappedId.getName().contains(".")) - ? mappedId.getName() - : "id"; - } - this.resolvedColumnName = columnName; - this.resolvedReturnClass = context.getType().getReturnedClass(); - params.put("column", columnName); - - // Initialize the internal Hibernate state - this.configure(context.getType(), params, context.getServiceRegistry()); - - // ⚠️ HACK: Manually ensure fields are set via reflection - // Reason: Hibernate 7's IncrementGenerator.configure() does not properly initialize - // returnClass and column fields. This will be fixed in Hibernate 8. - // TODO: Remove this reflection hack when upgrading to Hibernate 8 - try { - Class<?> clazz = org.hibernate.id.IncrementGenerator.class; - java.lang.reflect.Field returnClassField = clazz.getDeclaredField("returnClass"); - returnClassField.setAccessible(true); - returnClassField.set(this, resolvedReturnClass); - - java.lang.reflect.Field columnField = clazz.getDeclaredField("column"); - columnField.setAccessible(true); - columnField.set(this, resolvedColumnName); - } catch (Exception e) { - // Silently ignore - fields may be set through other means or parent initialize - } - - if (context.getDatabase() != null) { - this.registerExportables(context.getDatabase()); + columnName = (mappedId != null && mappedId.getName() != null + && !mappedId.getName().contains(".")) ? mappedId.getName() : "id"; } - } - - @Override - public Object generate(SharedSessionContractImplementor session, Object object) { - if (!initialized) { - synchronized (this) { - if (!initialized) { - SqlStringGenerationContext context = session.getFactory().getSqlStringGenerationContext(); - - try { - Class<?> clazz = org.hibernate.id.IncrementGenerator.class; - - // ⚠️ HACK: Ensure returnClass is set via reflection - // Reason: Legacy Hibernate 7 workaround. Use proper API in Hibernate 8. - java.lang.reflect.Field returnClassField = clazz.getDeclaredField("returnClass"); - returnClassField.setAccessible(true); - if (returnClassField.get(this) == null) { - returnClassField.set(this, resolvedReturnClass); - } - - // ⚠️ HACK: Ensure column is set via reflection - // Reason: Legacy Hibernate 7 workaround. Use proper API in Hibernate 8. - java.lang.reflect.Field columnField = clazz.getDeclaredField("column"); - columnField.setAccessible(true); - if (columnField.get(this) == null) { - columnField.set(this, resolvedColumnName); - } - - // ⚠️ HACK: Set physicalTableNames BEFORE calling initialize - // Reason: IncrementGenerator.initialize() in Hibernate 7 doesn't properly initialize - // this field from the table name. This hack provides it directly. - // TODO: Remove when Hibernate 8 is released and tested - java.lang.reflect.Field field = clazz.getDeclaredField("physicalTableNames"); - field.setAccessible(true); - if (field.get(this) == null) { - JdbcEnvironment jdbcEnvironment = session.getJdbcServices().getJdbcEnvironment(); - field.set( - this, - java.util.List.of( - jdbcEnvironment - .getQualifiedObjectNameFormatter() - .format( - new org.hibernate.boot.model.relational.QualifiedTableName( - null, - null, - jdbcEnvironment - .getIdentifierHelper() - .toIdentifier(resolvedTableName)), - context.getDialect()))); - } - - try { - // Call parent initialize() - may fail or partially initialize in Hibernate 7 - this.initialize(context); - } catch (Exception e) { - // Silently ignore - we'll manually set required fields below - } - - // ⚠️ HACK: Ensure sql is set via reflection - // Reason: IncrementGenerator.initialize() may not set the SQL query properly. - // This hack ensures we have a valid SQL query for fetching the max ID. - // TODO: Remove in Hibernate 8 and verify initialize() sets this correctly - java.lang.reflect.Field sqlField = clazz.getDeclaredField("sql"); - sqlField.setAccessible(true); - if (sqlField.get(this) == null) { - sqlField.set( - this, "select max(" + resolvedColumnName + ") from " + resolvedTableName); - } - - // ⚠️ HACK: Initialize previousValueHolder via reflection - // Reason: This is a legacy Hibernate 7 workaround to ensure the holder is initialized. - // The initialize() method should handle this, but doesn't in all cases. - // TODO: Remove this entire block in Hibernate 8 and rely on parent class - java.lang.reflect.Field holderField = clazz.getDeclaredField("previousValueHolder"); - holderField.setAccessible(true); - if (holderField.get(this) == null) { - java.lang.reflect.Method initMethod = - clazz.getDeclaredMethod( - "initializePreviousValueHolder", SharedSessionContractImplementor.class); - initMethod.setAccessible(true); - initMethod.invoke(this, session); - } - } catch (Exception e) { - // Silently ignore - parent generate() may still work with partial initialization - } - initialized = true; - } - } - } - return super.generate(session, object); + params.put(COLUMN, columnName); + + // Delegate to the standard configure() — sets returnClass, column, physicalTableNames + configure(context, params); + + // Build SqlStringGenerationContext and initialize the SQL query + JdbcEnvironment jdbcEnvironment = context.getDatabase().getJdbcEnvironment(); + var physicalName = context.getDatabase().getDefaultNamespace().getPhysicalName(); + String catalog = physicalName.catalog() != null ? physicalName.catalog().getCanonicalName() : null; + String schema = physicalName.schema() != null ? physicalName.schema().getCanonicalName() : null; + SqlStringGenerationContext sqlContext = + SqlStringGenerationContextImpl.fromExplicit(jdbcEnvironment, context.getDatabase(), catalog, schema); + initialize(sqlContext); } } + diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.groovy b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.groovy index e7d8e06905..04e1f4dc44 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.groovy +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.groovy @@ -7,6 +7,7 @@ import org.hibernate.generator.Generator import org.hibernate.generator.GeneratorCreationContext import org.hibernate.id.uuid.UuidGenerator +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity import org.grails.orm.hibernate.cfg.Identity @@ -51,8 +52,9 @@ enum GrailsSequenceGeneratorEnum { GeneratorCreationContext context, Identity mappedId, GrailsHibernatePersistentEntity domainClass, - JdbcEnvironment jdbcEnvironment) { - return getGenerator(fromName(name).orElse(NATIVE), context, mappedId, domainClass, jdbcEnvironment) + JdbcEnvironment jdbcEnvironment, + PersistentEntityNamingStrategy namingStrategy) { + return getGenerator(fromName(name).orElse(NATIVE), context, mappedId, domainClass, jdbcEnvironment, namingStrategy) } static Generator getGenerator( @@ -60,14 +62,15 @@ enum GrailsSequenceGeneratorEnum { GeneratorCreationContext context, Identity mappedId, GrailsHibernatePersistentEntity domainClass, - JdbcEnvironment jdbcEnvironment) { + JdbcEnvironment jdbcEnvironment, + PersistentEntityNamingStrategy namingStrategy) { switch (sequenceGeneratorEnum) { case IDENTITY: return new GrailsIdentityGenerator(context, mappedId) case [SEQUENCE, SEQUENCE_IDENTITY, HILO]: return new GrailsSequenceStyleGenerator(context, mappedId, jdbcEnvironment) case INCREMENT: - return new GrailsIncrementGenerator(context, mappedId, domainClass) + return new GrailsIncrementGenerator(context, mappedId, domainClass, namingStrategy) case [UUID, UUID2]: return new UuidGenerator(context.getType().getReturnedClass()) case ASSIGNED: diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java index 8621453eb0..0bc7c3d7c7 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java @@ -22,6 +22,7 @@ import static org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenc import static org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceGeneratorEnum.fromName; import org.grails.orm.hibernate.cfg.Identity; +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.generator.Generator; @@ -34,8 +35,9 @@ public class GrailsSequenceWrapper { GeneratorCreationContext context, Identity mappedId, GrailsHibernatePersistentEntity domainClass, - JdbcEnvironment jdbcEnvironment) { + JdbcEnvironment jdbcEnvironment, + PersistentEntityNamingStrategy namingStrategy) { return GrailsSequenceGeneratorEnum.getGenerator( - fromName(name).orElse(NATIVE), context, mappedId, domainClass, jdbcEnvironment); + fromName(name).orElse(NATIVE), context, mappedId, domainClass, jdbcEnvironment, namingStrategy); } } 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 2c7653f6d8..0472e06809 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 @@ -19,6 +19,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.util; import org.grails.orm.hibernate.cfg.Identity; +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceWrapper; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -32,18 +33,21 @@ import org.hibernate.mapping.Table; public class BasicValueIdCreator { private final JdbcEnvironment jdbcEnvironment; + private final PersistentEntityNamingStrategy namingStrategy; private final GrailsSequenceWrapper grailsSequenceWrapper; /** Creates a new {@link BasicValueIdCreator} instance. */ - public BasicValueIdCreator(JdbcEnvironment jdbcEnvironment) { + public BasicValueIdCreator(JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy) { this.jdbcEnvironment = jdbcEnvironment; + this.namingStrategy = namingStrategy; this.grailsSequenceWrapper = new GrailsSequenceWrapper(); } /** Creates a new {@link BasicValueIdCreator} instance. */ protected BasicValueIdCreator( - JdbcEnvironment jdbcEnvironment, GrailsSequenceWrapper grailsSequenceWrapper) { + JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy, GrailsSequenceWrapper grailsSequenceWrapper) { this.jdbcEnvironment = jdbcEnvironment; + this.namingStrategy = namingStrategy; this.grailsSequenceWrapper = grailsSequenceWrapper; } @@ -69,6 +73,6 @@ public class BasicValueIdCreator { GeneratorCreationContext context, String generatorName) { return grailsSequenceWrapper.getGenerator( - generatorName, context, mappedId, domainClass, jdbcEnvironment); + generatorName, context, mappedId, domainClass, jdbcEnvironment, namingStrategy); } } 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 e1779f62a1..4ea6994586 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 @@ -3,6 +3,7 @@ package org.grails.orm.hibernate.cfg.domainbinding import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment import grails.gorm.specs.HibernateGormDatastoreSpec +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity import org.grails.orm.hibernate.cfg.Identity import org.hibernate.boot.spi.MetadataBuildingContext @@ -26,17 +27,19 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { Table table GrailsSequenceWrapper grailsSequenceWrapper JdbcEnvironment jdbcEnvironment + PersistentEntityNamingStrategy namingStrategy def setup() { metadataBuildingContext = getGrailsDomainBinder().getMetadataBuildingContext() jdbcEnvironment = Mock(JdbcEnvironment) + namingStrategy = Mock(PersistentEntityNamingStrategy) grailsSequenceWrapper = Mock(GrailsSequenceWrapper) entity = new RootClass(metadataBuildingContext) table = new Table("test_table") 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, grailsSequenceWrapper) + creator = new BasicValueIdCreator(jdbcEnvironment, namingStrategy, grailsSequenceWrapper) } @Unroll @@ -54,7 +57,7 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { Generator generator = generatorCreator.createGenerator(context) then: - 1 * grailsSequenceWrapper.getGenerator(generatorName, context, mappedId, domainClass, jdbcEnvironment) >> mockGenerator + 1 * grailsSequenceWrapper.getGenerator(generatorName, context, mappedId, domainClass, jdbcEnvironment, namingStrategy) >> mockGenerator generator == mockGenerator where: @@ -83,7 +86,7 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { Generator generator = generatorCreator.createGenerator(context) then: - 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.NATIVE.toString(), context, null, domainClass, jdbcEnvironment) >> mockGenerator + 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.NATIVE.toString(), context, null, domainClass, jdbcEnvironment, namingStrategy) >> mockGenerator generator == mockGenerator } @@ -99,7 +102,7 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { Generator generator = generatorCreator.createGenerator(context) then: - 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.SEQUENCE_IDENTITY.toString(), context, null, domainClass, jdbcEnvironment) >> mockGenerator + 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.SEQUENCE_IDENTITY.toString(), context, null, domainClass, jdbcEnvironment, namingStrategy) >> mockGenerator generator == mockGenerator } @@ -117,7 +120,7 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { Generator generator = generatorCreator.createGenerator(context) then: - 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.SEQUENCE_IDENTITY.toString(), context, mappedId, domainClass, jdbcEnvironment) >> mockGenerator + 1 * grailsSequenceWrapper.getGenerator(GrailsSequenceGeneratorEnum.SEQUENCE_IDENTITY.toString(), context, mappedId, domainClass, jdbcEnvironment, namingStrategy) >> mockGenerator generator == mockGenerator } @@ -134,6 +137,6 @@ class BasicValueIdCreatorSpec extends HibernateGormDatastoreSpec { generatorCreator.createGenerator(context) then: - 1 * grailsSequenceWrapper.getGenerator("custom", context, mappedId, domainClass, jdbcEnvironment) >> Mock(Generator) + 1 * grailsSequenceWrapper.getGenerator("custom", context, mappedId, domainClass, jdbcEnvironment, namingStrategy) >> Mock(Generator) } } 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 b51ef3585c..58ca44c4d6 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 @@ -106,7 +106,7 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { ) CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentBinder, componentUpdater, propertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() - SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) + SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) VersionBinder versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinderHelper, BasicValue::new) 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 0301f68639..c5f1ad56eb 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 @@ -165,7 +165,7 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { componentBinder.setGrailsPropertyBinder(propertyBinder) CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentBinder, componentUpdater, propertyBinder); PropertyBinder propertyBinderHelper = new PropertyBinder() - SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) + SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) VersionBinder versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinderHelper, BasicValue::new) NaturalIdentifierBinder naturalIdentifierBinder = new NaturalIdentifierBinder() diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy index 5ff513e0a8..8ff83544ce 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy @@ -36,7 +36,7 @@ class RootPersistentClassCommonValuesBinderSpec extends HibernateGormDatastoreSp def jdbcEnvironment = gormDomainBinder.getJdbcEnvironment() def simpleValueBinder = new SimpleValueBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment) def propertyBinder = new PropertyBinder() - def simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinder) + def simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinder) def compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, null, null, null) identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinder, BasicValue::new) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapperSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapperSpec.groovy index 45db49a500..3338848e25 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapperSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapperSpec.groovy @@ -1,6 +1,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.generator import grails.gorm.specs.HibernateGormDatastoreSpec +import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity import org.grails.orm.hibernate.cfg.Identity import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment @@ -18,12 +19,13 @@ class GrailsSequenceWrapperSpec extends HibernateGormDatastoreSpec { def mappedId = Mock(Identity) def domainClass = Mock(GrailsHibernatePersistentEntity) def jdbcEnvironment = Mock(JdbcEnvironment) - + def namingStrategy = Mock(PersistentEntityNamingStrategy) + // Setup minimal mocks for assigned generator which is simple to instantiate context.getProperty() >> null when: - def generator = wrapper.getGenerator("assigned", context, mappedId, domainClass, jdbcEnvironment) + def generator = wrapper.getGenerator("assigned", context, mappedId, domainClass, jdbcEnvironment, namingStrategy) then: generator instanceof org.hibernate.generator.Assigned diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy index 059c052a28..81c173c3d8 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy @@ -105,7 +105,7 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { ) CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentBinder, componentUpdater, propertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() - SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) + SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) VersionBinder versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinderHelper, BasicValue::new) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy index 86f0b4d474..8449daef7c 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy @@ -105,7 +105,7 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { ) CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentBinder, componentUpdater, propertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() - SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) + SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment, namingStrategy), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) VersionBinder versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinderHelper, BasicValue::new)
