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 afd4c177af9af2e2636134c20da2a9222aef7bb3
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Sat Mar 7 16:19:50 2026 -0600

    hibernate7: removed deprecated code from HibernateGormInstanceApi
---
 .../orm/hibernate/HibernateGormInstanceApi.groovy  | 139 +++++++--------------
 1 file changed, 43 insertions(+), 96 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
index 6e80ef9baf..195da3939c 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy
@@ -1,11 +1,11 @@
 /*
- * Copyright 2013 the original author or authors.
+ * Copyright 2013-2026 the original author or authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *      http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +15,12 @@
  */
 package org.grails.orm.hibernate
 
+import org.hibernate.LockMode
+
 import grails.gorm.validation.CascadingValidator
 import groovy.transform.CompileStatic
 import jakarta.persistence.FlushModeType
+import jakarta.persistence.LockModeType
 import org.codehaus.groovy.runtime.InvokerHelper
 import org.grails.datastore.gorm.GormInstanceApi
 import org.grails.datastore.gorm.GormValidateable
@@ -35,13 +38,11 @@ import org.grails.orm.hibernate.cfg.GrailsHibernateUtil
 import org.grails.orm.hibernate.support.HibernateRuntimeUtils
 
 import org.hibernate.HibernateException
-import org.hibernate.LockMode
 import org.hibernate.Session
 import org.hibernate.SessionFactory
 import org.hibernate.engine.spi.EntityEntry
 import org.hibernate.engine.spi.SessionImplementor
 import org.hibernate.persister.entity.EntityPersister
-import org.hibernate.tuple.NonIdentifierAttribute
 import org.springframework.beans.BeanWrapperImpl
 import org.springframework.beans.InvalidPropertyException
 import org.springframework.dao.DataAccessException
@@ -49,10 +50,7 @@ import org.springframework.validation.Errors
 import org.springframework.validation.Validator
 
 /**
- * The implementation of the GORM instance API contract for Hibernate.
- *
- * @author Graeme Rocher
- * @since 1.0
+ * The implementation of the GORM instance API contract for Hibernate 7.
  */
 @CompileStatic
 class HibernateGormInstanceApi<D> extends GormInstanceApi<D> {
@@ -78,9 +76,7 @@ class HibernateGormInstanceApi<D> extends GormInstanceApi<D> {
     protected SessionFactory sessionFactory
     protected ClassLoader classLoader
     protected IHibernateTemplate hibernateTemplate
-
     boolean autoFlush
-
     protected InstanceApiHelper instanceApiHelper
 
     HibernateGormInstanceApi(Class<D> persistentClass, HibernateDatastore 
datastore, ClassLoader classLoader) {
@@ -110,7 +106,6 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
 
         if (shouldValidate) {
             Validator validator = 
datastore.mappingContext.getEntityValidator(domainClass)
-
             Errors errors = HibernateRuntimeUtils.setupErrorsProperty(target)
 
             if (validator) {
@@ -131,7 +126,6 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
                     }
                     return null
                 }
-
                 setObjectToReadWrite(target)
             }
         }
@@ -156,8 +150,6 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
 
     private static void runDeferredBinding() {
         if (DEFERRED_BINDING != null) {
-            // DeferredBindingActions is from grails-data-binding (optional 
dep); invoked via reflection
-            // because it belongs to the migration plugin, which runs once per 
deployment and need not be on the compile classpath
             DEFERRED_BINDING.getMethod('runActions').invoke(null)
         }
     }
