This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch 8.0.x-hibernate6
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 7354d3bfdbee4b2e04c084d62adbb59a95817b44
Author: Walter B Duque de Estrada <[email protected]>
AuthorDate: Mon Dec 15 22:30:56 2025 -0600

    Workaround creating assigned ids when not created.
---
 .../orm/hibernate/HibernateGormInstanceApi.groovy  | 75 ++++++++--------------
 .../orm/hibernate/cfg/GrailsDomainBinder.java      | 23 +++----
 .../gorm/specs/HibernateGormDatastoreSpec.groovy   |  6 +-
 .../specs/hibernatequery/HibernateQuerySpec.groovy |  4 ++
 4 files changed, 47 insertions(+), 61 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
index c658d05033..94809186d1 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
@@ -18,10 +18,8 @@ package org.grails.orm.hibernate
 import org.codehaus.groovy.runtime.InvokerHelper
 
 import org.hibernate.engine.spi.SessionFactoryImplementor
-import org.hibernate.engine.spi.SharedSessionContractImplementor
+import org.hibernate.generator.Assigned
 import org.hibernate.generator.Generator
-import org.hibernate.id.CompositeNestedGeneratedValueGenerator
-import org.hibernate.id.IdentifierGenerationException
 
 import grails.gorm.validation.CascadingValidator
 import groovy.transform.CompileDynamic
@@ -30,6 +28,7 @@ import jakarta.persistence.FlushModeType
 import org.grails.datastore.gorm.GormInstanceApi
 import org.grails.datastore.gorm.GormValidateable
 import org.grails.datastore.mapping.core.Datastore
+import org.grails.datastore.mapping.engine.event.PersistEvent
 import org.grails.datastore.mapping.model.config.GormProperties
 import org.grails.datastore.mapping.model.types.Embedded
 import org.grails.datastore.mapping.reflect.ClassUtils
