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 <[email protected]> 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()
