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 af710591949ff578f9636a31985b713f5c74ae74 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Thu Feb 19 04:48:31 2026 -0600 Move getCompositeIdentity to GrailsHibernatePersistentEntity and rename to getHibernateCompositeIdentity --- .../cfg/GrailsHibernatePersistentEntity.java | 8 ++ .../cfg/GrailsHibernatePersistentProperty.java | 8 -- .../secondpass/DependentKeyValueBinder.java | 8 +- .../cfg/GrailsHibernatePersistentEntitySpec.groovy | 67 +++++++++++++++++ .../hibernate/HibernateToManyPropertySpec.groovy | 86 ---------------------- .../secondpass/DependentKeyValueBinderSpec.groovy | 2 - 6 files changed, 80 insertions(+), 99 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java index 486e946aba..879171bf9d 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntity.java @@ -79,6 +79,14 @@ package org.grails.orm.hibernate.cfg; @Override GrailsHibernatePersistentProperty[] getCompositeIdentity(); + default Optional<CompositeIdentity> getHibernateCompositeIdentity() { + return Optional.ofNullable(getMappedForm()) + .filter(Mapping::hasCompositeIdentifier) + .map(Mapping::getIdentity) + .filter(CompositeIdentity.class::isInstance) + .map(CompositeIdentity.class::cast); + } + default String getDiscriminatorValue() { return Optional.ofNullable(getMappedForm()) .map(Mapping::getDiscriminator) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentProperty.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentProperty.java index 7d2dd5958a..01bac46723 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentProperty.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentProperty.java @@ -23,14 +23,6 @@ import org.grails.orm.hibernate.cfg.Mapping; */ public interface GrailsHibernatePersistentProperty extends PersistentProperty<PropertyConfig> { - default Optional<CompositeIdentity> getCompositeIdentity(Mapping mapping) { - return Optional.ofNullable(mapping) - .filter(m -> m.hasCompositeIdentifier() && supportsJoinColumnMapping()) - .map(Mapping::getIdentity) - .filter(CompositeIdentity.class::isInstance) - .map(CompositeIdentity.class::cast); - } - default boolean isOwningSide() { return this instanceof Association<?> association && association.isOwningSide(); } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinder.java index f2cde159de..d7a79c6a74 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinder.java @@ -2,12 +2,13 @@ package org.grails.orm.hibernate.cfg.domainbinding.secondpass; import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; -import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; import org.hibernate.mapping.DependantValue; +import java.util.Optional; + import static org.grails.orm.hibernate.cfg.GrailsDomainBinder.EMPTY_PATH; /** @@ -25,9 +26,10 @@ public class DependentKeyValueBinder { public void bind(HibernateToManyProperty property, DependantValue key) { GrailsHibernatePersistentEntity refDomainClass = property.getHibernateOwner(); - Mapping mapping = refDomainClass.getMappedForm(); - property.getCompositeIdentity(mapping).ifPresentOrElse(ci -> { + Optional<CompositeIdentity> compositeIdentity = property.supportsJoinColumnMapping() ? refDomainClass.getHibernateCompositeIdentity() : Optional.empty(); + + compositeIdentity.ifPresentOrElse(ci -> { compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(property, key, ci, refDomainClass, EMPTY_PATH); }, () -> { simpleValueBinder.bindSimpleValue(property, null, key, EMPTY_PATH); diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy index 1abecd09b0..fe5d40e1e4 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy @@ -233,6 +233,73 @@ class GrailsHibernatePersistentEntitySpec extends HibernateGormDatastoreSpec { then: result2 == ["'VEHICLE'", "'TRUCK'"] as Set } + + def "test getHibernateCompositeIdentity returns CompositeIdentity when conditions met"() { + given: + def context = getMappingContext() + GrailsHibernatePersistentEntity entity = Spy(HibernatePersistentEntity, constructorArgs: [Person, context]) + def mapping = Mock(Mapping) + def compositeIdentity = new CompositeIdentity() + + entity.getMappedForm() >> mapping + mapping.hasCompositeIdentifier() >> true + mapping.getIdentity() >> compositeIdentity + + when: + Optional<CompositeIdentity> result = entity.getHibernateCompositeIdentity() + + then: + result.isPresent() + result.get() == compositeIdentity + } + + def "test getHibernateCompositeIdentity returns empty when mapping is null"() { + given: + def context = getMappingContext() + GrailsHibernatePersistentEntity entity = Spy(HibernatePersistentEntity, constructorArgs: [Person, context]) + + entity.getMappedForm() >> null + + when: + Optional<CompositeIdentity> result = entity.getHibernateCompositeIdentity() + + then: + !result.isPresent() + } + + def "test getHibernateCompositeIdentity returns empty when mapping has no composite identifier"() { + given: + def context = getMappingContext() + GrailsHibernatePersistentEntity entity = Spy(HibernatePersistentEntity, constructorArgs: [Person, context]) + def mapping = Mock(Mapping) + + entity.getMappedForm() >> mapping + mapping.hasCompositeIdentifier() >> false + + when: + Optional<CompositeIdentity> result = entity.getHibernateCompositeIdentity() + + then: + !result.isPresent() + } + + def "test getHibernateCompositeIdentity returns empty when mapping.getIdentity is not CompositeIdentity"() { + given: + def context = getMappingContext() + GrailsHibernatePersistentEntity entity = Spy(HibernatePersistentEntity, constructorArgs: [Person, context]) + def mapping = Mock(Mapping) + def nonCompositeIdentity = new Identity() + + entity.getMappedForm() >> mapping + mapping.hasCompositeIdentifier() >> true + mapping.getIdentity() >> nonCompositeIdentity + + when: + Optional<CompositeIdentity> result = entity.getHibernateCompositeIdentity() + + then: + !result.isPresent() + } } @Entity diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyPropertySpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyPropertySpec.groovy index f65f76cc68..656be6c97f 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyPropertySpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyPropertySpec.groovy @@ -132,92 +132,6 @@ class HibernateToManyPropertySpec extends HibernateGormDatastoreSpec { then: collection.getWhere() == "item_type in ('A','B')" } - - def "test getCompositeIdentity returns CompositeIdentity when conditions met"() { - given: - def mapping = Mock(Mapping) - // Use the helper to create a concrete instance - def property = createTestHibernateToManyProperty(TestEntityWithMany) // Use TestEntityWithMany for a basic association - def spiedProperty = Spy(property) - spiedProperty.supportsJoinColumnMapping() >> true // Explicitly set for this test scenario - - // Use a real CompositeIdentity instead of a mock - def compositeIdentity = new CompositeIdentity() - mapping.hasCompositeIdentifier() >> true - mapping.getIdentity() >> compositeIdentity - - when: - Optional<CompositeIdentity> result = spiedProperty.getCompositeIdentity(mapping) - - then: - result.isPresent() - result.get() == compositeIdentity - } - - def "test getCompositeIdentity returns empty when mapping is null"() { - given: - def property = createTestHibernateToManyProperty(TestEntityWithMany) // Use a real entity - def spiedProperty = Spy(property) - spiedProperty.supportsJoinColumnMapping() >> true // Explicitly set for this test scenario - - when: - Optional<CompositeIdentity> result = spiedProperty.getCompositeIdentity(null) - - then: - !result.isPresent() - } - - def "test getCompositeIdentity returns empty when mapping has no composite identifier"() { - given: - def mapping = Mock(Mapping) - def property = createTestHibernateToManyProperty(TestEntityWithMany) // Use a real entity - def spiedProperty = Spy(property) - spiedProperty.supportsJoinColumnMapping() >> true // Explicitly set for this test scenario - - mapping.hasCompositeIdentifier() >> false - - when: - Optional<CompositeIdentity> result = spiedProperty.getCompositeIdentity(mapping) - - then: - !result.isPresent() - } - - def "test getCompositeIdentity returns empty when property does not support join column mapping"() { - given: - def mapping = Mock(Mapping) - def property = createTestHibernateToManyProperty(TestEntityWithMany) // Use a real entity - def spiedProperty = Spy(property) - spiedProperty.supportsJoinColumnMapping() >> false // Explicitly set to false for this test scenario - - mapping.hasCompositeIdentifier() >> true - - when: - Optional<CompositeIdentity> result = spiedProperty.getCompositeIdentity(mapping) - - then: - !result.isPresent() - } - - def "test getCompositeIdentity returns empty when mapping.getIdentity is not CompositeIdentity"() { - given: - def mapping = Mock(Mapping) - def property = createTestHibernateToManyProperty(TestEntityWithMany) // Use a real entity - def spiedProperty = Spy(property) - spiedProperty.supportsJoinColumnMapping() >> true // Explicitly set to true for this test scenario - - // Use a real Identity instead of a mock or a plain Object - def nonCompositeIdentity = new Identity() - - mapping.hasCompositeIdentifier() >> true - mapping.getIdentity() >> nonCompositeIdentity - - when: - Optional<CompositeIdentity> result = spiedProperty.getCompositeIdentity(mapping) - - then: - !result.isPresent() - } } @Entity diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinderSpec.groovy index e580574c2c..c11b0231bd 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/DependentKeyValueBinderSpec.groovy @@ -5,7 +5,6 @@ import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.orm.hibernate.cfg.CompositeIdentity import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty -import org.grails.orm.hibernate.cfg.Mapping import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder import org.hibernate.mapping.DependantValue @@ -31,7 +30,6 @@ class DependentKeyValueBinderSpec extends HibernateGormDatastoreSpec { given: HibernateToManyProperty property = createTestProperty(TestEntityWithMany) GrailsHibernatePersistentEntity owner = (GrailsHibernatePersistentEntity) property.getOwner() - Mapping mapping = owner.getMappedForm() DependantValue key = Mock(DependantValue) when:
