This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 9153fed8ad837c89ff611eaf52f5676070bb7572 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Mar 2 13:42:34 2026 -0600 refactor: replace isCompositeIdentifier with Optional<CompositeIdentity> in ManyToOneBinder --- .../binder/ForeignKeyOneToOneBinder.java | 6 ++-- .../cfg/domainbinding/binder/ManyToOneBinder.java | 38 +++++++++------------- .../ForeignKeyOneToOneBinderSpec.groovy | 3 ++ .../cfg/domainbinding/ManyToOneBinderSpec.groovy | 5 ++- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ForeignKeyOneToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ForeignKeyOneToOneBinder.java index ef45844a18..5e1163f6ba 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ForeignKeyOneToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ForeignKeyOneToOneBinder.java @@ -51,10 +51,8 @@ public class ForeignKeyOneToOneBinder { public ManyToOne bind( HibernateOneToOneProperty property, org.hibernate.mapping.Table table, String path) { GrailsHibernatePersistentEntity refDomainClass = property.getHibernateAssociatedEntity(); - boolean isComposite = ManyToOneBinder.isCompositeIdentifier(refDomainClass); - ManyToOne manyToOne = - manyToOneBinder.doBind(property, refDomainClass, isComposite, table, path); - if (!isComposite) { + ManyToOne manyToOne = manyToOneBinder.doBind(property, refDomainClass, table, path); + if (refDomainClass.getHibernateCompositeIdentity().isEmpty()) { bindUniqueKey(property, manyToOne); } return manyToOne; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java index 7e256ff33f..ab3dbba1b5 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java @@ -20,12 +20,12 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import static org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder.FOREIGN_KEY_SUFFIX; +import java.util.Optional; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.JoinTable; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; -import org.grails.orm.hibernate.cfg.PropertyConfig; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateAssociation; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; @@ -72,57 +72,49 @@ public class ManyToOneBinder { /** Binds a many-to-one association. */ public ManyToOne bindManyToOne( HibernateManyToOneProperty property, org.hibernate.mapping.Table table, String path) { - GrailsHibernatePersistentEntity refDomainClass = property.getHibernateAssociatedEntity(); - return doBind(property, refDomainClass, isCompositeIdentifier(refDomainClass), table, path); + return doBind(property, property.getHibernateAssociatedEntity(), table, path); } /** Binds the inverse side of a many-to-many association as a collection element. */ public ManyToOne bindManyToOne( HibernateManyToManyProperty property, org.hibernate.mapping.Table table, String path) { GrailsHibernatePersistentEntity refDomainClass = property.getHibernateOwner(); - boolean isComposite = isCompositeIdentifier(refDomainClass); - if (!isComposite && property.isCircular()) { - prepareCircularManyToMany(property, refDomainClass.getMappedForm()); + Optional<CompositeIdentity> compositeId = refDomainClass.getHibernateCompositeIdentity(); + if (compositeId.isEmpty() && property.isCircular()) { + prepareCircularManyToMany(property); } - return doBind(property, refDomainClass, isComposite, table, path); - } - - static boolean isCompositeIdentifier(GrailsHibernatePersistentEntity entity) { - Mapping mapping = entity.getMappedForm(); - return mapping != null && mapping.hasCompositeIdentifier(); + return doBind(property, refDomainClass, table, path); } ManyToOne doBind( HibernateAssociation property, GrailsHibernatePersistentEntity refDomainClass, - boolean isComposite, org.hibernate.mapping.Table table, String path) { ManyToOne manyToOne = new ManyToOne(metadataBuildingContext, table); manyToOneValuesBinder.bindManyToOneValues(property, manyToOne); - if (isComposite) { - Mapping mapping = refDomainClass.getMappedForm(); - CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); + Optional<CompositeIdentity> compositeId = refDomainClass.getHibernateCompositeIdentity(); + if (compositeId.isPresent()) { compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne( - property, manyToOne, ci, refDomainClass, path); + property, manyToOne, compositeId.get(), refDomainClass, path); } else { simpleValueBinder.bindSimpleValue(property, null, manyToOne, path); } return manyToOne; } - private void prepareCircularManyToMany(HibernateManyToManyProperty property, Mapping mapping) { - PropertyConfig pc = property.getMappedForm(); - if (mapping != null && pc.getColumns().isEmpty()) { - mapping.getColumns().put(property.getName(), pc); + private void prepareCircularManyToMany(HibernateManyToManyProperty property) { + Mapping ownerMapping = property.getHibernateOwner().getMappedForm(); + if (ownerMapping != null && !ownerMapping.getColumns().containsKey(property.getName())) { + ownerMapping.getColumns().put(property.getName(), property.getMappedForm()); } - if (!pc.hasJoinKeyMapping()) { + if (!property.getMappedForm().hasJoinKeyMapping()) { JoinTable jt = new JoinTable(); ColumnConfig columnConfig = new ColumnConfig(); columnConfig.setName( namingStrategy.resolveColumnName(property.getName()) + FOREIGN_KEY_SUFFIX); jt.setKey(columnConfig); - pc.setJoinTable(jt); + property.getMappedForm().setJoinTable(jt); } } } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ForeignKeyOneToOneBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ForeignKeyOneToOneBinderSpec.groovy index bfcadc3367..c016a3e22c 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ForeignKeyOneToOneBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ForeignKeyOneToOneBinderSpec.groovy @@ -22,6 +22,7 @@ import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentEntity import org.grails.orm.hibernate.cfg.Mapping +import java.util.Optional import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.PropertyConfig import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity @@ -58,6 +59,7 @@ class ForeignKeyOneToOneBinderSpec extends HibernateGormDatastoreSpec { def mapping = new Mapping() def refDomainClass = Mock(GrailsHibernatePersistentEntity) { getMappedForm() >> mapping + getHibernateCompositeIdentity() >> Optional.empty() } def propertyConfig = Mock(PropertyConfig) def column = new Column('test') @@ -111,6 +113,7 @@ class ForeignKeyOneToOneBinderSpec extends HibernateGormDatastoreSpec { def mapping = new Mapping() def refDomainClass = Mock(GrailsHibernatePersistentEntity) { getMappedForm() >> mapping + getHibernateCompositeIdentity() >> Optional.empty() } def propertyConfig = new PropertyConfig() diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy index 15a7bbae11..2d98f6d595 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy @@ -5,6 +5,7 @@ import org.grails.orm.hibernate.cfg.CompositeIdentity import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernatePersistentProperty import org.grails.orm.hibernate.cfg.Mapping +import java.util.Optional import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.PropertyConfig import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty @@ -33,14 +34,15 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def association = Mock(HibernateManyToOneProperty) def path = "/test" def mapping = new Mapping() + mapping.setIdentity(hasCompositeId ? new CompositeIdentity() : null) def refDomainClass = Mock(GrailsHibernatePersistentEntity) { getMappedForm() >> mapping + getHibernateCompositeIdentity() >> Optional.ofNullable(mapping.hasCompositeIdentifier() ? (CompositeIdentity) mapping.getIdentity() : null) } def propertyConfig = new PropertyConfig() association.getHibernateAssociatedEntity() >> refDomainClass association.getMappedForm() >> propertyConfig - mapping.setIdentity(hasCompositeId ? new CompositeIdentity() : null) when: def result = binder.bindManyToOne(association, null, path) @@ -71,6 +73,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { mapping.setColumns(new HashMap<String, PropertyConfig>()) def ownerEntity = Mock(GrailsHibernatePersistentEntity) { getMappedForm() >> mapping + getHibernateCompositeIdentity() >> Optional.empty() } def propertyConfig = new PropertyConfig()
