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 67f4d5b98b7a0770a7d0daed04c286ebf50dd833 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Thu Feb 19 13:10:02 2026 -0600 Refactor GrailsDomainBinder.bindRoot into RootBinder and add spec --- .../domainbinding/binder/GrailsDomainBinder.java | 36 +------ .../cfg/domainbinding/binder/RootBinder.java | 80 +++++++++++++++ .../cfg/domainbinding/CollectionBinderSpec.groovy | 19 ++-- .../domainbinding/GrailsPropertyBinderSpec.groovy | 19 ++-- .../cfg/domainbinding/binder/RootBinderSpec.groovy | 114 +++++++++++++++++++++ .../secondpass/ListSecondPassBinderSpec.groovy | 19 ++-- .../secondpass/MapSecondPassBinderSpec.groovy | 19 ++-- 7 files changed, 238 insertions(+), 68 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 6c71c38f8b..e028eb1301 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 @@ -211,12 +211,15 @@ public class GrailsDomainBinder SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder); SubClassBinder subClassBinder = new SubClassBinder(mappingCacheHolder, subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, dataSourceName); + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, getNamingStrategy(), identityBinder, versionBinder, classBinder, classPropertiesBinder); + DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()); + RootBinder rootBinder = new RootBinder(metadataBuildingContext, dataSourceName, getNamingStrategy(), multiTenantFilterBinder, subClassBinder, defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder); hibernateMappingContext .getHibernatePersistentEntities(dataSourceName) .stream() .filter(persistentEntity -> persistentEntity.forGrailsDomainMapping(dataSourceName)) - .forEach(hibernatePersistentEntity -> bindRoot(hibernatePersistentEntity, metadataCollector, defaultColumnNameFetcher, identityBinder, versionBinder, classBinder, classPropertiesBinder, multiTenantFilterBinder, subClassBinder)); + .forEach(hibernatePersistentEntity -> rootBinder.bindRoot(hibernatePersistentEntity, metadataCollector)); } @@ -239,37 +242,6 @@ public class GrailsDomainBinder - /** - * Binds a root class (one with no super classes) to the runtime meta model - * based on the supplied Grails domain class - * - * @param entity The Grails domain class - * @param mappings The Hibernate Mappings object - */ - 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; - } - RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, getNamingStrategy(), identityBinder, versionBinder, classBinder, classPropertiesBinder); - var children = entity.getChildEntities(dataSourceName); - RootClass root = rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity, children, mappings); - Mapping m = entity.getMappedForm(); - final Mapping finalMapping = m; - if (!children.isEmpty() && entity.isTablePerHierarchy()) { - DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()); - discriminatorPropertyBinder.bindDiscriminatorProperty(root, m); - } - // bind the sub classes - children.forEach(sub -> subClassBinder.bindSubClass(sub, root, mappings, finalMapping)); - - multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, mappings, defaultColumnNameFetcher); - - mappings.addEntityBinding(root); - } - - - public PersistentEntityNamingStrategy getNamingStrategy() { if (namingStrategy == null) { namingStrategy = new NamingStrategyWrapper(NAMING_STRATEGY_PROVIDER.getPhysicalNamingStrategy(sessionFactoryName), getJdbcEnvironment()); 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 new file mode 100644 index 0000000000..17b11a4522 --- /dev/null +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java @@ -0,0 +1,80 @@ +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.PersistentEntityNamingStrategy; +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.boot.spi.MetadataBuildingContext; +import org.hibernate.mapping.RootClass; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; + +/** + * Binder for root classes. + */ +public class RootBinder { + + private static final Logger LOG = LoggerFactory.getLogger(RootBinder.class); + + private final MetadataBuildingContext metadataBuildingContext; + private final String dataSourceName; + private final PersistentEntityNamingStrategy namingStrategy; + private final MultiTenantFilterBinder multiTenantFilterBinder; + private final SubClassBinder subClassBinder; + private final DefaultColumnNameFetcher defaultColumnNameFetcher; + private final RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder; + private final DiscriminatorPropertyBinder discriminatorPropertyBinder; + + public RootBinder( + MetadataBuildingContext metadataBuildingContext, + String dataSourceName, + PersistentEntityNamingStrategy namingStrategy, + MultiTenantFilterBinder multiTenantFilterBinder, + SubClassBinder subClassBinder, + DefaultColumnNameFetcher defaultColumnNameFetcher, + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder, + DiscriminatorPropertyBinder discriminatorPropertyBinder) { + this.metadataBuildingContext = metadataBuildingContext; + this.dataSourceName = dataSourceName; + this.namingStrategy = namingStrategy; + this.multiTenantFilterBinder = multiTenantFilterBinder; + this.subClassBinder = subClassBinder; + this.defaultColumnNameFetcher = defaultColumnNameFetcher; + this.rootPersistentClassCommonValuesBinder = rootPersistentClassCommonValuesBinder; + this.discriminatorPropertyBinder = discriminatorPropertyBinder; + } + + /** + * Binds a root class (one with no super classes) to the runtime meta model + * based on the supplied Grails domain class + * + * @param entity The Grails domain class + * @param mappings The Hibernate Mappings object + */ + public void bindRoot(@Nonnull GrailsHibernatePersistentEntity entity, @Nonnull InFlightMetadataCollector mappings) { + if (mappings.getEntityBinding(entity.getName()) != null) { + LOG.info("[RootBinder] Class [" + entity.getName() + "] is already mapped, skipping.. "); + return; + } + + Collection<GrailsHibernatePersistentEntity> children = entity.getChildEntities(dataSourceName); + RootClass root = rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity, children, mappings); + Mapping m = entity.getMappedForm(); + + if (!children.isEmpty() && entity.isTablePerHierarchy()) { + discriminatorPropertyBinder.bindDiscriminatorProperty(root, m); + } + + // bind the sub classes + children.forEach(sub -> subClassBinder.bindSubClass(sub, root, mappings, m)); + + multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, root, mappings, defaultColumnNameFetcher); + + mappings.addEntityBinding(root); + } +} 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 5eb1164955..50797e3374 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 @@ -20,6 +20,10 @@ 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.RootBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder @@ -121,6 +125,9 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder) + DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()) + RootBinder rootBinder = new RootBinder(metadataBuildingContext, "default", namingStrategy, multiTenantFilterBinder, subClassBinder, defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder) return [ propertyBinder: propertyBinder, @@ -135,20 +142,14 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, singleTableSubclassBinder: singleTableSubclassBinder, - subClassBinder: subClassBinder + subClassBinder: subClassBinder, + rootBinder: rootBinder ] } protected void bindRoot(GrailsDomainBinder binder, GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { def binders = getBinders(binder) - binder.bindRoot(entity, mappings, - binders.defaultColumnNameFetcher, - binders.identityBinder as IdentityBinder, - binders.versionBinder as VersionBinder, - binders.classBinder as ClassBinder, - binders.classPropertiesBinder as ClassPropertiesBinder, - binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.subClassBinder as SubClassBinder) + binders.rootBinder.bindRoot(entity, mappings) } 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 9651232933..795cf6356e 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 @@ -30,6 +30,10 @@ 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.binder.RootBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder 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 @@ -181,6 +185,9 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder) + DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()) + RootBinder rootBinder = new RootBinder(metadataBuildingContext, "default", namingStrategy, multiTenantFilterBinder, subClassBinder, defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder) return [ propertyBinder: propertyBinder, @@ -196,20 +203,14 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, singleTableSubclassBinder: singleTableSubclassBinder, - subClassBinder: subClassBinder + subClassBinder: subClassBinder, + rootBinder: rootBinder ] } protected void bindRoot(GrailsDomainBinder binder, GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { def binders = getBinders(binder) - binder.bindRoot(entity, mappings, - binders.defaultColumnNameFetcher, - binders.identityBinder as IdentityBinder, - binders.versionBinder as VersionBinder, - binders.classBinder as ClassBinder, - binders.classPropertiesBinder as ClassPropertiesBinder, - binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.subClassBinder as SubClassBinder) + binders.rootBinder.bindRoot(entity, mappings) } void setupSpec() { manager.addAllDomainClasses([ 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 new file mode 100644 index 0000000000..3e68798d1f --- /dev/null +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy @@ -0,0 +1,114 @@ +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.PersistentEntityNamingStrategy +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.RootClass +import spock.lang.Shared + +class RootBinderSpec extends HibernateGormDatastoreSpec { + + RootBinder binder + MultiTenantFilterBinder multiTenantFilterBinder + SubClassBinder subClassBinder + DefaultColumnNameFetcher defaultColumnNameFetcher + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder + DiscriminatorPropertyBinder discriminatorPropertyBinder + MetadataBuildingContext metadataBuildingContext + PersistentEntityNamingStrategy namingStrategy + + void setup() { + def gdb = getGrailsDomainBinder() + metadataBuildingContext = gdb.getMetadataBuildingContext() + namingStrategy = gdb.getNamingStrategy() + + multiTenantFilterBinder = Mock(MultiTenantFilterBinder) + subClassBinder = Mock(SubClassBinder) + defaultColumnNameFetcher = Mock(DefaultColumnNameFetcher) + rootPersistentClassCommonValuesBinder = Mock(RootPersistentClassCommonValuesBinder) + discriminatorPropertyBinder = Mock(DiscriminatorPropertyBinder) + + binder = new RootBinder( + metadataBuildingContext, + "default", + namingStrategy, + multiTenantFilterBinder, + subClassBinder, + defaultColumnNameFetcher, + rootPersistentClassCommonValuesBinder, + discriminatorPropertyBinder + ) + } + + def "test bindRoot with no children"() { + given: + def entity = Mock(GrailsHibernatePersistentEntity) + entity.getName() >> "Parent" + entity.getChildEntities("default") >> [] + entity.getMappedForm() >> new Mapping() + + def mappings = getCollector() + def rootClass = new RootClass(metadataBuildingContext) + rootClass.setEntityName("Parent") + rootClass.setJpaEntityName("Parent") + + when: + binder.bindRoot(entity, mappings) + + then: + 1 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity, [], mappings) >> rootClass + 0 * discriminatorPropertyBinder.bindDiscriminatorProperty(_, _) + 0 * subClassBinder.bindSubClass(_, _, _, _) + 1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, rootClass, mappings, defaultColumnNameFetcher) + mappings.getEntityBinding("Parent") == rootClass + } + + def "test bindRoot with children and table-per-hierarchy"() { + given: + def entity = Mock(GrailsHibernatePersistentEntity) + def childEntity = Mock(GrailsHibernatePersistentEntity) + entity.getName() >> "Parent" + entity.getChildEntities("default") >> [childEntity] + def mapping = new Mapping() + mapping.setTablePerHierarchy(true) + entity.getMappedForm() >> mapping + entity.isTablePerHierarchy() >> true + + def mappings = getCollector() + def rootClass = new RootClass(metadataBuildingContext) + rootClass.setEntityName("Parent") + rootClass.setJpaEntityName("Parent") + + when: + binder.bindRoot(entity, mappings) + + then: + 1 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity, [childEntity], mappings) >> rootClass + 1 * discriminatorPropertyBinder.bindDiscriminatorProperty(rootClass, mapping) + 1 * subClassBinder.bindSubClass(childEntity, rootClass, mappings, mapping) + 1 * multiTenantFilterBinder.addMultiTenantFilterIfNecessary(entity, rootClass, mappings, defaultColumnNameFetcher) + mappings.getEntityBinding("Parent") == rootClass + } + + def "test bindRoot already mapped"() { + given: + def entity = Mock(GrailsHibernatePersistentEntity) + entity.getName() >> "Parent" + def mappings = getCollector() + def rootClass = new RootClass(metadataBuildingContext) + rootClass.setEntityName("Parent") + rootClass.setJpaEntityName("Parent") + mappings.addEntityBinding(rootClass) + + when: + binder.bindRoot(entity, mappings) + + then: + 0 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(_, _, _) + } +} 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 e109677df0..884ceeb9ca 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 @@ -36,6 +36,10 @@ 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.RootBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -120,6 +124,9 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder) + DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()) + RootBinder rootBinder = new RootBinder(metadataBuildingContext, "default", namingStrategy, multiTenantFilterBinder, subClassBinder, defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder) return [ propertyBinder: propertyBinder, @@ -134,20 +141,14 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, singleTableSubclassBinder: singleTableSubclassBinder, - subClassBinder: subClassBinder + subClassBinder: subClassBinder, + rootBinder: rootBinder ] } protected void bindRoot(GrailsDomainBinder binder, GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { def binders = getBinders(binder) - binder.bindRoot(entity, mappings, - binders.defaultColumnNameFetcher, - binders.identityBinder as IdentityBinder, - binders.versionBinder as VersionBinder, - binders.classBinder as ClassBinder, - binders.classPropertiesBinder as ClassPropertiesBinder, - binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.subClassBinder as SubClassBinder) + binders.rootBinder.bindRoot(entity, mappings) } 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 05035d071d..61915a4e3e 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 @@ -36,6 +36,10 @@ 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.RootBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.RootPersistentClassCommonValuesBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.DiscriminatorPropertyBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -120,6 +124,9 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { SubclassMappingBinder subclassMappingBinder = new SubclassMappingBinder(metadataBuildingContext, joinedSubClassBinder, unionSubclassBinder, singleTableSubclassBinder, classPropertiesBinder) SubClassBinder subClassBinder = new SubClassBinder(binder.getMappingCacheHolder(), subclassMappingBinder, multiTenantFilterBinder, defaultColumnNameFetcher, "dataSource") + RootPersistentClassCommonValuesBinder rootPersistentClassCommonValuesBinder = new RootPersistentClassCommonValuesBinder(metadataBuildingContext, namingStrategy, identityBinder, versionBinder, classBinder, classPropertiesBinder) + DiscriminatorPropertyBinder discriminatorPropertyBinder = new DiscriminatorPropertyBinder(metadataBuildingContext, new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder(), new ColumnConfigToColumnBinder()) + RootBinder rootBinder = new RootBinder(metadataBuildingContext, "default", namingStrategy, multiTenantFilterBinder, subClassBinder, defaultColumnNameFetcher, rootPersistentClassCommonValuesBinder, discriminatorPropertyBinder) return [ propertyBinder: propertyBinder, @@ -134,20 +141,14 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { joinedSubClassBinder: joinedSubClassBinder, unionSubclassBinder: unionSubclassBinder, singleTableSubclassBinder: singleTableSubclassBinder, - subClassBinder: subClassBinder + subClassBinder: subClassBinder, + rootBinder: rootBinder ] } protected void bindRoot(GrailsDomainBinder binder, GrailsHibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { def binders = getBinders(binder) - binder.bindRoot(entity, mappings, - binders.defaultColumnNameFetcher, - binders.identityBinder as IdentityBinder, - binders.versionBinder as VersionBinder, - binders.classBinder as ClassBinder, - binders.classPropertiesBinder as ClassPropertiesBinder, - binders.multiTenantFilterBinder as MultiTenantFilterBinder, - binders.subClassBinder as SubClassBinder) + binders.rootBinder.bindRoot(entity, mappings) } void setupSpec() {
