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 b53653b76dfe42c4efdce68717a637e188cc2bd4 Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Mon Jan 19 13:33:41 2026 -0600 update progress --- .../core/HIBERNATE7-UPGRADE-PROGRESS.md | 18 +++++++++ .../cfg/domainbinding/BasicValueIdCreator.java | 2 +- .../GrailsSequenceStyleGenerator.java | 46 ++++++++++++++++++++-- .../cfg/domainbinding/GrailsTableGenerator.java | 1 + 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md b/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md index 3ea6688c16..f5129c8544 100644 --- a/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md +++ b/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md @@ -7,6 +7,12 @@ This document summarizes the approaches taken, challenges encountered, and futur +## Hibernate 7 Key Constraints & Best Practices + +### Identifier Generators +- **Avoid Deprecated `configure`:** Do **not** use the three-parameter `configure(Type, Properties, ServiceRegistry)` method in `IdentifierGenerator` (or its subclasses like `SequenceStyleGenerator`). It is marked for removal in Hibernate 7. +- **Prefer modern initialization:** Use the `GeneratorCreationContext` provided by `setCustomIdGeneratorCreator` to perform initialization. If a manual call to `configure` is absolutely necessary for legacy bridge logic, be aware it may trigger warnings or fail in future versions. + ## Challenges & Failures ### 1. Proxy Initialization Behavior @@ -48,6 +54,18 @@ Each new binder should follow this structure: } ``` +#### GrailsSequenceStyleGenerator Implementation +```java +public class GrailsSequenceStyleGenerator extends SequenceStyleGenerator { + public GrailsSequenceStyleGenerator(GeneratorCreationContext context, org.grails.orm.hibernate.cfg.Identity mappedId) { + var generatorProps = Optional.ofNullable(mappedId).map(Identity::getProperties).orElse(new Properties()); + // Use 2-parameter configure from IdentifierGenerator / SequenceStyleGenerator + super.configure(context, generatorProps); + this.registerExportables(context.getDatabase()); + } +} +``` + #### Test Status (`SequenceGeneratorsSpec`) | Generator | Status | Error (if FAILED) | | :--- | :--- | :--- | diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreator.java index 5a64305d04..96ac812532 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/BasicValueIdCreator.java @@ -46,7 +46,7 @@ public class BasicValueIdCreator { private void initializeGeneratorFactories() { generatorFactories.put("identity", (context, mappedId) -> new GrailsIdentityGenerator(context, mappedId)); - BiFunction<GeneratorCreationContext, Identity, Generator> sequenceFactory = (context, mappedId) -> new GrailsSequenceStyleGenerator(context, mappedId); + BiFunction<GeneratorCreationContext, Identity, Generator> sequenceFactory = (context, mappedId) -> new GrailsSequenceStyleGenerator(context, mappedId, jdbcEnvironment); generatorFactories.put("sequence", sequenceFactory); generatorFactories.put("sequence-identity", sequenceFactory); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsSequenceStyleGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsSequenceStyleGenerator.java index 387095b5ca..5281f8b3c4 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsSequenceStyleGenerator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsSequenceStyleGenerator.java @@ -1,17 +1,55 @@ package org.grails.orm.hibernate.cfg.domainbinding; +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.generator.GeneratorCreationContext; import org.hibernate.id.enhanced.SequenceStyleGenerator; +import org.grails.orm.hibernate.cfg.Identity; import java.util.Optional; import java.util.Properties; -import org.grails.orm.hibernate.cfg.Identity; - public class GrailsSequenceStyleGenerator extends SequenceStyleGenerator { - public GrailsSequenceStyleGenerator(GeneratorCreationContext context, org.grails.orm.hibernate.cfg.Identity mappedId) { - var generatorProps = Optional.ofNullable(mappedId).map(Identity::getProperties).orElse(new Properties()); + public GrailsSequenceStyleGenerator(GeneratorCreationContext context, Identity mappedId, JdbcEnvironment jdbcEnvironment) { + Properties generatorProps = Optional.ofNullable(mappedId) + .map(Identity::getProperties) + .orElse(new Properties()); + + generatorProps.putIfAbsent(INCREMENT_PARAM, "50"); + generatorProps.putIfAbsent(OPT_PARAM, "pooled-lo"); + super.configure(context, generatorProps); + + if (jdbcEnvironment != null) { + var database = context.getDatabase(); + this.registerExportables(database); + + var physicalName = database.getDefaultNamespace().getPhysicalName(); + + String catalog = (physicalName.catalog() != null) + ? physicalName.catalog().getCanonicalName() + : null; + + String schema = (physicalName.schema() != null) + ? physicalName.schema().getCanonicalName() + : null; + + if (getDatabaseStructure() != null) { + SqlStringGenerationContext sqlContext = SqlStringGenerationContextImpl.fromExplicit( + jdbcEnvironment, + database, + catalog, + schema + ); + this.initialize(sqlContext); + } + } + } + + @Override + public void initialize(SqlStringGenerationContext context) { + super.initialize(context); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsTableGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsTableGenerator.java index c8703468b6..42cc4ebbb8 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsTableGenerator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsTableGenerator.java @@ -40,6 +40,7 @@ public class GrailsTableGenerator extends TableGenerator { // Fixes the "SQL to format should not be null" error this.configure(context, generatorProps); var database = context.getDatabase(); + this.registerExportables(database); // Get the Name record from the physical name var physicalName = database.getDefaultNamespace().getPhysicalName();
