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 5b16b8043204cd71adb39fb9ce99041d94add1de Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Fri Jan 30 17:43:58 2026 -0600 subclass --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 92 ++++++++-------------- .../cfg/GrailsHibernatePersistentEntity.java | 14 ++++ 2 files changed, 45 insertions(+), 61 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 3752e574d8..f25c7a1a40 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -29,7 +29,6 @@ import org.grails.datastore.mapping.model.types.TenantId; import org.grails.datastore.mapping.model.types.ToMany; import org.grails.orm.hibernate.cfg.domainbinding.ClassBinder; import org.grails.orm.hibernate.cfg.domainbinding.ColumnConfigToColumnBinder; -import org.grails.orm.hibernate.cfg.domainbinding.ConfigureDerivedPropertiesConsumer; import org.grails.orm.hibernate.cfg.domainbinding.EnumTypeBinder; import org.grails.orm.hibernate.cfg.domainbinding.NamingStrategyProvider; import org.grails.orm.hibernate.cfg.domainbinding.PersistentPropertyToPropertyConfig; @@ -80,7 +79,6 @@ import org.hibernate.mapping.UnionSubclass; import org.hibernate.mapping.Value; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.service.ServiceRegistry; -import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.Type; import org.hibernate.usertype.UserCollectionType; @@ -484,7 +482,7 @@ public class GrailsDomainBinder final boolean isManyToMany = property instanceof ManyToMany; if(referenced != null && !isManyToMany && referenced.isMultiTenant()) { - String filterCondition = getMultiTenantFilterCondition(sessionFactoryBeanName, referenced); + String filterCondition = getMultiTenantFilterCondition(referenced); if(filterCondition != null) { if (property.isUnidirectionalOneToMany()) { collection.addManyToManyFilter(GormProperties.TENANT_IDENTITY, filterCondition, true, Collections.emptyMap(), Collections.emptyMap()); @@ -555,7 +553,7 @@ public class GrailsDomainBinder } } - private String getMultiTenantFilterCondition(String sessionFactoryBeanName, PersistentEntity referenced) { + private String getMultiTenantFilterCondition(PersistentEntity referenced) { TenantId tenantId = referenced.getTenantId(); if(tenantId != null) { @@ -1161,7 +1159,7 @@ public class GrailsDomainBinder TenantId tenantId = entity.getTenantId(); if (tenantId != null) { - String filterCondition = getMultiTenantFilterCondition(sessionFactoryBeanName, entity); + String filterCondition = getMultiTenantFilterCondition(entity); persistentClass.addFilter( GormProperties.TENANT_IDENTITY, @@ -1202,62 +1200,12 @@ public class GrailsDomainBinder String sessionFactoryBeanName , Mapping m, MappingCacheHolder mappingCacheHolder) { mappingCacheHolder.cacheMapping(sub); - Subclass subClass; - boolean tablePerSubclass = !m.getTablePerHierarchy() && !m.isTablePerConcreteClass(); - boolean tablePerConcreteClass = m.isTablePerConcreteClass(); - final String fullName = sub.getName(); - if (tablePerSubclass) { - subClass = new JoinedSubclass( parent, this.metadataBuildingContext); - } - else if(tablePerConcreteClass) { - subClass = new UnionSubclass(parent, this.metadataBuildingContext); - } - else { - subClass = new SingleTableSubclass(parent, this.metadataBuildingContext); - // set the descriminator value as the name of the class. This is the - // value used by Hibernate to decide what the type of the class is - // to perform polymorphic queries - Mapping subMapping = null; - if (sub != null) { - subMapping = sub.getMappedForm(); - } - DiscriminatorConfig discriminatorConfig = subMapping.getDiscriminator(); + Subclass subClass = createSubclassMapping(sub, parent, mappings, sessionFactoryBeanName, m); - subClass.setDiscriminatorValue(discriminatorConfig != null && discriminatorConfig.getValue() != null ? discriminatorConfig.getValue() : fullName); - configureDerivedProperties(sub, subMapping); - - } - Integer bs = (m == null) ? null : m.getBatchSize(); - if (bs != null) { - subClass.setBatchSize(bs); - } - - if (m != null && m.getDynamicUpdate()) { - subClass.setDynamicUpdate(true); - } - if (m != null && m.getDynamicInsert()) { - subClass.setDynamicInsert(true); - } - - subClass.setCached(parent.isCached()); - - subClass.setAbstract(sub.isAbstract()); - subClass.setEntityName(fullName); - subClass.setJpaEntityName(unqualify(fullName)); parent.addSubclass(subClass); mappings.addEntityBinding(subClass); - if (tablePerSubclass) { - bindJoinedSubClass(sub, (JoinedSubclass) subClass, mappings, m, sessionFactoryBeanName); - } - else if( tablePerConcreteClass) { - bindUnionSubclass(sub, (UnionSubclass) subClass, mappings, sessionFactoryBeanName); - } - else { - bindSubClass(sub, subClass, mappings, sessionFactoryBeanName); - } - addMultiTenantFilterIfNecessary(sub, subClass, mappings, sessionFactoryBeanName); var children = sub.getChildEntities(dataSourceName); @@ -1267,6 +1215,32 @@ public class GrailsDomainBinder } } + private @NonNull Subclass createSubclassMapping(@NonNull GrailsHibernatePersistentEntity subEntity, PersistentClass parent, @NonNull InFlightMetadataCollector mappings, String sessionFactoryBeanName, Mapping m) { + Subclass subClass; + subEntity.configureDerivedProperties(); + if (!m.getTablePerHierarchy() && !m.isTablePerConcreteClass()) { + subClass = new JoinedSubclass(parent, this.metadataBuildingContext); + bindJoinedSubClass(subEntity, (JoinedSubclass) subClass, mappings, m, sessionFactoryBeanName); + } + else if(m.isTablePerConcreteClass()) { + subClass = new UnionSubclass(parent, this.metadataBuildingContext); + bindUnionSubclass(subEntity, (UnionSubclass) subClass, mappings, sessionFactoryBeanName); + } + else { + subClass = new SingleTableSubclass(parent, this.metadataBuildingContext); + subClass.setDiscriminatorValue(subEntity.getDiscriminatorValue()); + bindSubClass(subEntity, subClass, mappings, sessionFactoryBeanName); + } + subClass.setBatchSize(Optional.ofNullable(m.getBatchSize()).orElse(-1)); + subClass.setDynamicUpdate(m.getDynamicUpdate()); + subClass.setDynamicInsert(m.getDynamicInsert()); + subClass.setCached(parent.isCached()); + subClass.setAbstract(subEntity.isAbstract()); + subClass.setEntityName(subEntity.getName()); + subClass.setJpaEntityName(unqualify(subEntity.getName())); + return subClass; + } + private void bindUnionSubclass(@Nonnull GrailsHibernatePersistentEntity subClass, UnionSubclass unionSubclass, @Nonnull InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { @@ -1430,10 +1404,6 @@ public class GrailsDomainBinder entity.setPolymorphic(true); } - private void configureDerivedProperties(PersistentEntity domainClass, Mapping m) { - domainClass.getPersistentProperties().forEach(new ConfigureDerivedPropertiesConsumer( m)); - } - /* * Binds a persistent classes to the table representation and binds the class properties */ @@ -1449,7 +1419,7 @@ public class GrailsDomainBinder // get the schema and catalog names from the configuration Mapping gormMapping = domainClass.getMappedForm(); - configureDerivedProperties(domainClass, gormMapping); + domainClass.configureDerivedProperties(); CacheConfig cc = gormMapping.getCache(); if (cc != null && cc.getEnabled()) { root.setCacheConcurrencyStrategy(cc.getUsage()); 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 e823f31dc5..80161d7c43 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 @@ -1,9 +1,11 @@ package org.grails.orm.hibernate.cfg; import java.util.List; +import java.util.Optional; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.orm.hibernate.cfg.domainbinding.ConfigureDerivedPropertiesConsumer; /** * Common interface for Hibernate persistent entities @@ -11,6 +13,14 @@ import org.grails.datastore.mapping.model.PersistentProperty; public interface GrailsHibernatePersistentEntity extends PersistentEntity { Mapping getMappedForm(); + default String getDiscriminatorValue() { + return Optional.ofNullable(getMappedForm()) + .map(Mapping::getDiscriminator) + .map(DiscriminatorConfig::getValue) + .orElse(getName()); + + } + boolean forGrailsDomainMapping(String dataSourceName); boolean usesConnectionSource(String dataSourceName); @@ -37,4 +47,8 @@ public interface GrailsHibernatePersistentEntity extends PersistentEntity { return !isRoot() && (mapping == null || mapping.isTablePerHierarchy()) || embeddedProperty.isNullable(); } + default void configureDerivedProperties(){ + getPersistentProperties().forEach(new ConfigureDerivedPropertiesConsumer( getMappedForm())); + } + }
