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()
 

Reply via email to