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; }
