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() {
