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 56e95f1ce1e7fb75ecc3ad2662a558ee6962966b Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Mar 9 17:20:04 2026 -0500 hibernate7: SubClassBinder now returns a list of subclasses --- .../cfg/domainbinding/binder/GrailsDomainBinder.java | 2 +- .../hibernate/cfg/domainbinding/binder/RootBinder.java | 4 +++- .../cfg/domainbinding/binder/SubClassBinder.java | 17 +++++++++-------- .../cfg/domainbinding/CollectionBinderSpec.groovy | 2 +- .../cfg/domainbinding/GrailsPropertyBinderSpec.groovy | 2 +- .../cfg/domainbinding/binder/RootBinderSpec.groovy | 2 +- .../cfg/domainbinding/binder/SubClassBinderSpec.groovy | 16 +++++----------- .../secondpass/ListSecondPassBinderSpec.groovy | 2 +- .../secondpass/MapSecondPassBinderSpec.groovy | 2 +- 9 files changed, 23 insertions(+), 26 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java index 3fb45b072f..c538ba14db 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java @@ -215,7 +215,7 @@ public class GrailsDomainBinder implements AdditionalMappingContributor, TypeCon classPropertiesBinder); SubClassBinder subClassBinder = new SubClassBinder( - mappingCacheHolder, subclassMappingBinder, multiTenantFilterBinder, dataSourceName, metadataCollector); + mappingCacheHolder, subclassMappingBinder, multiTenantFilterBinder, dataSourceName); RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder( metadataBuildingContext, diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java index 5fd2a224f5..46cd3a65b0 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java @@ -78,7 +78,9 @@ public class RootBinder { } // bind the sub classes - children.forEach(sub -> subClassBinder.bindSubClass(sub, root)); + children.stream() + .flatMap(sub -> subClassBinder.bindSubClass(sub, root).stream()) + .forEach(mappings::addEntityBinding); multiTenantFilterBinder.bind(entity, root); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java index 45100d436c..c8e5058e46 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java @@ -19,10 +19,11 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import jakarta.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; import org.grails.orm.hibernate.cfg.MappingCacheHolder; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder; -import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.mapping.JoinedSubclass; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.SingleTableSubclass; @@ -36,19 +37,16 @@ public class SubClassBinder { private final SubclassMappingBinder subclassMappingBinder; private final MultiTenantFilterBinder multiTenantFilterBinder; private final String dataSourceName; - private final InFlightMetadataCollector mappings; public SubClassBinder( MappingCacheHolder mappingCacheHolder, SubclassMappingBinder subclassMappingBinder, MultiTenantFilterBinder multiTenantFilterBinder, - String dataSourceName, - InFlightMetadataCollector mappings) { + String dataSourceName) { this.mappingCacheHolder = mappingCacheHolder; this.subclassMappingBinder = subclassMappingBinder; this.multiTenantFilterBinder = multiTenantFilterBinder; this.dataSourceName = dataSourceName; - this.mappings = mappings; } /** @@ -56,16 +54,19 @@ public class SubClassBinder { * * @param sub The sub domain class instance * @param parent The parent persistent class instance + * @return The list of subclasses created */ - public void bindSubClass( + public List<Subclass> bindSubClass( @Nonnull GrailsHibernatePersistentEntity sub, PersistentClass parent) { mappingCacheHolder.cacheMapping(sub); Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, parent); parent.addSubclass(subClass); - mappings.addEntityBinding(subClass); bindMultiTenantFilter(sub, subClass); - sub.getChildEntities(dataSourceName).forEach(sub1 -> bindSubClass(sub1, subClass)); + List<Subclass> subclasses = new ArrayList<>(); + subclasses.add(subClass); + sub.getChildEntities(dataSourceName).forEach(sub1 -> subclasses.addAll(bindSubClass(sub1, subClass))); + return subclasses; } private void bindMultiTenantFilter(GrailsHibernatePersistentEntity sub, Subclass subClass) { diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy index 65d5e1bab6..c218bf044a 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy @@ -123,7 +123,7 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) - SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource", getCollector()) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource") RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder, getCollector()) DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, binder.getMappingCacheHolder(), new org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()), new org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...] RootBinder rootBinder = new RootBinder("default", multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder, getCollector()) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy index 6d8f7dc9b5..3d34296eaf 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy @@ -189,7 +189,7 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) - SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource", collector) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource") RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder, collector) DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, binder.getMappingCacheHolder(), new org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()), new org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...] RootBinder rootBinder = new RootBinder("default", multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder, collector) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy index 790546e79d..6baf5c9f56 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy @@ -86,7 +86,7 @@ class RootBinderSpec extends HibernateGormDatastoreSpec { then: 1 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity) >> rootClass 1 * discriminatorPropertyBinder.bindDiscriminatorProperty(rootClass) - 1 * subClassBinder.bindSubClass(childEntity, rootClass) + 1 * subClassBinder.bindSubClass(childEntity, rootClass) >> [] 1 * multiTenantFilterBinder.bind(entity, rootClass) mappings.getEntityBinding("Parent") == rootClass } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy index becc03ce0b..fe89406f1d 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy @@ -16,11 +16,9 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { MultiTenantFilterBinder multiTenantFilterBinder MappingCacheHolder mappingCacheHolder MetadataBuildingContext metadataBuildingContext - def sharedCollector void setup() { def gdb = getGrailsDomainBinder() - sharedCollector = getCollector() metadataBuildingContext = gdb.getMetadataBuildingContext() mappingCacheHolder = gdb.getMappingCacheHolder() @@ -31,8 +29,7 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { mappingCacheHolder, subclassMappingBinder, multiTenantFilterBinder, - "default", - sharedCollector + "default" ) } @@ -44,20 +41,18 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { def rootClass = new RootClass(metadataBuildingContext) rootClass.setEntityName("Parent") rootClass.setJpaEntityName("Parent") - def mappings = sharedCollector - def mapping = new Mapping() def subClass = new org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext) subClass.setEntityName("Child") subClass.setJpaEntityName("Child") when: - binder.bindSubClass(subEntity, rootClass) + def results = binder.bindSubClass(subEntity, rootClass) then: 1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass) >> subClass 1 * multiTenantFilterBinder.bind(subEntity, subClass) rootClass.getSubclasses().contains(subClass) - mappings.getEntityBinding(subClass.getEntityName()) == subClass + results == [subClass] } def "test bindSubClass with children"() { @@ -72,8 +67,6 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { def rootClass = new RootClass(metadataBuildingContext) rootClass.setEntityName("Parent") rootClass.setJpaEntityName("Parent") - def mappings = sharedCollector - def mapping = new Mapping() def subClass = new org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext) subClass.setEntityName("Child") @@ -83,7 +76,7 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { grandChildSubClass.setJpaEntityName("GrandChild") when: - binder.bindSubClass(subEntity, rootClass) + def results = binder.bindSubClass(subEntity, rootClass) then: 1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass) >> subClass @@ -91,5 +84,6 @@ class SubClassBinderSpec extends HibernateGormDatastoreSpec { 2 * multiTenantFilterBinder.bind(_, _) rootClass.getSubclasses().contains(subClass) subClass.getSubclasses().contains(grandChildSubClass) + results == [subClass, grandChildSubClass] } } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy index 1b3f1b68a8..6c560b489c 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinderSpec.groovy @@ -125,7 +125,7 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) - SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource", collector) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource") RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder, collector) DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, binder.getMappingCacheHolder(), new org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()), new org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...] RootBinder rootBinder = new RootBinder("default", multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder, collector) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy index 6df8a1aa53..b9a673e292 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinderSpec.groovy @@ -123,7 +123,7 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) - SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource", getCollector()) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, "dataSource") RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder, getCollector()) DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, binder.getMappingCacheHolder(), new org.grails.orm.hibernate.cfg.domainbinding.binder.ConfiguredDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()), new org.grails.orm.hibernate.cfg.domainbinding.binder.DefaultDiscriminatorBinder(new org.grails.orm.hibernate.cfg.domainbinding.binder.Si [...] RootBinder rootBinder = new RootBinder("default", multiTenantFilterBinder, subClassBinder, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder, getCollector())
