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 5daf86f074e69a67196785e6c58aab01e5d1ca63
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Wed Mar 4 16:34:47 2026 -0600

    refactor(hibernate7): cleanup HibernateProxyHandler
---
 .../dirty/GrailsEntityDirtinessStrategy.groovy     | 69 +++++++---------------
 .../multitenancy/MultiTenantEventListener.java     | 16 +++--
 .../orm/hibernate/proxy/HibernateProxyHandler.java |  8 +--
 3 files changed, 31 insertions(+), 62 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy
index 6d13d2289b..d6684f9a6a 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy
@@ -88,56 +88,27 @@ class GrailsEntityDirtinessStrategy implements 
CustomEntityDirtinessStrategy {
     }
 
     @Override
-    void findDirty(Object entity, EntityPersister persister, Session session, 
CustomEntityDirtinessStrategy.DirtyCheckContext dirtyCheckContext) {
+    void findDirty(Object entity, EntityPersister persister, Session session, 
DirtyCheckContext dirtyCheckContext) {
+        if (!(entity instanceof DirtyCheckable)) return
         Status status = getStatus(session, entity)
-        if(entity instanceof DirtyCheckable) {
-            dirtyCheckContext.doDirtyChecking(
-                    new CustomEntityDirtinessStrategy.AttributeChecker() {
-                        @Override
-                        boolean 
isDirty(CustomEntityDirtinessStrategy.AttributeInformation 
attributeInformation) {
-                            String propertyName = attributeInformation.name
-                            if(status != null) {
-                                if(status == Status.MANAGED) {
-                                    // perform dirty check
-                                    DirtyCheckable dirtyCheckable = 
cast(entity)
-                                    if(GormProperties.LAST_UPDATED == 
propertyName) {
-                                        return dirtyCheckable.hasChanged()
-                                    }
-                                    else {
-                                        
if(dirtyCheckable.hasChanged(propertyName)) {
-                                            return true
-                                        }
-                                        else {
-                                            PersistentEntity gormEntity = 
GormEnhancer.findEntity(Hibernate.getClass(entity))
-                                            PersistentProperty prop = 
gormEntity.getPropertyByName(attributeInformation.name)
-                                            if(prop instanceof Embedded) {
-                                                def val = 
prop.reader.read(entity)
-                                                if( val instanceof 
DirtyCheckable ) {
-                                                    return 
((DirtyCheckable)val).hasChanged()
-                                                }
-                                                else {
-                                                    return false
-                                                }
-                                            }
-                                            else {
-                                                return false
-                                            }
-                                        }
-                                    }
-                                }
-                                else {
-                                    // either deleted or in a state that 
cannot be regarded as dirty
-                                    return false
-                                }
-                            }
-                            else {
-                                // a new object not within the session
-                                return true
-                            }
-                        }
-                    }
-            )
-        }
+        DirtyCheckable dirtyCheckable = cast(entity)
+        dirtyCheckContext.doDirtyChecking({ AttributeInformation info ->
+            // new object not yet in session — always dirty
+            if (status == null) return true
+            // deleted/gone/loading — not dirty
+            if (status != Status.MANAGED) return false
+            // lastUpdated is refreshed whenever anything changes
+            if (GormProperties.LAST_UPDATED == info.name) return 
dirtyCheckable.hasChanged()
+            // property-level check
+            if (dirtyCheckable.hasChanged(info.name)) return true
+            // embedded component — delegate to the embedded object's dirty 
tracking
+            PersistentProperty prop = 
GormEnhancer.findEntity(Hibernate.getClass(entity))?.getPropertyByName(info.name)
+            if (prop instanceof Embedded) {
+                def val = prop.reader.read(entity)
+                return val instanceof DirtyCheckable && val.hasChanged()
+            }
+            return false
+        } as AttributeChecker)
     }
 
     Status getStatus(Session session, Object entity) {
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java
index 145fd11797..110eff7988 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java
@@ -20,13 +20,15 @@ package org.grails.orm.hibernate.multitenancy;
 
 import grails.gorm.multitenancy.Tenants;
 import java.io.Serializable;
+
+import jakarta.annotation.Nullable;
+
 import org.grails.datastore.gorm.GormEnhancer;
 import org.grails.datastore.mapping.core.Datastore;
 import org.grails.datastore.mapping.core.connections.ConnectionSource;
 import org.grails.datastore.mapping.engine.event.*;
 import org.grails.datastore.mapping.model.PersistentEntity;
 import org.grails.datastore.mapping.model.types.TenantId;
-import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore;
 import org.grails.datastore.mapping.multitenancy.exceptions.TenantException;
 import org.grails.datastore.mapping.query.Query;
 import org.grails.datastore.mapping.query.event.PreQueryEvent;
@@ -43,7 +45,7 @@ import org.springframework.context.ApplicationEvent;
  */
 public class MultiTenantEventListener implements PersistenceEventListener {
   @Override
-  public boolean supportsEventType(Class<? extends ApplicationEvent> 
eventType) {
+  public boolean supportsEventType(@Nullable  Class<? extends 
ApplicationEvent> eventType) {
     return 
org.grails.datastore.gorm.multitenancy.MultiTenantEventListener.SUPPORTED_EVENTS
         .contains(eventType);
   }
@@ -75,18 +77,14 @@ public class MultiTenantEventListener implements 
PersistenceEventListener {
               || persistenceEvent instanceof PreUpdateEvent)) {
         PersistentEntity entity = persistenceEvent.getEntity();
         if (entity.isMultiTenant()) {
-          TenantId tenantId = entity.getTenantId();
+          TenantId<?> tenantId = entity.getTenantId();
           Datastore ds =
               (datastore != null) ? datastore : 
GormEnhancer.findDatastore(entity.getJavaClass());
           if (ds instanceof HibernateDatastore hibernateDatastore) {
             Serializable currentId;
 
-            if (hibernateDatastore instanceof MultiTenantCapableDatastore) {
-              currentId = Tenants.currentId((MultiTenantCapableDatastore) 
hibernateDatastore);
-            } else {
-              currentId = Tenants.currentId(hibernateDatastore.getClass());
-            }
-            if (currentId != null) {
+              currentId = Tenants.currentId(hibernateDatastore);
+              if (currentId != null) {
               try {
                 if (ConnectionSource.DEFAULT.equals(currentId)) {
                   currentId =
diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java
index bf2ec37050..10cf05ccb6 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java
@@ -52,7 +52,7 @@ public class HibernateProxyHandler implements ProxyHandler, 
ProxyFactory {
     if (o instanceof HibernateProxy hp) {
       return !hp.getHibernateLazyInitializer().isUninitialized();
     }
-    if (o instanceof EntityProxy ep) {
+    if (o instanceof EntityProxy<?> ep) {
       return ep.isInitialized();
     }
     if (o instanceof LazyInitializable li) {
@@ -74,7 +74,7 @@ public class HibernateProxyHandler implements ProxyHandler, 
ProxyFactory {
 
   @Override
   public Object unwrap(Object object) {
-    if (object instanceof EntityProxy ep) {
+    if (object instanceof EntityProxy<?> ep) {
       return ep.getTarget();
     }
 
@@ -93,7 +93,7 @@ public class HibernateProxyHandler implements ProxyHandler, 
ProxyFactory {
 
   @Override
   public Serializable getIdentifier(Object o) {
-    if (o instanceof EntityProxy ep) {
+    if (o instanceof EntityProxy<?> ep) {
       return ep.getProxyKey();
     }
 
@@ -124,7 +124,7 @@ public class HibernateProxyHandler implements ProxyHandler, 
ProxyFactory {
 
   @Override
   public void initialize(Object o) {
-    if (o instanceof EntityProxy ep) {
+    if (o instanceof EntityProxy<?> ep) {
       ep.initialize();
       return;
     }

Reply via email to