@@ -154,48 +153,17 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         try {
 
             Serializable idVal = (Serializable) 
InvokerHelper.getProperty(target, "id")
-
-            boolean hasInsert = shouldInsert(arguments)
-            boolean hasMerge = shouldMerge(arguments)
-
-
-            def isNotInDb = !isItInDb(target, idVal)
-            def shouldInsert = !hasMerge && isNotInDb
-            println ("hasInsert " + hasInsert)
-            println ("hasMerge " + hasMerge)
-            println("isNotInDb " + isNotInDb)
-            println("shouldInsert " + shouldInsert)
-            if (hasInsert || shouldInsert) {
-                if (!idVal){
-                    EntityPersister persister = ((SessionFactoryImplementor) 
sessionFactory)
-                            .getMappingMetamodel()
-                            .getEntityDescriptor(domainClass.getName())
-                    final Generator generator = persister.getGenerator();
-
-                    def doesNotGenerateOnInsert = 
!generator.generatesOnInsert()
-                    def isCompositeGenerator = generator instanceof 
CompositeNestedGeneratedValueGenerator
-                    println("doesNotGenerateOnInsert " + 
doesNotGenerateOnInsert)
-                    println("isCompositeGenerator " + isCompositeGenerator)
-                    if ( doesNotGenerateOnInsert || isCompositeGenerator)  {
-                        idVal = (Serializable) persister.getIdentifier(target, 
(SharedSessionContractImplementor) sessionFactory.currentSession)
-                        if ( idVal == null ) {
-                            throw new IdentifierGenerationException( 
"Identifier of entity '" + persister.getEntityName()
-                                    + "' must be manually assigned before 
calling 'persist()'" );
-
-                        }
-                        println("idVal " + idVal)
-                        InvokerHelper.setProperty(target, "id", idVal)
-                    }
-
+            if (!idVal) {
+                if (isAssignedId(persistentEntity)) {
+                    def id = nextId()
+                    InvokerHelper.setProperty(target, "id", id)
+                    return performPersist(target, shouldFlush)
+                } else {
+                    return performPersist(target, shouldFlush)
                 }
-
+            } else if (shouldInsert(arguments)) {
                 return performPersist(target, shouldFlush)
-            } else {
-                if ( idVal == null ) {
-                    throw new IdentifierGenerationException( "Identifier of 
entity '" + persistentEntity.getName()
-                            + "' must be manually assigned before calling 
'merge()'" );
-
-                }
+            } else  {
                 return performMerge(target, shouldFlush)
             }
         } finally {
@@ -203,10 +171,18 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         }
     }
 
-    private boolean isItInDb(D target,Serializable idVal) {
-        String hql = "select count(e.id) from ${persistentEntity.name} e where 
e.id = :id"
+    private boolean isAssignedId(PersistentEntity entity) {
+        return ((SessionFactoryImplementor) sessionFactory)
+                .getMappingMetamodel()
+                .getEntityDescriptor(entity.getName())
+                .getGenerator() instanceof Assigned
+    }
+
+
+    private Long nextId() {
+        String hql = "select max(e.id) from ${persistentEntity.name} e"
 
-        def result = HibernateHqlQuery.createHqlQuery(
+        def result = (Long) HibernateHqlQuery.createHqlQuery(
                 (HibernateDatastore) datastore,
                 sessionFactory,
                 persistentEntity,
@@ -214,10 +190,11 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
                 false,
                 false,
                 null,
-                ["id": idVal]
+                null
                 , null
-                , (GrailsHibernateTemplate) hibernateTemplate).singleResult()
-        return result == 1
+                , (GrailsHibernateTemplate) hibernateTemplate).singleResult() 
?: 0
+        Random random = new Random()
+        return result + random.nextInt(100) + 1
     }
 
     @CompileDynamic
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 8c2b70fb0f..e41962e4a4 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
@@ -1565,10 +1565,10 @@ public class GrailsDomainBinder
                                                        RootClass root, 
InFlightMetadataCollector mappings, String sessionFactoryBeanName) {
 
         // get the schema and catalog names from the configuration
-        Mapping m = new HibernateEntityWrapper().getMappedForm(domainClass);
+        Mapping gormMapping = new 
HibernateEntityWrapper().getMappedForm(domainClass);
 
-        configureDerivedProperties(domainClass, m);
-        CacheConfig cc = m.getCache();
+        configureDerivedProperties(domainClass, gormMapping);
+        CacheConfig cc = gormMapping.getCache();
         if (cc != null && cc.getEnabled()) {
             root.setCacheConcurrencyStrategy(cc.getUsage());
             root.setCached(true);
@@ -1577,21 +1577,21 @@ public class GrailsDomainBinder
             }
             
root.setLazyPropertiesCacheable(!"non-lazy".equals(cc.getInclude()));
         }
-        root.setBatchSize(ofNullable(m.getBatchSize()).orElse(0));
-        root.setDynamicUpdate(m.getDynamicUpdate());
-        root.setDynamicInsert(m.getDynamicInsert());
+        root.setBatchSize(ofNullable(gormMapping.getBatchSize()).orElse(0));
+        root.setDynamicUpdate(gormMapping.getDynamicUpdate());
+        root.setDynamicInsert(gormMapping.getDynamicInsert());
 
 
-        var schema = ofNullable(m.getTable())
+        var schema = ofNullable(gormMapping.getTable())
                 .map(org.grails.orm.hibernate.cfg.Table::getSchema)
                 .orElse(new NamespaceNameExtractor().getSchemaName(mappings));
 
-        var catalog = ofNullable(m.getTable())
+        var catalog = ofNullable(gormMapping.getTable())
                 .map(org.grails.orm.hibernate.cfg.Table::getCatalog)
                 .orElse(new NamespaceNameExtractor().getCatalogName(mappings));
 
 
-        var isAbstract = !m.getTablePerHierarchy() && 
m.isTablePerConcreteClass() && root.isAbstract();
+        var isAbstract = !gormMapping.getTablePerHierarchy() && 
gormMapping.isTablePerConcreteClass() && root.isAbstract();
         // create the table
         var table = mappings.addTable(schema
                 , catalog
@@ -1604,7 +1604,7 @@ public class GrailsDomainBinder
         if (LOG.isDebugEnabled()) {
             LOG.debug("[GrailsDomainBinder] Mapping Grails domain class: " + 
domainClass.getName() + " -> " + root.getTable().getName());
         }
-        bindIdentity(domainClass, root, mappings, m, sessionFactoryBeanName);
+        bindIdentity(domainClass, root, mappings, gormMapping, 
sessionFactoryBeanName);
         bindVersion(domainClass.getVersion(), root, mappings, 
sessionFactoryBeanName);
         root.createPrimaryKey();
         createClassProperties(domainClass, root, mappings, 
sessionFactoryBeanName);
@@ -2063,7 +2063,8 @@ public class GrailsDomainBinder
         entity.setIdentifier(id);
 
         if (mappedId == null) {
-
+//            id.se
+//            id.setIdentifierGeneratorStrategy(useSequence ? 
"sequence-identity" : "native");
         } else {
             params.putAll(mappedId.getParams());
             if(params.containsKey(SEQUENCE_KEY)) {
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy
index ab0dd36c3d..83580761e2 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/HibernateGormDatastoreSpec.groovy
@@ -111,10 +111,14 @@ class HibernateGormDatastoreSpec extends 
GrailsDataTckSpec<GrailsDataHibernate7T
     }
 
     protected ServiceRegistryImplementor getServiceRegistry() {
-        (manager.hibernateDatastore.sessionFactory as SessionFactoryImpl)
+        getSessionFactory()
                 .getServiceRegistry()
     }
 
+    protected SessionFactoryImpl getSessionFactory() {
+        manager.hibernateDatastore.sessionFactory as SessionFactoryImpl
+    }
+
     protected HibernateDatastore getDatastore() {
         manager.hibernateDatastore
     }
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/HibernateQuerySpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/HibernateQuerySpec.groovy
index a0290d07ae..139dd564d2 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/HibernateQuerySpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/HibernateQuerySpec.groovy
@@ -8,6 +8,7 @@ import jakarta.persistence.criteria.Path
 import jakarta.persistence.criteria.Root
 import jakarta.persistence.criteria.Subquery
 import org.apache.grails.data.testing.tck.domains.*
+import org.grails.datastore.mapping.engine.event.PersistEvent
 import org.grails.datastore.mapping.query.Query
 import org.grails.orm.hibernate.AbstractHibernateSession
 import org.grails.orm.hibernate.HibernateDatastore
@@ -27,12 +28,15 @@ class HibernateQuerySpec extends HibernateGormDatastoreSpec 
{
 
     def setup() {
 
+        def persister = 
sessionFactory.getMappingMetamodel().getEntityDescriptor(Person)
+        println "Person ID generator: ${persister.getGenerator().class.name}"
         HibernateDatastore hibernateDatastore = manager.hibernateDatastore
         AbstractHibernateSession session = hibernateDatastore.connect() as 
AbstractHibernateSession
         hibernateQuery = new HibernateQuery(session, 
hibernateDatastore.getMappingContext().getPersistentEntity(Person.typeName))
         petHibernateQuery = new HibernateQuery(session, 
hibernateDatastore.getMappingContext().getPersistentEntity(Pet.typeName))
         eagerHibernateQuery = new HibernateQuery(session, 
hibernateDatastore.getMappingContext().getPersistentEntity(EagerOwner.typeName))
         oldBob = new Person(firstName: "Bob", lastName: "Builder", age: 
50).save(flush: true)
+
     }
 
     def setupSpec() {

Reply via email to