@@ -195,7 +187,7 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         catch (DataAccessException e) {
             try {
                 hibernateTemplate.execute { Session session ->
-                    session.flushMode = FlushModeType.COMMIT
+                    session.setFlushMode(FlushModeType.COMMIT)
                 }
             }
             finally {
@@ -231,7 +223,7 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
     protected D performMerge(final D target, final boolean flush) {
         hibernateTemplate.execute { Session session ->
             Object merged = session.merge(target)
-            session.lock(merged, LockMode.NONE)
+            session.lock(merged, LockModeType.NONE)
             if (flush) {
                 flushSession session
             }
@@ -258,7 +250,7 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         try {
             session.flush()
         } catch (HibernateException e) {
-            session.setFlushMode FlushModeType.COMMIT
+            session.setFlushMode(FlushModeType.COMMIT)
             throw e
         }
     }
@@ -270,7 +262,6 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         for (PersistentProperty prop in entity.associations) {
             if (prop instanceof ToOne && !(prop instanceof Embedded)) {
                 ToOne toOne = (ToOne) prop
-
                 def propertyName = prop.name
                 def propValue = reflector.getProperty(target, propertyName)
                 if (propValue == null || t.contains(propValue)) {
@@ -278,14 +269,10 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
                 }
 
                 PersistentEntity otherSide = toOne.associatedEntity
-                if (otherSide == null) {
-                    continue
-                }
+                if (otherSide == null) continue
 
                 def identity = otherSide.identity
-                if (identity == null) {
-                    continue
-                }
+                if (identity == null) continue
 
                 def otherSideReflector = 
datastore.mappingContext.getEntityReflector(otherSide)
                 try {
@@ -297,17 +284,13 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
                         }
                     }
                 }
-                catch (InvalidPropertyException ignored) {
-                    // property is not accessable
-                }
+                catch (InvalidPropertyException ignored) {}
             }
         }
     }
 
     private static boolean shouldValidate(Map arguments, PersistentEntity 
entity) {
-        if (!entity) {
-            return false
-        }
+        if (!entity) return false
         if (arguments?.containsKey(ARGUMENT_VALIDATE)) {
             return ClassUtils.getBooleanFromMap(ARGUMENT_VALIDATE, arguments)
         }
@@ -345,7 +328,7 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         return null
     }
 
