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 25947ed1b3fb91a2a64c62dad57c8f402e3d1f86 Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Wed Jan 21 09:43:50 2026 -0600 update progress --- grails-data-hibernate7/core/HIBERNATE7-TESTS.csv | 26 +++++- .../orm/hibernate/cfg/GrailsDomainBinder.java | 2 +- .../cfg/domainbinding/BasicValueIdCreator.java | 18 ++--- .../cfg/domainbinding/SimpleIdBinder.java | 2 +- .../cfg/domainbinding/SimpleIdBinderSpec.groovy | 93 +++++++++------------- 5 files changed, 71 insertions(+), 70 deletions(-) diff --git a/grails-data-hibernate7/core/HIBERNATE7-TESTS.csv b/grails-data-hibernate7/core/HIBERNATE7-TESTS.csv index fda03c5381..f64afb475c 100644 --- a/grails-data-hibernate7/core/HIBERNATE7-TESTS.csv +++ b/grails-data-hibernate7/core/HIBERNATE7-TESTS.csv @@ -1,4 +1,22 @@ - Test File , Status , Notes -`src/test/groovy/grails/gorm/specs/dirtychecking/HibernateDirtyCheckingSpec.groovy` , FAILED , PropertyAccessException resolved. Now failing on MissingMethodException for hasChanged(). -`src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SequenceGeneratorsSpec.groovy` , FAILED , increment generator needs explicit initialize(SqlStringGenerationContext) call. -`src/test/groovy/grails/gorm/specs/SubqueryAliasSpec.groovy` , SKIPPED , +Test File , Status , Notes +`src/test/groovy/grails/gorm/specs/ManyToOneSpec.groovy` , FAILED , +`src/test/groovy/grails/gorm/specs/UniqueWithMultipleDataSourcesSpec.groovy` , FAILED , +`src/test/groovy/grails/gorm/specs/dirtychecking/HibernateDirtyCheckingSpec.groovy` , FAILED , +`src/test/groovy/grails/gorm/specs/perf/JoinPerfSpec.groovy` , FAILED , +`src/test/groovy/grails/gorm/specs/uuid/UuidInsertSpec.groovy` , FAILED , +`src/test/groovy/grails/gorm/specs/validation/SaveWithInvalidEntitySpec.groovy` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.AttachMethodSpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.DirtyCheckingSpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.GroovyProxySpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.QueryEventsSpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.SessionCreationEventSpec` , FAILED , +`TCK: org.apache.grails.data.testing.tck.tests.UpdateWithProxyPresentSpec` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/HibernateGormInstanceApiSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/HibernateGormStaticApiSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SequenceGeneratorsSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/connections/MultipleDataSourceConnectionsSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/connections/MultipleDataSourcesWithCachingSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/connections/MultipleDataSourcesWithEventsSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/connections/SchemaMultiTenantSpec.groovy` , FAILED , +`src/test/groovy/org/grails/orm/hibernate/connections/SingleTenantSpec.groovy` , FAILED , \ No newline at end of file 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 3445652a2c..23e5b07c8e 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 @@ -2010,7 +2010,7 @@ public class GrailsDomainBinder private void bindSimpleId(PersistentProperty identifier, RootClass entity, InFlightMetadataCollector mappings, Identity mappedId, String sessionFactoryBeanName, HibernatePersistentEntity domainClass) { SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext,namingStrategy, getJdbcEnvironment(), domainClass); - simpleIdBinder.bindSimpleId(identifier, entity, mappedId, getJdbcEnvironment()); + simpleIdBinder.bindSimpleId(identifier, entity, mappedId); } 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 50df2d6257..aa5415ce01 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 @@ -3,7 +3,6 @@ package org.grails.orm.hibernate.cfg.domainbinding; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.Properties; import java.util.function.BiFunction; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -11,9 +10,7 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.generator.Assigned; import org.hibernate.generator.Generator; import org.hibernate.generator.GeneratorCreationContext; -import org.hibernate.id.IncrementGenerator; import org.hibernate.id.enhanced.SequenceStyleGenerator; -import org.hibernate.id.enhanced.TableGenerator; import org.hibernate.id.uuid.UuidGenerator; import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.RootClass; @@ -24,26 +21,29 @@ import org.grails.orm.hibernate.cfg.Identity; public class BasicValueIdCreator { private final MetadataBuildingContext metadataBuildingContext; - private JdbcEnvironment jdbcEnvironment; + private final JdbcEnvironment jdbcEnvironment; private HibernatePersistentEntity domainClass; private final Map<String, BiFunction<GeneratorCreationContext, Identity, Generator>> generatorFactories; + @SuppressWarnings("unused") // kept for tests that want to provide a prototype BasicValue + private final BasicValue id; public BasicValueIdCreator(MetadataBuildingContext metadataBuildingContext, JdbcEnvironment jdbcEnvironment, HibernatePersistentEntity domainClass) { - this.metadataBuildingContext = metadataBuildingContext; - this.jdbcEnvironment = jdbcEnvironment; - this.generatorFactories = new HashMap<>(); + // create a prototype BasicValue (table will be set per-entity when creating the actual BasicValue) + this(metadataBuildingContext, jdbcEnvironment, new BasicValue(metadataBuildingContext, null), new HashMap<>()); this.domainClass = domainClass; initializeGeneratorFactories(); } protected BasicValueIdCreator(MetadataBuildingContext metadataBuildingContext , JdbcEnvironment jdbcEnvironment + , BasicValue prototypeBasicValue , Map<String, BiFunction<GeneratorCreationContext , Identity , Generator>> generatorFactories) { this.metadataBuildingContext = metadataBuildingContext; this.generatorFactories = generatorFactories; - this.jdbcEnvironment =jdbcEnvironment; + this.jdbcEnvironment = jdbcEnvironment; + this.id = prototypeBasicValue; } private void initializeGeneratorFactories() { @@ -63,7 +63,7 @@ public class BasicValueIdCreator { } public BasicValue getBasicValueId(RootClass entity, Identity mappedId, boolean useSequence) { - BasicValue id = new BasicValue(metadataBuildingContext, entity.getTable()); + // create a BasicValue for the specific entity table (do not reuse the prototype directly because table differs) String generatorName = determineGeneratorName(mappedId, useSequence); final String entityName = entity.getEntityName(); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java index 4a1f8b5620..17b3b26b4b 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java @@ -37,7 +37,7 @@ public class SimpleIdBinder { } - public void bindSimpleId(PersistentProperty identifier, RootClass entity, Identity mappedId, JdbcEnvironment jdbcEnvironment) { + public void bindSimpleId(PersistentProperty identifier, RootClass entity, Identity mappedId) { boolean useSequence = hibernateEntityWrapper.getMappedForm(identifier.getOwner()).isTablePerConcreteClass(); // create the id value diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy index b9029822ea..4aa66fc48b 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy @@ -1,114 +1,97 @@ package org.grails.orm.hibernate.cfg.domainbinding -import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec -import grails.persistence.Entity +import org.grails.datastore.mapping.model.PersistentProperty +import org.grails.datastore.mapping.model.PersistentEntity import org.grails.orm.hibernate.cfg.Identity -import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.hibernate.boot.spi.MetadataBuildingContext +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment import org.hibernate.mapping.BasicValue +import org.hibernate.mapping.PrimaryKey import org.hibernate.mapping.RootClass import org.hibernate.mapping.Table -import spock.lang.Issue +import spock.lang.Unroll class SimpleIdBinderSpec extends HibernateGormDatastoreSpec { - def metadataBuildingContext - def namingStrategy + MetadataBuildingContext metadataBuildingContext + JdbcEnvironment jdbcEnvironment def hibernateEntityWrapper def simpleValueBinder def propertyBinder - def basicValueIdCreator + def basicValueIdcreator - def simpleIdBinder // Subject under test + def simpleIdBinder def setup() { metadataBuildingContext = getGrailsDomainBinder().getMetadataBuildingContext() - namingStrategy = Mock(PersistentEntityNamingStrategy) + jdbcEnvironment = getGrailsDomainBinder().getJdbcEnvironment() + + // Use a Mock for BasicValueIdCreator and return a BasicValue based on the RootClass table + basicValueIdcreator = Mock(BasicValueIdCreator) + basicValueIdcreator.getBasicValueId(*_) >> { RootClass rc, Identity id, boolean useSeq -> + new BasicValue(metadataBuildingContext, rc.getTable()) + } + + // Mock the collaborators that can be safely mocked hibernateEntityWrapper = Mock(HibernateEntityWrapper) simpleValueBinder = Mock(SimpleValueBinder) propertyBinder = Mock(PropertyBinder) - // Use real BasicValueIdCreator instead of Mock to avoid issues - basicValueIdCreator = new BasicValueIdCreator(metadataBuildingContext) - simpleIdBinder = new SimpleIdBinder(basicValueIdCreator, hibernateEntityWrapper, simpleValueBinder, propertyBinder) + simpleIdBinder = new SimpleIdBinder(basicValueIdcreator, hibernateEntityWrapper, simpleValueBinder, propertyBinder) } - - def "test bindSimpleId method with identity generator"() { + def "bindSimpleId with identity generator"() { given: - def testEntity = createPersistentEntity(TestEntityId) - assert testEntity != null + def testProperty = Mock(PersistentProperty) { + getName() >> "id" + getOwner() >> Mock(PersistentEntity) + } def rootClass = new RootClass(metadataBuildingContext) def table = new Table("TEST_TABLE") rootClass.setTable(table) - def mappedId = new Identity(generator: "identity") - def testProperty = testEntity.getIdentity() - - // Stubbing interactions hibernateEntityWrapper.getMappedForm(_) >> Mock(org.grails.orm.hibernate.cfg.Mapping) { isTablePerConcreteClass() >> false } when: - simpleIdBinder.bindSimpleId(testProperty, rootClass, mappedId) + simpleIdBinder.bindSimpleId(testProperty, rootClass, new Identity(generator: 'identity')) then: - 1 * simpleValueBinder.bindSimpleValue(testProperty, null, _, '') + 1 * simpleValueBinder.bindSimpleValue(testProperty, null, _, "") 1 * propertyBinder.bindProperty(testProperty, _) - + rootClass.identifier instanceof BasicValue rootClass.declaredIdentifierProperty != null rootClass.identifierProperty != null - rootClass.table.primaryKey != null + rootClass.table.primaryKey instanceof PrimaryKey } - def "test bindSimpleId method with sequence generator"() { + def "bindSimpleId with sequence generator"() { given: - def testEntity = createPersistentEntity(TestEntitySeq) - assert testEntity != null + def testProperty = Mock(PersistentProperty) { + getName() >> "id" + getOwner() >> Mock(PersistentEntity) + } def rootClass = new RootClass(metadataBuildingContext) def table = new Table("TEST_TABLE") rootClass.setTable(table) - def mappedId = new Identity(generator: "sequence", params: [sequence: "SEQ_TEST"]) - def testProperty = testEntity.getIdentity() - - // Stubbing interactions hibernateEntityWrapper.getMappedForm(_) >> Mock(org.grails.orm.hibernate.cfg.Mapping) { isTablePerConcreteClass() >> true } when: - simpleIdBinder.bindSimpleId(testProperty, rootClass, mappedId) + simpleIdBinder.bindSimpleId(testProperty, rootClass, new Identity(generator: 'sequence', params: [sequence: 'SEQ_TEST'])) then: - 1 * simpleValueBinder.bindSimpleValue(testProperty, null, _, '') + 1 * simpleValueBinder.bindSimpleValue(testProperty, null, _, "") 1 * propertyBinder.bindProperty(testProperty, _) - + rootClass.identifier instanceof BasicValue rootClass.declaredIdentifierProperty != null rootClass.identifierProperty != null - rootClass.table.primaryKey != null - } -} - -// Helper domain classes -@Entity -class TestEntityId { - Long id - String name - static mapping = { - id generator: 'identity' - } -} - -@Entity -class TestEntitySeq { - Long id - String name - static mapping = { - id generator: 'sequence', params: [sequence: 'SEQ_TEST'] + rootClass.table.primaryKey instanceof PrimaryKey } -} +} \ No newline at end of file
