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 28448e5f5495ddd779e668bd654497a1870aa76b Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Sat Jan 17 18:10:55 2026 -0600 update progress --- .../orm/hibernate/cfg/HibernateMappingContext.java | 5 +- .../org/grails/orm/hibernate/cfg/Identity.groovy | 8 ++ .../cfg/domainbinding/BasicValueIdCreator.java | 2 +- .../cfg/domainbinding/GrailsIdentityGenerator.java | 10 +- .../GrailsSequenceStyleGenerator.java | 22 +-- .../CompositeIdWithManyToOneAndSequenceSpec.groovy | 2 +- .../domainbinding/SequenceGeneratorsSpec.groovy | 150 +++++++++++++++++++++ 7 files changed, 177 insertions(+), 22 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index 99da87af2a..5e6727b4fd 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -260,7 +260,10 @@ public class HibernateMappingContext extends AbstractMappingContext { try { resolvedGenerator = ValueGenerator.valueOf(generatorName.toUpperCase(java.util.Locale.ENGLISH)); } catch (IllegalArgumentException e) { - if(ClassUtils.isPresent(generatorName)) { + if(generatorName.equalsIgnoreCase("table")) { + resolvedGenerator = ValueGenerator.CUSTOM; + } + else if(ClassUtils.isPresent(generatorName)) { resolvedGenerator = ValueGenerator.CUSTOM; } else { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy index ed37842ed3..93483033a0 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy @@ -105,4 +105,12 @@ class Identity extends Property { config.call() return property } + + Properties getProperties() { + new Properties().tap { + getParams()?.each { k, v -> + setProperty(k.toString(), v.toString()) + } + } + } } 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 93ea18b5f9..9a8516f9eb 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 @@ -35,7 +35,7 @@ public class BasicValueIdCreator { } private void initializeGeneratorFactories() { - generatorFactories.put("identity", (context, mappedId) -> new GrailsIdentityGenerator(context)); + generatorFactories.put("identity", (context, mappedId) -> new GrailsIdentityGenerator(context, mappedId)); BiFunction<GeneratorCreationContext, Identity, Generator> sequenceFactory = (context, mappedId) -> new GrailsSequenceStyleGenerator(context, mappedId); generatorFactories.put("sequence", sequenceFactory); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsIdentityGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsIdentityGenerator.java index 88a3cd641a..4092beb072 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsIdentityGenerator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsIdentityGenerator.java @@ -3,10 +3,16 @@ package org.grails.orm.hibernate.cfg.domainbinding; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.IdentityGenerator; +import java.util.Optional; +import java.util.Properties; + +import org.grails.orm.hibernate.cfg.Identity; + public class GrailsIdentityGenerator extends IdentityGenerator { - public GrailsIdentityGenerator(GeneratorCreationContext context) { - super(); + public GrailsIdentityGenerator(GeneratorCreationContext context, org.grails.orm.hibernate.cfg.Identity mappedId) { + var generatorProps = Optional.ofNullable(mappedId).map(Identity::getProperties).orElse(new Properties()); + super.configure(context, generatorProps); context.getProperty().getValue().getColumns().get(0).setIdentity(true); } } 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 881ce152a6..387095b5ca 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,29 +1,17 @@ package org.grails.orm.hibernate.cfg.domainbinding; -import org.hibernate.MappingException; -import org.hibernate.boot.model.relational.Database; -import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.enhanced.SequenceStyleGenerator; -import org.hibernate.service.ServiceRegistry; -import org.hibernate.type.Type; -import java.util.Map; +import java.util.Optional; import java.util.Properties; -import java.util.Set; + +import org.grails.orm.hibernate.cfg.Identity; public class GrailsSequenceStyleGenerator extends SequenceStyleGenerator { public GrailsSequenceStyleGenerator(GeneratorCreationContext context, org.grails.orm.hibernate.cfg.Identity mappedId) { - // Call super's no-arg constructor first - super(); - Properties generatorProps = new Properties(); - if (mappedId != null && mappedId.getParams() != null) { - for (Map.Entry entry : (Set<Map.Entry>) mappedId.getParams().entrySet()) { - generatorProps.setProperty(entry.getKey().toString(), entry.getValue().toString()); - } - } - super.configure(context,generatorProps); + var generatorProps = Optional.ofNullable(mappedId).map(Identity::getProperties).orElse(new Properties()); + super.configure(context, generatorProps); } } diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/CompositeIdWithManyToOneAndSequenceSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/CompositeIdWithManyToOneAndSequenceSpec.groovy index e7aa38c387..b1ac93eb34 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/CompositeIdWithManyToOneAndSequenceSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/CompositeIdWithManyToOneAndSequenceSpec.groovy @@ -68,7 +68,7 @@ class Tooth { static mapping = { table name: 'AK_TOOTH' - id generator: 'sequence', params: [sequence: 'SEQ_AK_TOOTH'] + id generator: 'native', params: [sequence_name: 'SEQ_AK_TOOTH'] } } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SequenceGeneratorsSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SequenceGeneratorsSpec.groovy new file mode 100644 index 0000000000..6e781b96e5 --- /dev/null +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SequenceGeneratorsSpec.groovy @@ -0,0 +1,150 @@ +package org.grails.orm.hibernate.cfg.domainbinding + +import grails.gorm.annotation.Entity +import grails.gorm.specs.HibernateGormDatastoreSpec +import grails.gorm.transactions.Rollback +import spock.lang.Unroll + +class SequenceGeneratorsSpec extends HibernateGormDatastoreSpec { + + void setupSpec() { + manager.addAllDomainClasses([EntityWithIdentity, + EntityWithNative, + EntityWithSequence, + EntityWithTable, + EntityWithUUID, + EntityWithAssigned, + EntityWithIncrement]) + } + + + @Rollback + void "test identity generator"() { + when: + def entity = new EntityWithIdentity(name: "test").save(flush: true) + + then: + entity.id != null + } + + @Rollback + void "test native generator"() { + when: + def entity = new EntityWithNative(name: "test").save(flush: true) + + then: + entity.id != null + } + + @Rollback + void "test sequence generator"() { + when: + def entity = new EntityWithSequence(name: "test").save(flush: true) + + then: + entity.id != null + } + + @Rollback + void "test table generator"() { + when: + def entity = new EntityWithTable(name: "test").save(flush: true) + + then: + entity.id != null + } + + @Rollback + void "test uuid generator"() { + when: + def entity = new EntityWithUUID(name: "test").save(flush: true) + + then: + entity.id != null + entity.id instanceof String + } + + @Rollback + void "test assigned generator"() { + when: + def entity = new EntityWithAssigned(id: 123, name: "test").save(flush: true) + + then: + entity.id == 123 + } + + @Rollback + void "test increment generator"() { + when: + def entity1 = new EntityWithIncrement(name: "test1").save(flush: true) + def entity2 = new EntityWithIncrement(name: "test2").save(flush: true) + + then: + entity1.id != null + entity2.id != null + entity2.id > entity1.id + } +} + +@Entity +class EntityWithIdentity { + Long id + String name + static mapping = { + id generator: 'identity' + } +} + +@Entity +class EntityWithNative { + Long id + String name + static mapping = { + id generator: 'native' + } +} + +@Entity +class EntityWithSequence { + Long id + String name + static mapping = { + id generator: 'sequence', params: [sequence_name: 'seq_test'] + } +} + +@Entity +class EntityWithTable { + Long id + String name + static mapping = { + id generator: 'table' + } +} + +@Entity +class EntityWithUUID { + String id + String name + static mapping = { + id generator: 'uuid' + } +} + +@Entity +class EntityWithAssigned { + Long id + String name + static mapping = { + id generator: 'assigned' + } +} + +@Entity +class EntityWithIncrement { + Long id + String name + static mapping = { + id generator: 'increment' + } +}
