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 f1725f3d3b99df90efab53268512547d0f13661d
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon Feb 2 13:36:20 2026 -0600

    Refactor bindProperty and implement fluent property filtering
    
    - Refactor bindProperty into separate creation and binding blocks for 
better clarity
    - Implement getPersistentPropertiesToBind in 
GrailsHibernatePersistentEntity using a fluent Stream pipeline
    - Simplify createClassProperties by leveraging the new property filtering 
method
    - Remove redundant and broken filtering logic, resolving duplicate mapping 
issues
---
 .../orm/hibernate/cfg/GrailsDomainBinder.java      | 85 ++++++++++++----------
 .../cfg/GrailsHibernatePersistentEntity.java       | 21 +++++-
 .../hibernate/cfg/HibernatePersistentEntity.java   |  6 --
 3 files changed, 62 insertions(+), 50 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 043f99e247..02167b324c 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
@@ -1492,18 +1492,8 @@ public class GrailsDomainBinder
         Mapping gormMapping = domainClass.getMappedForm();
         Table table = persistentClass.getTable();
         table.setComment(gormMapping.getComment());
-        final List<PersistentProperty> persistentProperties = 
domainClass.getPersistentProperties()
-                .stream()
-                .filter(Objects::nonNull)
-                .filter(persistentProperty -> 
persistentProperty.getMappedForm() != null)
-                .filter(persistentProperty -> 
!persistentProperty.isCompositeIdProperty())
-                .filter(persistentProperty -> 
!persistentProperty.isIdentityProperty())
-                .filter(persistentProperty -> 
!persistentProperty.getName().equals(GormProperties.VERSION) )
-                .filter(persistentProperty -> 
!persistentProperty.isInherited())
-                .toList();
-
-
-        for (PersistentProperty<?> currentGrailsProp : persistentProperties) {
+
+        for (GrailsHibernatePersistentProperty currentGrailsProp : 
domainClass.getPersistentPropertiesToBind()) {
             bindProperty(persistentClass, mappings, sessionFactoryBeanName, 
currentGrailsProp, table, gormMapping);
         }
 
@@ -1513,7 +1503,7 @@ public class GrailsDomainBinder
     private void bindProperty(PersistentClass persistentClass
             , @NonNull InFlightMetadataCollector mappings
             , String sessionFactoryBeanName
-            , @Nonnull  PersistentProperty<?> currentGrailsProp
+            , @Nonnull  GrailsHibernatePersistentProperty currentGrailsProp
             , Table table
             , Mapping gormMapping) {
         if (LOG.isDebugEnabled()) {
@@ -1527,21 +1517,14 @@ public class GrailsDomainBinder
 
         Class<?> userType = getUserType(currentGrailsProp);
 
+        // 1. Create Value
         if (userType != null && 
!UserCollectionType.class.isAssignableFrom(userType)) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as SimpleValue");
-            }
             value = new BasicValue(metadataBuildingContext, table);
-            // set type
-            new 
SimpleValueBinder(namingStrategy).bindSimpleValue(currentGrailsProp, null, 
(SimpleValue) value, EMPTY_PATH);
         }
         else if (collectionType != null) {
-            String typeName = currentGrailsProp instanceof 
GrailsHibernatePersistentProperty ghpp ? ghpp.getTypeName(gormMapping) : null;
+            String typeName = currentGrailsProp.getTypeName(gormMapping);
             if ("serializable".equals(typeName)) {
                 value = new BasicValue(metadataBuildingContext, table);
-                boolean nullable = currentGrailsProp.isNullable();
-                String columnName = new 
ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath(currentGrailsProp,
 EMPTY_PATH, null);
-                new SimpleValueColumnBinder().bindSimpleValue((SimpleValue) 
value, typeName, columnName, nullable);
             }
             else {
                 // create collection
@@ -1553,23 +1536,13 @@ public class GrailsDomainBinder
         }
         else if (currentGrailsProp.getType().isEnum()) {
             value = new BasicValue(metadataBuildingContext, table);
-            String columnName = new 
ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath(currentGrailsProp,
 EMPTY_PATH, null);
-            enumTypeBinder.bindEnumType(currentGrailsProp, 
currentGrailsProp.getType(), (SimpleValue) value, columnName);
         }
         else if(currentGrailsProp instanceof Association) {
             Association association = (Association) currentGrailsProp;
             if (currentGrailsProp instanceof 
org.grails.datastore.mapping.model.types.ManyToOne) {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as ManyToOne");
-
                 value = new ManyToOne(metadataBuildingContext, table);
-                new 
ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, 
(ManyToOne) value, EMPTY_PATH);
             }
             else if (currentGrailsProp instanceof 
org.grails.datastore.mapping.model.types.OneToOne && userType == null) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as OneToOne");
-                }
-
                 final boolean isHasOne = association.isHasOne();
                 if (isHasOne && !association.isBidirectional()) {
                     throw new MappingException("hasOne property [" + 
currentGrailsProp.getOwner().getName() +
@@ -1577,32 +1550,64 @@ public class GrailsDomainBinder
                 }
                 else if (((Association) 
currentGrailsProp).canBindOneToOneWithSingleColumnAndForeignKey()) {
                     value = new OneToOne(metadataBuildingContext, table, 
persistentClass);
-                    new 
OneToOneBinder(namingStrategy).bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne)
 currentGrailsProp, (OneToOne) value, EMPTY_PATH);
                 }
                 else {
                     if (isHasOne && association.isBidirectional()) {
                         value = new OneToOne(metadataBuildingContext, table, 
persistentClass);
-                        new 
OneToOneBinder(namingStrategy).bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne)
 currentGrailsProp, (OneToOne) value, EMPTY_PATH);
                     }
                     else {
                         value = new ManyToOne(metadataBuildingContext, table);
-                        new 
ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, 
(ManyToOne) value, EMPTY_PATH);
                     }
                 }
             }
             else if (currentGrailsProp instanceof Embedded) {
                 value = new Component(metadataBuildingContext, 
persistentClass);
-                componentPropertyBinder.bindComponent((Component) value, 
(Embedded) currentGrailsProp, true, mappings, sessionFactoryBeanName);
             }
         }
         // work out what type of relationship it is and bind value
         else {
+            value = new BasicValue(metadataBuildingContext, table);
+        }
+
+        // 2. Give the value to the binder
+        if (value instanceof Component component && currentGrailsProp 
instanceof Embedded embedded) {
+            componentPropertyBinder.bindComponent(component, embedded, true, 
mappings, sessionFactoryBeanName);
+        }
+        else if (value instanceof OneToOne oneToOne && currentGrailsProp 
instanceof org.grails.datastore.mapping.model.types.OneToOne oneToOneProp) {
             if (LOG.isDebugEnabled()) {
-                LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as SimpleValue");
+                LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as OneToOne");
+            }
+            new OneToOneBinder(namingStrategy).bindOneToOne(oneToOneProp, 
oneToOne, EMPTY_PATH);
+        }
+        else if (value instanceof ManyToOne manyToOne && currentGrailsProp 
instanceof Association association) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as ManyToOne");
+            }
+            new ManyToOneBinder(namingStrategy).bindManyToOne(association, 
manyToOne, EMPTY_PATH);
+        }
+        else if (value instanceof SimpleValue simpleValue) {
+            if (userType != null && 
!UserCollectionType.class.isAssignableFrom(userType)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as SimpleValue");
+                }
+                new 
SimpleValueBinder(namingStrategy).bindSimpleValue(currentGrailsProp, null, 
simpleValue, EMPTY_PATH);
+            }
+            else if (currentGrailsProp.getType().isEnum()) {
+                String columnName = new 
ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath(currentGrailsProp,
 EMPTY_PATH, null);
+                enumTypeBinder.bindEnumType(currentGrailsProp, 
currentGrailsProp.getType(), simpleValue, columnName);
+            }
+            else if (collectionType != null && 
"serializable".equals(currentGrailsProp.getTypeName(gormMapping))) {
+                String typeName = currentGrailsProp.getTypeName(gormMapping);
+                boolean nullable = currentGrailsProp.isNullable();
+                String columnName = new 
ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath(currentGrailsProp,
 EMPTY_PATH, null);
+                new SimpleValueColumnBinder().bindSimpleValue(simpleValue, 
typeName, columnName, nullable);
+            }
+            else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("[GrailsDomainBinder] Binding property [" + 
currentGrailsProp.getName() + "] as SimpleValue");
+                }
+                new 
SimpleValueBinder(namingStrategy).bindSimpleValue(currentGrailsProp, null, 
simpleValue, EMPTY_PATH);
             }
