You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/03/10 04:34:39 UTC
(grails-core) 01/05: hibernate7: SubClassBinder now returns a list of subclasses
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 <wb...@mac.com>
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())