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/02/17 18:42:18 UTC
(grails-core) 19/26: Refactor ComponentBinder to delegate property filtering to GrailsHibernatePersistentEntity
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 414f0b8c1f42e7fc91aed3f159428e6df829c9da
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Mon Feb 16 18:40:39 2026 -0600
Refactor ComponentBinder to delegate property filtering to GrailsHibernatePersistentEntity
- Add getHibernateParentProperty and getHibernatePersistentProperties(Class) to GrailsHibernatePersistentEntity to centralize component property filtering.
- Update ComponentBinder.bindComponent to use the new filtering methods.
- Update ComponentBinderSpec to stub the new methods on mock entities.
---
.../cfg/GrailsHibernatePersistentEntity.java | 33 ++++++++++++++++++++++
.../cfg/domainbinding/binder/ComponentBinder.java | 11 ++------
.../cfg/domainbinding/ComponentBinderSpec.groovy | 10 ++++---
3 files changed, 41 insertions(+), 13 deletions(-)
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 8ad0b831c2..5df2c4c683 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
@@ -118,6 +118,39 @@ package org.grails.orm.hibernate.cfg;
@Override
GrailsHibernatePersistentProperty getVersion();
+ /**
+ * @param parentType The type of the parent entity
+ * @return The parent property if it exists
+ */
+ default Optional<GrailsHibernatePersistentProperty> getHibernateParentProperty(Class<?> parentType) {
+ List<GrailsHibernatePersistentProperty> properties = getHibernatePersistentProperties();
+ if (properties == null) {
+ return Optional.empty();
+ }
+ return properties.stream()
+ .filter(Objects::nonNull)
+ .filter(p -> p.getType().equals(parentType))
+ .findFirst();
+ }
+
+ /**
+ * @param parentType The type of the parent entity to exclude from the results
+ * @return The properties that should be bound to the Hibernate meta model
+ */
+ default List<GrailsHibernatePersistentProperty> getHibernatePersistentProperties(Class<?> parentType) {
+ List<GrailsHibernatePersistentProperty> properties = getHibernatePersistentProperties();
+ if (properties == null) {
+ return java.util.Collections.emptyList();
+ }
+ return properties.stream()
+ .filter(Objects::nonNull)
+ .filter(p -> p.getMappedForm() != null)
+ .filter(p -> !p.equals(getIdentity()))
+ .filter(p -> !GormProperties.VERSION.equals(p.getName()))
+ .filter(p -> !p.getType().equals(parentType))
+ .toList();
+ }
+
default List<GrailsHibernatePersistentEntity> getChildEntities() {
return getChildEntities(getDataSourceName());
}
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
index 879548c1ba..006112efe0 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java
@@ -73,24 +73,17 @@ public class ComponentBinder {
GrailsHibernatePersistentEntity domainClass = (GrailsHibernatePersistentEntity) embeddedProperty.getAssociatedEntity();
mappingCacheHolder.cacheMapping(domainClass);
- var peerProperties = domainClass.getHibernatePersistentProperties();
Table table = component.getOwner().getTable();
PersistentClass persistentClass = component.getOwner();
String currentPath = path.isEmpty() ? embeddedProperty.getName() : path + "." + embeddedProperty.getName();
Class<?> propertyType = embeddedProperty.getOwner().getJavaClass();
- for (GrailsHibernatePersistentProperty peerProperty : peerProperties) {
- if (peerProperty.equals(domainClass.getIdentity())) continue;
- if (peerProperty.getName().equals(GormProperties.VERSION)) continue;
+ domainClass.getHibernateParentProperty(propertyType).ifPresent(p -> component.setParentProperty(p.getName()));
- if (peerProperty.getType().equals(propertyType)) {
- component.setParentProperty(peerProperty.getName());
- continue;
- }
+ for (GrailsHibernatePersistentProperty peerProperty : domainClass.getHibernatePersistentProperties(propertyType)) {
var value = grailsPropertyBinder.bindProperty(persistentClass, table, currentPath, embeddedProperty, peerProperty, mappings);
componentUpdater.updateComponent(component, embeddedProperty, peerProperty, value);
-
}
return component;
}
diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
index 30e5beacb2..397efe6ccc 100644
--- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
+++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy
@@ -145,8 +145,8 @@ class ComponentBinderSpec extends HibernateGormDatastoreSpec {
prop1.getType() >> String
prop1.isHibernateOneToOne() >> false
prop1.isHibernateManyToOne() >> false
- associatedEntity.getHibernatePersistentProperties() >> [prop1]
- associatedEntity.getIdentity() >> null
+ associatedEntity.getHibernateParentProperty(MyEntity) >> Optional.empty()
+ associatedEntity.getHibernatePersistentProperties(MyEntity) >> [prop1]
def mappings = metadataBuildingContext.getMetadataCollector()
@@ -192,7 +192,8 @@ class ComponentBinderSpec extends HibernateGormDatastoreSpec {
normalProp.isHibernateManyToOne() >> false
associatedEntity.getIdentity() >> idProp
- associatedEntity.getHibernatePersistentProperties() >> [idProp, versionProp, normalProp]
+ associatedEntity.getHibernateParentProperty(MyEntity) >> Optional.empty()
+ associatedEntity.getHibernatePersistentProperties(MyEntity) >> [normalProp]
def mappings = metadataBuildingContext.getMetadataCollector()
@@ -231,7 +232,8 @@ class ComponentBinderSpec extends HibernateGormDatastoreSpec {
parentProp.getType() >> MyEntity
associatedEntity.getIdentity() >> null
- associatedEntity.getHibernatePersistentProperties() >> [parentProp]
+ associatedEntity.getHibernateParentProperty(MyEntity) >> Optional.of(parentProp)
+ associatedEntity.getHibernatePersistentProperties(MyEntity) >> []
def mappings = metadataBuildingContext.getMetadataCollector()