-            value = new BasicValue(metadataBuildingContext, table);
-            // set type
-            new 
SimpleValueBinder(namingStrategy).bindSimpleValue(currentGrailsProp, null, 
(SimpleValue) value, EMPTY_PATH);
         }
 
         if (value != null) {
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 50c0a4b4f5..08905c1a2b 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,10 +1,12 @@
 package org.grails.orm.hibernate.cfg;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 import org.grails.datastore.mapping.model.PersistentEntity;
 import org.grails.datastore.mapping.model.PersistentProperty;
+import org.grails.datastore.mapping.model.config.GormProperties;
 import 
org.grails.orm.hibernate.cfg.domainbinding.ConfigureDerivedPropertiesConsumer;
 
 /**
@@ -33,10 +35,21 @@ public interface GrailsHibernatePersistentEntity extends 
PersistentEntity {
 
     boolean isAbstract();
 
-
-    @SuppressWarnings("unchecked")
-    default List<GrailsHibernatePersistentProperty> 
getHibernatePersistentProperties() {
-        return (List) getPersistentProperties();
+    /**
+     * @return The properties that should be bound to the Hibernate meta model
+     */
+    default List<GrailsHibernatePersistentProperty> 
getPersistentPropertiesToBind() {
+        return Optional.ofNullable(getPersistentProperties())
+                .stream()
+                .flatMap(java.util.Collection::stream)
+                .filter(GrailsHibernatePersistentProperty.class::isInstance)
+                .map(GrailsHibernatePersistentProperty.class::cast)
+                .filter(p -> p.getMappedForm() != null)
+                .filter(p -> !p.isIdentityProperty())
+                .filter(p -> !p.isCompositeIdProperty())
+                .filter(p -> !GormProperties.VERSION.equals(p.getName()))
+                .filter(p -> !p.isInherited())
+                .toList();
     }
 
     @Override
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java
index 26be8f29dc..c319757d71 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java
@@ -90,11 +90,5 @@ public class HibernatePersistentEntity extends 
AbstractPersistentEntity<Mapping>
         return (GrailsHibernatePersistentProperty) version;
     }
 
-    @Override
-    @SuppressWarnings("unchecked")
-    public java.util.List<GrailsHibernatePersistentProperty> 
getHibernatePersistentProperties() {
-        return (java.util.List) persistentProperties;
-    }
-
 
 }

Reply via email to