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 84804ede7fc8287af44c30e94d45f82caf5c3a20 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Thu Feb 19 12:54:09 2026 -0600 Refactor GrailsDomainBinder.bindSubClass into SubClassBinder and add spec --- .../domainbinding/binder/GrailsDomainBinder.java | 47 ++-------- .../cfg/domainbinding/binder/SubClassBinder.java | 65 ++++++++++++++ .../cfg/domainbinding/CollectionBinderSpec.groovy | 12 ++- .../domainbinding/GrailsPropertyBinderSpec.groovy | 12 ++- .../domainbinding/binder/SubClassBinderSpec.groovy | 99 ++++++++++++++++++++++ .../secondpass/ListSecondPassBinderSpec.groovy | 12 ++- .../secondpass/MapSecondPassBinderSpec.groovy | 12 ++- 7 files changed, 202 insertions(+), 57 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 1943517cf5..6c71c38f8b 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 @@ -209,11 +209,14 @@ public class GrailsDomainBinder UnionSubclassBinder unionSubclassBinder = new UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder); SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder); + SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder); + SubClassBinder subClassBinder = new SubClassBinder(mappingCacheHolder, subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, dataSourceName); + hibernateMappingContext .getHibernatePersistentEntities(dataSourceName) .stream() .filter(persistentEntity -> persistentEntity.forGrailsDomainMapping(dataSourceName)) - .forEach(hibernatePersistentEntity -> bindRoot(hibernatePersistentEntity, metadataCollector, defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder)); + .forEach(hibernatePersistentEntity -> bindRoot(hibernatePersistentEntity, metadataCollector, defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, classPropertiesBinder, multiTenantFilterBinder, subClassBinder)); } @@ -242,9 +245,8 @@ public class GrailsDomainBinder * * @param entity The Grails domain class * @param mappings The Hibernate Mappings object - * @param sessionFactoryBeanName the session factory bean name */ - protected void bindRoot(@Nonnull GrailsHibernatePersistentEntity entity,@Nonnull InFlightMetadataCollector mappings, DefaultColumnNameFetcher defaultColumnNameFetcher, IdentityBinder identityBinder, VersionBinder versionBinder, ClassBinder classBinder, ClassPropertiesBinder classPropertiesBinder, MultiTenantFilterBinder multiTenantFilterBinder, JoinedSubClassBinder joinedSubClassBinder, UnionSubclassBinder unionSubclassBinder, SingleTableSubclassBinder singleTableSubclassBinder) { + protected void bindRoot(@Nonnull GrailsHibernatePersistentEntity entity,@Nonnull InFlightMetadataCollector mappings, DefaultColumnNameFetcher defaultColumnNameFetcher, IdentityBinder identityBinder, VersionBinder versionBinder, ClassBinder classBinder, ClassPropertiesBinder classPropertiesBinder, MultiTenantFilterBinder multiTenantFilterBinder, SubClassBinder subClassBinder) { if (mappings.getEntityBinding(entity.getName()) != null) { LOG.info("[GrailsDomainBinder] Class [" + entity.getName() + "] is already mapped, skipping.. "); return; @@ -259,7 +261,7 @@ public class GrailsDomainBinder discriminatorPropertyBinder.bindDiscriminatorProperty(root, m); } // bind the sub classes - children.forEach(sub -> bindSubClass(sub, root, mappings, finalMapping,mappingCacheHolder, defaultColumnNameFetcher, classBinder, classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder)); + children.forEach(sub -> subClassBinder.bindSubClass(sub, root, mappings, finalMapping)); multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, mappings, defaultColumnNameFetcher); @@ -275,43 +277,6 @@ public class GrailsDomainBinder return namingStrategy; } - /** - * Binds a sub class. - * - * @param sub The sub domain class instance - * @param parent The parent persistent class instance - * @param mappings The mappings instance - * @param mappingCacheHolder - */ - private void bindSubClass(@Nonnull GrailsHibernatePersistentEntity sub, - PersistentClass parent, - @Nonnull InFlightMetadataCollector mappings, - Mapping m, MappingCacheHolder mappingCacheHolder, DefaultColumnNameFetcher defaultColumnNameFetcher, ClassBinder classBinder, ClassPropertiesBinder classPropertiesBinder, MultiTenantFilterBinder multiTenantFilterBinder, JoinedSubClassBinder joinedSubClassBinder, UnionSubclassBinder unionSubclassBinder, SingleTableSubclassBinder singleTableSubclassBinder) { - mappingCacheHolder.cacheMapping(sub); - SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder); - Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, parent, mappings, m); - - - parent.addSubclass(subClass); - mappings.addEntityBinding(subClass); - - multiTenantFilterBinder.addMultiTenantFilterIfNecessary(sub, subClass, mappings, defaultColumnNameFetcher); - - var children = sub.getChildEntities(dataSourceName); - if (!children.isEmpty()) { - // bind the sub classes - children.forEach(sub1 -> bindSubClass(sub1, subClass, mappings, m,mappingCacheHolder, defaultColumnNameFetcher, classBinder, classPropertiesBinder, multiTenantFilterBinder, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder )); - } - } - - - /** - * Binds a sub-class using table-per-hierarchy inheritance mapping - * - * @param sub The Grails domain class instance representing the sub-class - * @param subClass The Hibernate SubClass instance - * @param mappings The mappings instance - */ public MetadataBuildingContext getMetadataBuildingContext() { return metadataBuildingContext; } 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 new file mode 100644 index 0000000000..6eae67b676 --- /dev/null +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinder.java @@ -0,0 +1,65 @@ +package org.grails.orm.hibernate.cfg.domainbinding.binder; + +import jakarta.annotation.Nonnull; +import org.grails.orm.hibernate.cfg.Mapping; +import org.grails.orm.hibernate.cfg.MappingCacheHolder; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; +import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher; +import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Subclass; + +import java.util.Collection; + +/** + * Binder for subclasses. + */ +public class SubClassBinder { + + private final MappingCacheHolder mappingCacheHolder; + private final SubclassMappingBinder subclassMappingBinder; + private final MultiTenantFilterBinder multiTenantFilterBinder; + private final DefaultColumnNameFetcher defaultColumnNameFetcher; + private final String dataSourceName; + + public SubClassBinder( + MappingCacheHolder mappingCacheHolder, + SubclassMappingBinder subclassMappingBinder, + MultiTenantFilterBinder multiTenantFilterBinder, + DefaultColumnNameFetcher defaultColumnNameFetcher, + String dataSourceName) { + this.mappingCacheHolder = mappingCacheHolder; + this.subclassMappingBinder = subclassMappingBinder; + this.multiTenantFilterBinder = multiTenantFilterBinder; + this.defaultColumnNameFetcher = defaultColumnNameFetcher; + this.dataSourceName = dataSourceName; + } + + /** + * Binds a sub class. + * + * @param sub The sub domain class instance + * @param parent The parent persistent class instance + * @param mappings The mappings instance + * @param m The mapping config + */ + public void bindSubClass(@Nonnull GrailsHibernatePersistentEntity sub, + PersistentClass parent, + @Nonnull InFlightMetadataCollector mappings, + Mapping m) { + mappingCacheHolder.cacheMapping(sub); + Subclass subClass = subclassMappingBinder.createSubclassMapping(sub, parent, mappings, m); + + parent.addSubclass(subClass); + mappings.addEntityBinding(subClass); + + multiTenantFilterBinder.addMultiTenantFilterIfNecessary(sub, subClass, mappings, defaultColumnNameFetcher); + + Collection<GrailsHibernatePersistentEntity> children = sub.getChildEntities(dataSourceName); + if (!children.isEmpty()) { + // bind the sub classes + children.forEach(sub1 -> bindSubClass(sub1, subClass, mappings, m)); + } + } +} 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 090fd9e286..5eb1164955 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 @@ -18,6 +18,8 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder @@ -117,6 +119,9 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { UnionSubclassBinder unionSubclassBinder = new UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder) SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) + SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + return [ propertyBinder: propertyBinder, collectionBinder: collectionBinder, @@ -129,7 +134,8 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { multiTenantFilterBinder: multiTenantFilterBinder, joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, - singleTableSubclassBinder: singleTableSubclassBinder + singleTableSubclassBinder: singleTableSubclassBinder, + subClassBinder: subClassBinder ] } @@ -142,9 +148,7 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { binders.classBinder as ClassBinder, binders.classPropertiesBinder as ClassPropertiesBinder, binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.joinedSubClassBinder as JoinedSubClassBinder, - binders.unionSubclassBinder as UnionSubclassBinder, - binders.singleTableSubclassBinder as SingleTableSubclassBinder) + binders.subClassBinder as SubClassBinder) } void setupSpec() { 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 299a32c857..9651232933 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 @@ -28,6 +28,8 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder @@ -177,6 +179,9 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { UnionSubclassBinder unionSubclassBinder = new UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder) SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) + SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + return [ propertyBinder: propertyBinder, collectionBinder: collectionBinder, @@ -190,7 +195,8 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { naturalIdentifierBinder: naturalIdentifierBinder, joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, - singleTableSubclassBinder: singleTableSubclassBinder + singleTableSubclassBinder: singleTableSubclassBinder, + subClassBinder: subClassBinder ] } @@ -203,9 +209,7 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { binders.classBinder as ClassBinder, binders.classPropertiesBinder as ClassPropertiesBinder, binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.joinedSubClassBinder as JoinedSubClassBinder, - binders.unionSubclassBinder as UnionSubclassBinder, - binders.singleTableSubclassBinder as SingleTableSubclassBinder) + binders.subClassBinder as SubClassBinder) } void setupSpec() { manager.addAllDomainClasses([ 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 new file mode 100644 index 0000000000..72646b2c22 --- /dev/null +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SubClassBinderSpec.groovy @@ -0,0 +1,99 @@ +package org.grails.orm.hibernate.cfg.domainbinding.binder + +import grails.gorm.annotation.Entity +import grails.gorm.specs.HibernateGormDatastoreSpec +import org.grails.orm.hibernate.cfg.Mapping +import org.grails.orm.hibernate.cfg.MappingCacheHolder +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity +import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher +import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder +import org.hibernate.boot.spi.MetadataBuildingContext +import org.hibernate.mapping.PersistentClass +import org.hibernate.mapping.RootClass +import org.hibernate.mapping.Subclass +import spock.lang.Shared + +class SubClassBinderSpec extends HibernateGormDatastoreSpec { + + SubClassBinder binder + SubclassMappingBinder subclassMappingBinder + MultiTenantFilterBinder multiTenantFilterBinder + DefaultColumnNameFetcher defaultColumnNameFetcher + MappingCacheHolder mappingCacheHolder + MetadataBuildingContext metadataBuildingContext + + void setup() { + def gdb = getGrailsDomainBinder() + + metadataBuildingContext = gdb.getMetadataBuildingContext() + mappingCacheHolder = gdb.getMappingCacheHolder() + subclassMappingBinder = Mock(SubclassMappingBinder) + multiTenantFilterBinder = Mock(MultiTenantFilterBinder) + defaultColumnNameFetcher = Mock(DefaultColumnNameFetcher) + + binder = new SubClassBinder( + mappingCacheHolder, + subclassMappingBinder, + multiTenantFilterBinder, + defaultColumnNameFetcher, + "default" + ) + } + + def "test bindSubClass with no children"() { + given: + def subEntity = Mock(GrailsHibernatePersistentEntity) + subEntity.getName() >> "Child" + subEntity.getChildEntities("default") >> [] + def rootClass = new RootClass(metadataBuildingContext) + rootClass.setEntityName("Parent") + rootClass.setJpaEntityName("Parent") + def mappings = getCollector() + def mapping = new Mapping() + def subClass = new org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext) + subClass.setEntityName("Child") + subClass.setJpaEntityName("Child") + + when: + binder.bindSubClass(subEntity, rootClass, mappings, mapping) + + then: + 1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass, mappings, mapping) >> subClass + 1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(subEntity, subClass, mappings, defaultColumnNameFetcher) + rootClass.getSubclasses().contains(subClass) + mappings.getEntityBinding(subClass.getEntityName()) == subClass + } + + def "test bindSubClass with children"() { + given: + def subEntity = Mock(GrailsHibernatePersistentEntity) + def grandChildEntity = Mock(GrailsHibernatePersistentEntity) + subEntity.getName() >> "Child" + grandChildEntity.getName() >> "GrandChild" + subEntity.getChildEntities("default") >> [grandChildEntity] + grandChildEntity.getChildEntities("default") >> [] + + def rootClass = new RootClass(metadataBuildingContext) + rootClass.setEntityName("Parent") + rootClass.setJpaEntityName("Parent") + def mappings = getCollector() + def mapping = new Mapping() + + def subClass = new org.hibernate.mapping.SingleTableSubclass(rootClass, metadataBuildingContext) + subClass.setEntityName("Child") + subClass.setJpaEntityName("Child") + def grandChildSubClass = new org.hibernate.mapping.SingleTableSubclass(subClass, metadataBuildingContext) + grandChildSubClass.setEntityName("GrandChild") + grandChildSubClass.setJpaEntityName("GrandChild") + + when: + binder.bindSubClass(subEntity, rootClass, mappings, mapping) + + then: + 1 * subclassMappingBinder.createSubclassMapping(subEntity, rootClass, mappings, mapping) >> subClass + 1 * subclassMappingBinder.createSubclassMapping(grandChildEntity, subClass, mappings, mapping) >> grandChildSubClass + 2 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(_, _, mappings, defaultColumnNameFetcher) + rootClass.getSubclasses().contains(subClass) + subClass.getSubclasses().contains(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 7aea0465ee..e109677df0 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 @@ -34,6 +34,8 @@ import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndP import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -116,6 +118,9 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { UnionSubclassBinder unionSubclassBinder = new UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder) SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) + SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + return [ propertyBinder: propertyBinder, collectionBinder: collectionBinder, @@ -128,7 +133,8 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { multiTenantFilterBinder: multiTenantFilterBinder, joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, - singleTableSubclassBinder: singleTableSubclassBinder + singleTableSubclassBinder: singleTableSubclassBinder, + subClassBinder: subClassBinder ] } @@ -141,9 +147,7 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { binders.classBinder as ClassBinder, binders.classPropertiesBinder as ClassPropertiesBinder, binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.joinedSubClassBinder as JoinedSubClassBinder, - binders.unionSubclassBinder as UnionSubclassBinder, - binders.singleTableSubclassBinder as SingleTableSubclassBinder) + binders.subClassBinder as SubClassBinder) } void setupSpec() { 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 3a0ec3fde4..05035d071d 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 @@ -34,6 +34,8 @@ import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndP import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubClassBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.SubclassMappingBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -116,6 +118,9 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { UnionSubclassBinder unionSubclassBinder = new UnionSubclassBinder(metadataBuildingContext, namingStrategy, classBinder) SingleTableSubclassBinder singleTableSubclassBinder = new SingleTableSubclassBinder(classBinder) + SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) + SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + return [ propertyBinder: propertyBinder, collectionBinder: collectionBinder, @@ -128,7 +133,8 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { multiTenantFilterBinder: multiTenantFilterBinder, joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, - singleTableSubclassBinder: singleTableSubclassBinder + singleTableSubclassBinder: singleTableSubclassBinder, + subClassBinder: subClassBinder ] } @@ -141,9 +147,7 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { binders.classBinder as ClassBinder, binders.classPropertiesBinder as ClassPropertiesBinder, binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.joinedSubClassBinder as JoinedSubClassBinder, - binders.unionSubclassBinder as UnionSubclassBinder, - binders.singleTableSubclassBinder as SingleTableSubclassBinder) + binders.subClassBinder as SubClassBinder) } void setupSpec() {
