You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/01/21 02:11:46 UTC

(grails-core) 20/25: update progress

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 <bo...@users.noreply.github.com>
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();