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