-    protected void setErrorsOnInstance(Object target, Errors errors) {
+    protected static void setErrorsOnInstance(Object target, Errors errors) {
         if (target instanceof GormValidateable) {
             ((GormValidateable) target).setErrors(errors)
         } else {
@@ -361,113 +344,77 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
         insertActiveThreadLocal.remove()
     }
 
-    /**
-     * Checks whether a field is dirty
-     *
-     * @param instance The instance
-     * @param fieldName The name of the field
-     *
-     * @return true if the field is dirty
-     */
+    // --- Dirty Checking Logic ---
+
     boolean isDirty(D instance, String fieldName) {
         SessionImplementor session = (SessionImplementor) 
sessionFactory.currentSession
         EntityEntry entry = findEntityEntry(instance, session)
-        if (!entry || !entry.loadedState) {
-            return false
-        }
+        if (!entry || !entry.loadedState) return false
 
         EntityPersister persister = entry.persister
-        Object[] values = persister.getPropertyValues(instance)
+        Object[] values = persister.getValues(instance)
         int[] dirtyProperties = findDirty(persister, values, entry, instance, 
session)
-        if (dirtyProperties == null) {
-            return false
-        }
-        NonIdentifierAttribute[] props = 
persister.getEntityMetamodel().getProperties()
+        if (dirtyProperties == null) return false
+
+        String[] propertyNames = persister.getPropertyNames()
         int fieldIndex = -1
-        for (int i = 0; i < props.length; i++) {
-            if (props[i].name == fieldName) { fieldIndex = i; break }
+        for (int i = 0; i < propertyNames.length; i++) {
+            if (propertyNames[i] == fieldName) { fieldIndex = i; break }
         }
         return fieldIndex in dirtyProperties
     }
 
-    private int[] findDirty(EntityPersister persister, Object[] values, 
EntityEntry entry, D instance, SessionImplementor session) {
-        persister.findDirty(values, entry.loadedState, instance, session)
-    }
-
-    /**
-     * Checks whether an entity is dirty
-     *
-     * @param instance The instance
-     * @return true if it is dirty
-     */
     boolean isDirty(D instance) {
         SessionImplementor session = (SessionImplementor) 
sessionFactory.currentSession
         EntityEntry entry = findEntityEntry(instance, session)
-        if (!entry || !entry.loadedState) {
-            return false
-        }
+        if (!entry || !entry.loadedState) return false
+
         EntityPersister persister = entry.persister
-        Object[] currentState = persister.getPropertyValues(instance)
+        Object[] currentState = persister.getValues(instance)
         int[] dirtyPropertyIndexes = findDirty(persister, currentState, entry, 
instance, session)
         return dirtyPropertyIndexes != null
     }
 
-    /**
-     * Obtains a list of property names that are dirty
-     *
-     * @param instance The instance
-     * @return A list of property names that are dirty
-     */
     List<String> getDirtyPropertyNames(D instance) {
         SessionImplementor session = (SessionImplementor) 
sessionFactory.currentSession
         EntityEntry entry = findEntityEntry(instance, session)
-        if (!entry || !entry.loadedState) {
-            return []
-        }
+        if (!entry || !entry.loadedState) return []
 
         EntityPersister persister = entry.persister
-        Object[] currentState = persister.getPropertyValues(instance)
+        Object[] currentState = persister.getValues(instance)
         int[] dirtyPropertyIndexes = findDirty(persister, currentState, entry, 
instance, session)
+
         List<String> names = []
-        NonIdentifierAttribute[] entityProperties = 
persister.getEntityMetamodel().getProperties()
+        String[] propertyNames = persister.getPropertyNames()
         if (dirtyPropertyIndexes != null) {
             for (int index : dirtyPropertyIndexes) {
-                names.add(entityProperties[index].name)
+                names.add(propertyNames[index])
             }
         }
         return names
     }
 
-    /**
-     * Gets the original persisted value of a field.
-     *
-     * @param fieldName The field name
-     * @return The original persisted value
-     */
     Object getPersistentValue(D instance, String fieldName) {
         SessionImplementor session = (SessionImplementor) 
sessionFactory.currentSession
         def entry = findEntityEntry(instance, session, false)
-        if (!entry || !entry.loadedState) {
-            return null
-        }
+        if (!entry || !entry.loadedState) return null
 
         EntityPersister persister = entry.persister
-        int fieldIndex = 
persister.getEntityMetamodel().getProperties().findIndexOf {
-            NonIdentifierAttribute attribute -> fieldName == attribute.name
-        }
+        String[] propertyNames = persister.getPropertyNames()
+        int fieldIndex = propertyNames.findIndexOf { it == fieldName }
         return fieldIndex == -1 ? null : entry.loadedState[fieldIndex]
     }
 
-    protected EntityEntry findEntityEntry(D instance, SessionImplementor 
session, boolean forDirtyCheck = true) {
-        def entry = session.persistenceContext.getEntry(instance)
-        if (!entry) {
-            return null
-        }
+    // --- Helper Methods using proper Generic definitions to satisfy stubs ---
 
-        if (forDirtyCheck && !entry.requiresDirtyCheck(instance) && 
entry.loadedState) {
-            return null
-        }
+    private static <T> int[] findDirty(EntityPersister persister, Object[] 
values, EntityEntry entry, T instance, SessionImplementor session) {
+        persister.findDirty(values, entry.loadedState, instance, session)
+    }
 
+    protected static <T> EntityEntry findEntityEntry(T instance, 
SessionImplementor session, boolean forDirtyCheck = true) {
+        def entry = session.persistenceContext.getEntry(instance)
+        if (!entry) return null
+        if (forDirtyCheck && !entry.requiresDirtyCheck(instance) && 
entry.loadedState) return null
         return entry
     }
 
@@ -478,4 +425,4 @@ class HibernateGormInstanceApi<D> extends 
GormInstanceApi<D> {
     void setObjectToReadOnly(Object target) {
         GrailsHibernateUtil.setObjectToReadyOnly(target, sessionFactory)
     }
-}
+}
\ No newline at end of file

Reply via email to