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()));
+    }
+
 }

Reply via email to