This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 33ba7a40266fc3bdfdb057b1818d620702d87b9b Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Feb 23 09:08:14 2026 -0600 added GrailsNamedStrategyContributor and changed NamingStrategyContributor --- grails-data-hibernate7/DEPRECATIONS.md | 50 ---------------------- .../HIBERNATE7-GRAILS8-UPGRADE.md | 12 ------ .../cfg/GrailsNamedStrategyContributor.java | 28 ++++++++++++ .../cfg/HibernateMappingContextConfiguration.java | 13 +++--- .../domainbinding/util/NamingStrategyProvider.java | 8 ++-- ....registry.selector.spi.NamedStrategyContributor | 1 + .../NamingStrategyProviderSpec.groovy | 6 +-- 7 files changed, 41 insertions(+), 77 deletions(-) diff --git a/grails-data-hibernate7/DEPRECATIONS.md b/grails-data-hibernate7/DEPRECATIONS.md deleted file mode 100644 index de23915818..0000000000 --- a/grails-data-hibernate7/DEPRECATIONS.md +++ /dev/null @@ -1,50 +0,0 @@ -# Deprecation Warnings — grails-data-hibernate7 - -Generated from a clean build of `grails-data-hibernate7` (and its four Gradle subprojects) with `-Xlint:deprecation -Xlint:all` compiler flags. Only warnings originating from source files within this module are listed; warnings from generated stubs or upstream dependencies are excluded. - -> **Warning types** -> | Code | Meaning | -> |---|---| -> | `[deprecation]` | Uses a `@Deprecated` API | -> | `[removal]` | Uses an API deprecated and **marked for removal** | -> | `[unchecked]` | Unsafe unchecked / cast operation | -> | `[rawtypes]` | Uses a raw (un-parameterized) generic type | -> | `[serial]` | Serializable class without `serialVersionUID` | - ---- - -## Warnings table - -| Fully Qualified Class Name | Line | Warning | -|---|---|---| -| `org.grails.orm.hibernate.access.TraitPropertyAccessStrategy` | 39 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.access.TraitPropertyAccessStrategy` | 117 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 39 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 52 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 60 | `[rawtypes]` found raw type: Closure | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 70 | `[rawtypes]` found raw type: MappingFactory | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 75 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 86 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 91 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContext` | 96 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 99 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 115 | `[deprecation]` DATASOURCE in JdbcSettings has been deprecated | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 130 | `[deprecation]` DATASOURCE in JdbcSettings has been deprecated | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 150 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 158 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 259 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 261 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 262 | `[unchecked]` unchecked call to isAnnotationPresent(Class<? extends Annotation>) as a member of the raw type Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 268 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 275 | `[rawtypes]` found raw type: Class | -| `org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration` | 300 | `[removal]` \<T\>registerStrategyImplementor(Class\<T\>,String,Class\<? extends T\>) in StrategySelector has been deprecated and marked for removal | -| `org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity` | 194 | `[rawtypes]` found raw type: PersistentProperty | -| `org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty` | 155 | `[rawtypes]` found raw type: OneToOne | -| `org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentProperty` | 186 | `[rawtypes]` found raw type: OneToOne | -| `org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher` | 51 | `[rawtypes]` found raw type: Association | -| `org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyProvider` | 32 | `[removal]` CamelCaseToUnderscoresNamingStrategy in org.hibernate.boot.model.naming has been deprecated and marked for removal | -| `org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyProvider` | 57 | `[removal]` CamelCaseToUnderscoresNamingStrategy in org.hibernate.boot.model.naming has been deprecated and marked for removal | -| `org.grails.orm.hibernate.proxy.HibernateProxyHandler` | 54 | `[rawtypes]` found raw type: EntityProxy | -| `org.grails.orm.hibernate.proxy.HibernateProxyHandler` | 76 | `[rawtypes]` found raw type: EntityProxy | -| `org.grails.orm.hibernate.proxy.HibernateProxyHandler` | 95 | `[rawtypes]` found raw type: EntityProxy | -| `org.grails.orm.hibernate.proxy.HibernateProxyHandler` | 126 | `[rawtypes]` found raw type: EntityProxy | diff --git a/grails-data-hibernate7/HIBERNATE7-GRAILS8-UPGRADE.md b/grails-data-hibernate7/HIBERNATE7-GRAILS8-UPGRADE.md index 26ceec5eeb..851e975b26 100644 --- a/grails-data-hibernate7/HIBERNATE7-GRAILS8-UPGRADE.md +++ b/grails-data-hibernate7/HIBERNATE7-GRAILS8-UPGRADE.md @@ -164,18 +164,6 @@ Do **not** drop Hibernate 5.6 support in 8.0.0. Ship both: **Priority**: **P2** - SQL injection is OWASP #3. Framework should make the safe path the easy path. **Effort**: Medium -### 1.4 Static Compilation Coverage Expansion - -**Current state in grails-core/src/main**: 45 out of 73 Groovy files (62%) have `@CompileStatic` or `@GrailsCompileStatic`. - -Without `@CompileStatic`, every Groovy method call goes through dynamic dispatch: -- MetaClass lookup per call -- No JIT inlining -- Indy call site caching defeated by metaclass changes (ties into 1.1) -- GraalVM native image impossible for dynamically-dispatched code - -**Required work**: -1. Audit all `.groovy` files in `src/main` across every module for `@CompileStatic` eligibility ### 2.6 GORM Query Safety Audit diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsNamedStrategyContributor.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsNamedStrategyContributor.java new file mode 100644 index 0000000000..c404af4194 --- /dev/null +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsNamedStrategyContributor.java @@ -0,0 +1,28 @@ +package org.grails.orm.hibernate.cfg; + +import org.checkerframework.checker.units.qual.C; +import org.hibernate.boot.registry.selector.spi.NamedStrategyContributions; +import org.hibernate.boot.registry.selector.spi.NamedStrategyContributor; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.property.access.spi.PropertyAccessStrategy; + +import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; + +public class GrailsNamedStrategyContributor implements NamedStrategyContributor { + + @Override + public void contributeStrategyImplementations(NamedStrategyContributions contributions) { + contributions.contributeStrategyImplementor( + PropertyAccessStrategy.class, + TraitPropertyAccessStrategy.class, + "traitProperty" + ); + } + + @Override + public void clearStrategyImplementations(NamedStrategyContributions contributions) { + contributions.removeStrategyImplementor(PropertyAccessStrategy.class + , TraitPropertyAccessStrategy.class); + } + +} diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java index 9ae365ab19..b0b389e6b7 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java @@ -32,7 +32,6 @@ import org.grails.orm.hibernate.EventListenerIntegrator; import org.grails.orm.hibernate.GrailsSessionContext; import org.grails.orm.hibernate.HibernateEventListeners; import org.grails.orm.hibernate.MetadataIntegrator; -import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder; import org.hibernate.HibernateException; import org.hibernate.MappingException; @@ -44,14 +43,13 @@ import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.spi.AdditionalMappingContributor; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; +import org.hibernate.cfg.JdbcSettings; import org.hibernate.context.spi.CurrentSessionContext; import org.hibernate.internal.util.config.ConfigurationHelper; -import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.ServiceRegistryImplementor; import org.springframework.beans.BeansException; @@ -112,7 +110,7 @@ public class HibernateMappingContextConfiguration extends Configuration Properties properties = getProperties(); if (applicationContext.containsBean(dsName)) { - properties.put(Environment.DATASOURCE, applicationContext.getBean(dsName)); + properties.put(JdbcSettings.JAKARTA_NON_JTA_DATASOURCE, applicationContext.getBean(dsName)); } properties.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, currentSessionContext.getName()); properties.put(AvailableSettings.CLASSLOADERS, applicationContext.getClassLoader()); @@ -127,7 +125,7 @@ public class HibernateMappingContextConfiguration extends Configuration ConnectionSource<DataSource, DataSourceSettings> connectionSource) { this.dataSourceName = connectionSource.getName(); DataSource source = connectionSource.getSource(); - getProperties().put(Environment.DATASOURCE, source); + getProperties().put(JdbcSettings.JAKARTA_NON_JTA_DATASOURCE, source); getProperties() .put(Environment.CURRENT_SESSION_CONTEXT_CLASS, GrailsSessionContext.class.getName()); final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); @@ -295,10 +293,9 @@ public class HibernateMappingContextConfiguration extends Configuration .applyIntegrator(new MetadataIntegrator()) .applyClassLoaderService(classLoaderService) .build(); - StrategySelector strategySelector = bootstrapServiceRegistry.getService(StrategySelector.class); - strategySelector.registerStrategyImplementor( - PropertyAccessStrategy.class, "traitProperty", TraitPropertyAccessStrategy.class); + + SessionFactoryObserver sessionFactoryObserver = new SessionFactoryObserver() { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyProvider.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyProvider.java index 7a36ab44fd..8883252ce3 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyProvider.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyProvider.java @@ -21,15 +21,15 @@ package org.grails.orm.hibernate.cfg.domainbinding.util; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; +import org.hibernate.boot.model.naming.PhysicalNamingStrategySnakeCaseImpl; public class NamingStrategyProvider { private final ConcurrentHashMap<String, PhysicalNamingStrategy> physicalProviderMap; public NamingStrategyProvider() { physicalProviderMap = new ConcurrentHashMap<>(); - physicalProviderMap.put(ConnectionSource.DEFAULT, new CamelCaseToUnderscoresNamingStrategy()); + physicalProviderMap.put(ConnectionSource.DEFAULT, new PhysicalNamingStrategySnakeCaseImpl()); } /** @@ -54,7 +54,7 @@ public class NamingStrategyProvider { if (strategyInstance instanceof PhysicalNamingStrategy physicalStrategy) { physicalProviderMap.put(datasourceName, physicalStrategy); } else { - physicalProviderMap.put(datasourceName, new CamelCaseToUnderscoresNamingStrategy()); + physicalProviderMap.put(datasourceName, new PhysicalNamingStrategySnakeCaseImpl()); } } @@ -78,7 +78,7 @@ public class NamingStrategyProvider { public PhysicalNamingStrategy getPhysicalNamingStrategy(String sessionFactoryBeanName) { String key = getKey(sessionFactoryBeanName); - physicalProviderMap.putIfAbsent(key, new CamelCaseToUnderscoresNamingStrategy()); + physicalProviderMap.putIfAbsent(key, new PhysicalNamingStrategySnakeCaseImpl()); return physicalProviderMap.get(key); } diff --git a/grails-data-hibernate7/core/src/main/resources/META-INF/services/org.hibernate.boot.registry.selector.spi.NamedStrategyContributor b/grails-data-hibernate7/core/src/main/resources/META-INF/services/org.hibernate.boot.registry.selector.spi.NamedStrategyContributor new file mode 100644 index 0000000000..b3bece347f --- /dev/null +++ b/grails-data-hibernate7/core/src/main/resources/META-INF/services/org.hibernate.boot.registry.selector.spi.NamedStrategyContributor @@ -0,0 +1 @@ +org.grails.orm.hibernate.cfg.GrailsNamedStrategyContributor \ No newline at end of file diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyProviderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyProviderSpec.groovy index a132f12823..83c1e036e8 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyProviderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyProviderSpec.groovy @@ -1,7 +1,7 @@ package org.grails.orm.hibernate.cfg.domainbinding import grails.gorm.specs.HibernateGormDatastoreSpec -import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy +import org.hibernate.boot.model.naming.PhysicalNamingStrategySnakeCaseImpl import org.hibernate.boot.model.naming.PhysicalNamingStrategy import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyProvider @@ -14,7 +14,7 @@ class NamingStrategyProviderSpec extends HibernateGormDatastoreSpec { def strategy = provider.getPhysicalNamingStrategy("sessionFactory") then: - strategy instanceof CamelCaseToUnderscoresNamingStrategy + strategy instanceof PhysicalNamingStrategySnakeCaseImpl } void "Test configureNamingStrategy with null strategy throws exception"() { @@ -73,7 +73,7 @@ class NamingStrategyProviderSpec extends HibernateGormDatastoreSpec { def strategy = provider.getPhysicalNamingStrategy("sessionFactory") then: - strategy instanceof CamelCaseToUnderscoresNamingStrategy + strategy instanceof PhysicalNamingStrategySnakeCaseImpl } void "Test getPhysicalNamingStrategy with custom session factory"() {
