You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/03/05 18:31:21 UTC
(grails-core) 16/27: refactor(hibernate7): cleanup HibernateProxyHandler
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 <wb...@mac.com>
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;
}