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 acba702987ca0e995f1aef7b89b8caf7da8dfaa5 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Feb 23 20:20:48 2026 -0600 Spotless Apply --- .../orm/hibernate/GrailsHibernateTemplate.java | 2 +- .../grails/orm/hibernate/HibernateDatastore.java | 6 +- .../orm/hibernate/cfg/GrailsHibernateUtil.java | 81 ++--- .../cfg/GrailsNamedStrategyContributor.java | 47 ++- .../orm/hibernate/cfg/HibernateMappingContext.java | 40 ++- .../cfg/HibernateMappingContextConfiguration.java | 3 - .../grails/orm/hibernate/cfg/IdentityEnumType.java | 13 +- .../cfg/domainbinding/binder/EnumTypeBinder.java | 2 +- .../domainbinding/binder/GrailsDomainBinder.java | 1 - .../generator/GrailsIncrementGenerator.java | 31 +- .../generator/GrailsSequenceWrapper.java | 7 +- .../hibernate/HibernateIdentityMapping.java | 11 +- .../domainbinding/util/BasicValueIdCreator.java | 7 +- .../cfg/domainbinding/util/GrailsEnumType.java | 3 +- .../support/ClosureEventTriggeringInterceptor.java | 1 - ...urceAggregatePersistenceContextInterceptor.java | 137 +++---- .../AggregatePersistenceContextInterceptor.java | 31 +- .../GrailsOpenSessionInViewInterceptor.java | 83 +++-- .../HibernatePersistenceContextInterceptor.java | 395 ++++++++++----------- ...nFactoryAwarePersistenceContextInterceptor.java | 11 +- 20 files changed, 468 insertions(+), 444 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java index 4132e76824..4cde5ebfc7 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java @@ -466,7 +466,7 @@ public class GrailsHibernateTemplate implements IHibernateTemplate { if (lockMode == null) { session.refresh(entity); } else { - session.refresh(entity,lockMode); + session.refresh(entity, lockMode); } return null; }, diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java index 3a739069c5..7a99849d67 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java @@ -683,10 +683,8 @@ public class HibernateDatastore extends AbstractHibernateDatastore implements Me String dbCreate = tenantSettings.getDataSource().getDbCreate(); - Action schemaAutoTooling = - Action.interpretHbm2ddlSetting(dbCreate); - if (schemaAutoTooling != Action.VALIDATE - && schemaAutoTooling != Action.NONE) { + Action schemaAutoTooling = Action.interpretHbm2ddlSetting(dbCreate); + if (schemaAutoTooling != Action.VALIDATE && schemaAutoTooling != Action.NONE) { Connection connection = null; try { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java index 9d0749912b..b9d5099ddf 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java @@ -18,13 +18,12 @@ */ package org.grails.orm.hibernate.cfg; -import java.lang.annotation.Annotation; - +import grails.gorm.annotation.Entity; import groovy.lang.Closure; import groovy.lang.GroovyObject; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; - +import java.lang.annotation.Annotation; import org.grails.datastore.gorm.GormEntity; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.config.GormProperties; @@ -44,8 +43,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionSynchronizationManager; -import grails.gorm.annotation.Entity; - /** * Utility methods for configuring Hibernate inside Grails. * @@ -219,49 +216,49 @@ public class GrailsHibernateUtil extends HibernateRuntimeUtils { return StringHelper.unqualify(qualifiedName); } - public static boolean isDomainClass(Class clazz) { - if (GormEntity.class.isAssignableFrom(clazz)) { - return true; - } + public static boolean isDomainClass(Class clazz) { + if (GormEntity.class.isAssignableFrom(clazz)) { + return true; + } - // it's not a closure - if (Closure.class.isAssignableFrom(clazz)) { - return false; - } + // it's not a closure + if (Closure.class.isAssignableFrom(clazz)) { + return false; + } - if (((Class<?>) clazz).isEnum()) return false; + if (((Class<?>) clazz).isEnum()) return false; - Annotation[] allAnnotations = ((Class<?>) clazz).getAnnotations(); - for (Annotation annotation : allAnnotations) { - Class<? extends Annotation> type = annotation.annotationType(); - String annName = type.getName(); - if (annName.equals("grails.persistence.Entity")) { - return true; - } - if (type.equals(Entity.class)) { - return true; - } + Annotation[] allAnnotations = ((Class<?>) clazz).getAnnotations(); + for (Annotation annotation : allAnnotations) { + Class<? extends Annotation> type = annotation.annotationType(); + String annName = type.getName(); + if (annName.equals("grails.persistence.Entity")) { + return true; } + if (type.equals(Entity.class)) { + return true; + } + } - Class<?> testClass = (Class<?>) clazz; - while (testClass != null - && !testClass.equals(GroovyObject.class) - && !testClass.equals(Object.class)) { - try { - // make sure the identify and version field exist - testClass.getDeclaredField(GormProperties.IDENTITY); - testClass.getDeclaredField(GormProperties.VERSION); + Class<?> testClass = (Class<?>) clazz; + while (testClass != null + && !testClass.equals(GroovyObject.class) + && !testClass.equals(Object.class)) { + try { + // make sure the identify and version field exist + testClass.getDeclaredField(GormProperties.IDENTITY); + testClass.getDeclaredField(GormProperties.VERSION); - // passes all conditions return true - return true; - } catch (SecurityException e) { - // ignore - } catch (NoSuchFieldException e) { - // ignore - } - testClass = testClass.getSuperclass(); + // passes all conditions return true + return true; + } catch (SecurityException e) { + // ignore + } catch (NoSuchFieldException e) { + // ignore } - - return false; + testClass = testClass.getSuperclass(); } + + return false; + } } 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 index c404af4194..182e08f25f 100644 --- 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 @@ -1,28 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * https://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, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.grails.orm.hibernate.cfg; -import org.checkerframework.checker.units.qual.C; +import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; 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); - } + @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/HibernateMappingContext.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index f23f9d443b..a4ab22636c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -1,15 +1,20 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://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, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.grails.orm.hibernate.cfg; @@ -18,7 +23,6 @@ import groovy.lang.Closure; import java.util.ArrayList; import java.util.Collection; import java.util.List; - import org.grails.datastore.gorm.GormEntity; import org.grails.datastore.mapping.model.*; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.*; @@ -36,7 +40,10 @@ public class HibernateMappingContext extends AbstractMappingContext { private final HibernateMappingFactory mappingFactory; private final MappingConfigurationStrategy syntaxStrategy; - public HibernateMappingContext(HibernateConnectionSourceSettings settings, Object contextObject, Class... persistentClasses) { + public HibernateMappingContext( + HibernateConnectionSourceSettings settings, + Object contextObject, + Class... persistentClasses) { this.mappingFactory = new HibernateMappingFactory(); initialize(settings); if (settings != null) { @@ -49,7 +56,8 @@ public class HibernateMappingContext extends AbstractMappingContext { addPersistentEntities(persistentClasses); } - public HibernateMappingContext(HibernateConnectionSourceSettings settings, Class... persistentClasses) { + public HibernateMappingContext( + HibernateConnectionSourceSettings settings, Class... persistentClasses) { this(settings, null, persistentClasses); } @@ -84,7 +92,8 @@ public class HibernateMappingContext extends AbstractMappingContext { @Override protected boolean isValidMappingStrategy(Class javaClass, Object mappingStrategy) { - return HibernateEntity.class.isAssignableFrom(javaClass) || super.isValidMappingStrategy(javaClass, mappingStrategy); + return HibernateEntity.class.isAssignableFrom(javaClass) + || super.isValidMappingStrategy(javaClass, mappingStrategy); } @Override @@ -108,7 +117,8 @@ public class HibernateMappingContext extends AbstractMappingContext { return super.getPersistentEntity(name); } - public Collection<GrailsHibernatePersistentEntity> getHibernatePersistentEntities(String dataSourceName) { + public Collection<GrailsHibernatePersistentEntity> getHibernatePersistentEntities( + String dataSourceName) { List<GrailsHibernatePersistentEntity> result = new ArrayList<>(); if (persistentEntities != null) { for (PersistentEntity entity : persistentEntities) { @@ -120,4 +130,4 @@ public class HibernateMappingContext extends AbstractMappingContext { } return result; } -} \ No newline at end of file +} 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 b0b389e6b7..03a84c0293 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 @@ -294,9 +294,6 @@ public class HibernateMappingContextConfiguration extends Configuration .applyClassLoaderService(classLoaderService) .build(); - - - SessionFactoryObserver sessionFactoryObserver = new SessionFactoryObserver() { private static final long serialVersionUID = 1; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java index 8b081a3670..6624c9b225 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java @@ -19,7 +19,6 @@ package org.grails.orm.hibernate.cfg; import jakarta.persistence.AttributeConverter; - import java.io.Serial; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; @@ -29,7 +28,6 @@ import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.Properties; - import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.type.AbstractStandardBasicType; @@ -48,8 +46,7 @@ import org.slf4j.LoggerFactory; */ public class IdentityEnumType implements UserType, ParameterizedType, Serializable { - @Serial - private static final long serialVersionUID = -6625622185856547501L; + @Serial private static final long serialVersionUID = -6625622185856547501L; private static final Logger LOG = LoggerFactory.getLogger(IdentityEnumType.class); @@ -127,8 +124,6 @@ public class IdentityEnumType implements UserType, ParameterizedType, Serializab return o.hashCode(); } - - public Object deepCopy(Object o) throws HibernateException { return o; } @@ -149,9 +144,8 @@ public class IdentityEnumType implements UserType, ParameterizedType, Serializab return orig; } - public long getDefaultSqlLength() { - return UserType.super.getDefaultSqlLength(); + return UserType.super.getDefaultSqlLength(); } public int getDefaultSqlPrecision() { @@ -170,8 +164,7 @@ public class IdentityEnumType implements UserType, ParameterizedType, Serializab @SuppressWarnings({"rawtypes", "unchecked"}) private static class BidiEnumMap implements Serializable { - @Serial - private static final long serialVersionUID = 3325751131102095834L; + @Serial private static final long serialVersionUID = 3325751131102095834L; private final Map enumToKey; private final Map keytoEnum; private final Class keyType; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/EnumTypeBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/EnumTypeBinder.java index ad6f6ee61d..af71339c5b 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/EnumTypeBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/EnumTypeBinder.java @@ -20,8 +20,8 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import static org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBinder.ENUM_CLASS_PROP; -import java.util.Properties; import jakarta.persistence.EnumType; +import java.util.Properties; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.IdentityEnumType; import org.grails.orm.hibernate.cfg.PropertyConfig; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java index 90f8735489..6aeb23b2ab 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.java @@ -61,7 +61,6 @@ public class GrailsDomainBinder implements AdditionalMappingContributor, TypeCon public static final String EMPTY_PATH = ""; public static final char UNDERSCORE = '_'; - public static final String ENUM_CLASS_PROP = "enumClass"; public static final Logger LOG = LoggerFactory.getLogger(GrailsDomainBinder.class); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java index 42caacf91a..6eb270ddcd 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsIncrementGenerator.java @@ -18,6 +18,11 @@ */ package org.grails.orm.hibernate.cfg.domainbinding.generator; +import static org.hibernate.id.IncrementGenerator.COLUMN; +import static org.hibernate.id.IncrementGenerator.TABLES; +import static org.hibernate.id.PersistentIdentifierGenerator.CATALOG; +import static org.hibernate.id.PersistentIdentifierGenerator.SCHEMA; + import java.util.Properties; import org.grails.orm.hibernate.cfg.Identity; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -28,11 +33,6 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.IncrementGenerator; -import static org.hibernate.id.IncrementGenerator.COLUMN; -import static org.hibernate.id.IncrementGenerator.TABLES; -import static org.hibernate.id.PersistentIdentifierGenerator.CATALOG; -import static org.hibernate.id.PersistentIdentifierGenerator.SCHEMA; - /** * Grails-aware increment ID generator. Builds the standard {@link IncrementGenerator} parameters * from GORM mapping metadata and delegates entirely to the parent class — no reflection required. @@ -56,15 +56,19 @@ public class GrailsIncrementGenerator extends IncrementGenerator { org.grails.orm.hibernate.cfg.Mapping mapping = domainClass.getMappedForm(); if (mapping != null && mapping.getTable() != null) { - if (mapping.getTable().getCatalog() != null) params.put(CATALOG, mapping.getTable().getCatalog()); - if (mapping.getTable().getSchema() != null) params.put(SCHEMA, mapping.getTable().getSchema()); + if (mapping.getTable().getCatalog() != null) + params.put(CATALOG, mapping.getTable().getCatalog()); + if (mapping.getTable().getSchema() != null) + params.put(SCHEMA, mapping.getTable().getSchema()); } // Resolve column name — fall back to "id" if the property path is dotted (composite) String columnName = context.getProperty().getName(); if (columnName == null || columnName.contains(".")) { - columnName = (mappedId != null && mappedId.getName() != null - && !mappedId.getName().contains(".")) ? mappedId.getName() : "id"; + columnName = + (mappedId != null && mappedId.getName() != null && !mappedId.getName().contains(".")) + ? mappedId.getName() + : "id"; } params.put(COLUMN, columnName); @@ -74,11 +78,12 @@ public class GrailsIncrementGenerator extends IncrementGenerator { // Build SqlStringGenerationContext and initialize the SQL query JdbcEnvironment jdbcEnvironment = context.getDatabase().getJdbcEnvironment(); var physicalName = context.getDatabase().getDefaultNamespace().getPhysicalName(); - String catalog = physicalName.catalog() != null ? physicalName.catalog().getCanonicalName() : null; - String schema = physicalName.schema() != null ? physicalName.schema().getCanonicalName() : null; + String catalog = + physicalName.catalog() != null ? physicalName.catalog().getCanonicalName() : null; + String schema = physicalName.schema() != null ? physicalName.schema().getCanonicalName() : null; SqlStringGenerationContext sqlContext = - SqlStringGenerationContextImpl.fromExplicit(jdbcEnvironment, context.getDatabase(), catalog, schema); + SqlStringGenerationContextImpl.fromExplicit( + jdbcEnvironment, context.getDatabase(), catalog, schema); initialize(sqlContext); } } - diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java index 0bc7c3d7c7..5e6c4a9123 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceWrapper.java @@ -38,6 +38,11 @@ public class GrailsSequenceWrapper { JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy) { return GrailsSequenceGeneratorEnum.getGenerator( - fromName(name).orElse(NATIVE), context, mappedId, domainClass, jdbcEnvironment, namingStrategy); + fromName(name).orElse(NATIVE), + context, + mappedId, + domainClass, + jdbcEnvironment, + namingStrategy); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateIdentityMapping.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateIdentityMapping.java index 11761684fc..c755e5c6f2 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateIdentityMapping.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateIdentityMapping.java @@ -26,8 +26,8 @@ import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.Identity; /** - * {@link IdentityMapping} implementation for Hibernate that resolves identifier names - * from {@link Identity} and {@link CompositeIdentity} mapped forms. + * {@link IdentityMapping} implementation for Hibernate that resolves identifier names from {@link + * Identity} and {@link CompositeIdentity} mapped forms. */ public class HibernateIdentityMapping implements IdentityMapping<Property> { @@ -40,11 +40,12 @@ public class HibernateIdentityMapping implements IdentityMapping<Property> { /** * Constructs a HibernateIdentityMapping. * - * @param identity the identity mapped form ({@link Identity} or {@link CompositeIdentity}) - * @param generator the resolved {@link ValueGenerator} + * @param identity the identity mapped form ({@link Identity} or {@link CompositeIdentity}) + * @param generator the resolved {@link ValueGenerator} * @param classMapping the owning {@link ClassMapping} */ - public HibernateIdentityMapping(Object identity, ValueGenerator generator, ClassMapping classMapping) { + public HibernateIdentityMapping( + Object identity, ValueGenerator generator, ClassMapping classMapping) { this.identity = identity; this.generator = generator; this.classMapping = classMapping; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java index 0472e06809..3dabf06b47 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/BasicValueIdCreator.java @@ -37,7 +37,8 @@ public class BasicValueIdCreator { private final GrailsSequenceWrapper grailsSequenceWrapper; /** Creates a new {@link BasicValueIdCreator} instance. */ - public BasicValueIdCreator(JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy) { + public BasicValueIdCreator( + JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy) { this.jdbcEnvironment = jdbcEnvironment; this.namingStrategy = namingStrategy; this.grailsSequenceWrapper = new GrailsSequenceWrapper(); @@ -45,7 +46,9 @@ public class BasicValueIdCreator { /** Creates a new {@link BasicValueIdCreator} instance. */ protected BasicValueIdCreator( - JdbcEnvironment jdbcEnvironment, PersistentEntityNamingStrategy namingStrategy, GrailsSequenceWrapper grailsSequenceWrapper) { + JdbcEnvironment jdbcEnvironment, + PersistentEntityNamingStrategy namingStrategy, + GrailsSequenceWrapper grailsSequenceWrapper) { this.jdbcEnvironment = jdbcEnvironment; this.namingStrategy = namingStrategy; this.grailsSequenceWrapper = grailsSequenceWrapper; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.java index 01d9a99a29..5bd9dd5df3 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.java @@ -45,6 +45,7 @@ public enum GrailsEnumType { return candidate; } } - throw new MappingException("Invalid enum type [" + value + "]. Valid values are: default, string, ordinal, identity."); + throw new MappingException( + "Invalid enum type [" + value + "]. Valid values are: default, string, ordinal, identity."); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java index ad107e5722..8a8aca5f6c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java @@ -284,7 +284,6 @@ public class ClosureEventTriggeringInterceptor extends AbstractClosureEventTrigg private void updateModifiedPropertiesWithAutoTimestamp( Map<String, Object> modifiedProperties, PreUpdateEvent hibernateEvent) { - EntityPersister persister = hibernateEvent.getPersister(); EntityMappingType entityMappingType = persister.getEntityMappingType(); AttributeMapping dateCreatedMapping = diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java index 8fda4e23b4..6aa3f446b7 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java @@ -18,102 +18,107 @@ */ package org.grails.plugin.hibernate.support; +import grails.persistence.support.PersistenceContextInterceptor; import java.util.ArrayList; import java.util.List; - -import org.hibernate.SessionFactory; - -import grails.persistence.support.PersistenceContextInterceptor; import org.grails.datastore.mapping.core.connections.ConnectionSource; import org.grails.datastore.mapping.core.connections.ConnectionSources; import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; +import org.hibernate.SessionFactory; /** - * Abstract implementation of the {@link grails.persistence.support.PersistenceContextInterceptor} interface that supports multiple data sources + * Abstract implementation of the {@link grails.persistence.support.PersistenceContextInterceptor} + * interface that supports multiple data sources * * @author Graeme Rocher * @since 2.0.7 */ -public abstract class AbstractMultipleDataSourceAggregatePersistenceContextInterceptor implements PersistenceContextInterceptor { - - protected final List<PersistenceContextInterceptor> interceptors = new ArrayList<>(); - protected final AbstractHibernateDatastore hibernateDatastore; - - public AbstractMultipleDataSourceAggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { - this.hibernateDatastore = hibernateDatastore; - ConnectionSources<SessionFactory, HibernateConnectionSourceSettings> connectionSources = hibernateDatastore.getConnectionSources(); - Iterable<ConnectionSource<SessionFactory, HibernateConnectionSourceSettings>> allConnectionSources = connectionSources.getAllConnectionSources(); - for (ConnectionSource<SessionFactory, HibernateConnectionSourceSettings> connectionSource : allConnectionSources) { - SessionFactoryAwarePersistenceContextInterceptor interceptor = createPersistenceContextInterceptor(connectionSource.getName()); - this.interceptors.add(interceptor); - } +public abstract class AbstractMultipleDataSourceAggregatePersistenceContextInterceptor + implements PersistenceContextInterceptor { + + protected final List<PersistenceContextInterceptor> interceptors = new ArrayList<>(); + protected final AbstractHibernateDatastore hibernateDatastore; + + public AbstractMultipleDataSourceAggregatePersistenceContextInterceptor( + AbstractHibernateDatastore hibernateDatastore) { + this.hibernateDatastore = hibernateDatastore; + ConnectionSources<SessionFactory, HibernateConnectionSourceSettings> connectionSources = + hibernateDatastore.getConnectionSources(); + Iterable<ConnectionSource<SessionFactory, HibernateConnectionSourceSettings>> + allConnectionSources = connectionSources.getAllConnectionSources(); + for (ConnectionSource<SessionFactory, HibernateConnectionSourceSettings> connectionSource : + allConnectionSources) { + SessionFactoryAwarePersistenceContextInterceptor interceptor = + createPersistenceContextInterceptor(connectionSource.getName()); + this.interceptors.add(interceptor); } - - public boolean isOpen() { - for (PersistenceContextInterceptor interceptor : interceptors) { - if (interceptor.isOpen()) { - // true at least one is true - return true; - } - } - return false; + } + + public boolean isOpen() { + for (PersistenceContextInterceptor interceptor : interceptors) { + if (interceptor.isOpen()) { + // true at least one is true + return true; + } } + return false; + } - public void reconnect() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.reconnect(); - } + public void reconnect() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.reconnect(); } + } - public void destroy() { - for (PersistenceContextInterceptor interceptor : interceptors) { - try { - if (interceptor.isOpen()) { - interceptor.destroy(); - } - } catch (Exception e) { - // ignore exception - } + public void destroy() { + for (PersistenceContextInterceptor interceptor : interceptors) { + try { + if (interceptor.isOpen()) { + interceptor.destroy(); } + } catch (Exception e) { + // ignore exception + } } + } - public void clear() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.clear(); - } + public void clear() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.clear(); } + } - public void disconnect() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.disconnect(); - } + public void disconnect() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.disconnect(); } + } - public void flush() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.flush(); - } + public void flush() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.flush(); } + } - public void init() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.init(); - } + public void init() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.init(); } + } - public void setReadOnly() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.setReadOnly(); - } + public void setReadOnly() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.setReadOnly(); } + } - public void setReadWrite() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.setReadWrite(); - } + public void setReadWrite() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.setReadWrite(); } + } - protected abstract SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName); - + protected abstract SessionFactoryAwarePersistenceContextInterceptor + createPersistenceContextInterceptor(String dataSourceName); } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java index 060681f57d..49a336dbcc 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java @@ -16,29 +16,32 @@ * specific language governing permissions and limitations * under the License. */ - package org.grails.plugin.hibernate.support; import org.grails.orm.hibernate.AbstractHibernateDatastore; /** - * Concrete implementation of the {@link AbstractMultipleDataSourceAggregatePersistenceContextInterceptor} class for Hibernate 4 + * Concrete implementation of the {@link + * AbstractMultipleDataSourceAggregatePersistenceContextInterceptor} class for Hibernate 4 * * @author Graeme Rocher * @author Burt Beckwith */ -public class AggregatePersistenceContextInterceptor extends AbstractMultipleDataSourceAggregatePersistenceContextInterceptor { - - public AggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { - super(hibernateDatastore); - } +public class AggregatePersistenceContextInterceptor + extends AbstractMultipleDataSourceAggregatePersistenceContextInterceptor { - @Override - protected SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName) { - HibernatePersistenceContextInterceptor interceptor = new HibernatePersistenceContextInterceptor(dataSourceName); - AbstractHibernateDatastore datastoreForConnection = hibernateDatastore.getDatastoreForConnection(dataSourceName); - interceptor.setHibernateDatastore(datastoreForConnection); - return interceptor; - } + public AggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { + super(hibernateDatastore); + } + @Override + protected SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor( + String dataSourceName) { + HibernatePersistenceContextInterceptor interceptor = + new HibernatePersistenceContextInterceptor(dataSourceName); + AbstractHibernateDatastore datastoreForConnection = + hibernateDatastore.getDatastoreForConnection(dataSourceName); + interceptor.setHibernateDatastore(datastoreForConnection); + return interceptor; + } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java index 62bc0fdf0d..46502d0671 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java @@ -18,9 +18,9 @@ */ package org.grails.plugin.hibernate.support; +import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.hibernate.FlushMode; import org.hibernate.Session; - import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate5.SessionHolder; @@ -29,60 +29,57 @@ import org.springframework.transaction.support.TransactionSynchronizationManager import org.springframework.ui.ModelMap; import org.springframework.web.context.request.WebRequest; -import org.grails.orm.hibernate.AbstractHibernateDatastore; - /** - * Extends the default spring OSIV and doesn't flush the session if it has been set - * to MANUAL on the session itself. + * Extends the default spring OSIV and doesn't flush the session if it has been set to MANUAL on the + * session itself. * * @author Graeme Rocher * @since 0.5 */ public class GrailsOpenSessionInViewInterceptor extends OpenSessionInViewInterceptor { - protected FlushMode hibernateFlushMode = FlushMode.MANUAL; + protected FlushMode hibernateFlushMode = FlushMode.MANUAL; - @Override - protected Session openSession() throws DataAccessResourceFailureException { - Session session = super.openSession(); - applyFlushMode(session); - return session; - } + @Override + protected Session openSession() throws DataAccessResourceFailureException { + Session session = super.openSession(); + applyFlushMode(session); + return session; + } - protected void applyFlushMode(Session session) { - session.setHibernateFlushMode(hibernateFlushMode); - } + protected void applyFlushMode(Session session) { + session.setHibernateFlushMode(hibernateFlushMode); + } - @Override - public void postHandle(WebRequest request, ModelMap model) throws DataAccessException { - SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory()); - Session session = sessionHolder != null ? sessionHolder.getSession() : null; - try { - super.postHandle(request, model); - FlushMode flushMode = session != null ? session.getHibernateFlushMode() : null; - boolean isNotManual = flushMode != FlushMode.MANUAL && flushMode != FlushMode.COMMIT; - if (session != null && isNotManual) { - if (logger.isDebugEnabled()) { - logger.debug("Eagerly flushing Hibernate session"); - } - session.flush(); - } - } - finally { - if (session != null) { - session.setHibernateFlushMode(FlushMode.MANUAL); - } + @Override + public void postHandle(WebRequest request, ModelMap model) throws DataAccessException { + SessionHolder sessionHolder = + (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory()); + Session session = sessionHolder != null ? sessionHolder.getSession() : null; + try { + super.postHandle(request, model); + FlushMode flushMode = session != null ? session.getHibernateFlushMode() : null; + boolean isNotManual = flushMode != FlushMode.MANUAL && flushMode != FlushMode.COMMIT; + if (session != null && isNotManual) { + if (logger.isDebugEnabled()) { + logger.debug("Eagerly flushing Hibernate session"); } + session.flush(); + } + } finally { + if (session != null) { + session.setHibernateFlushMode(FlushMode.MANUAL); + } } + } - public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { - String defaultFlushModeName = hibernateDatastore.getDefaultFlushModeName(); - if (hibernateDatastore.isOsivReadOnly()) { - this.hibernateFlushMode = FlushMode.MANUAL; - } - else { - this.hibernateFlushMode = FlushMode.valueOf(defaultFlushModeName); - } - setSessionFactory(hibernateDatastore.getSessionFactory()); + public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { + String defaultFlushModeName = hibernateDatastore.getDefaultFlushModeName(); + if (hibernateDatastore.isOsivReadOnly()) { + this.hibernateFlushMode = FlushMode.MANUAL; + } else { + this.hibernateFlushMode = FlushMode.valueOf(defaultFlushModeName); } + setSessionFactory(hibernateDatastore.getSessionFactory()); + } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java index d3ea3d97af..d822c404be 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java @@ -16,228 +16,227 @@ * specific language governing permissions and limitations * under the License. */ - package org.grails.plugin.hibernate.support; +import grails.persistence.support.PersistenceContextInterceptor; +import grails.validation.DeferredBindingActions; import java.sql.Connection; import java.util.Deque; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentLinkedDeque; - +import org.grails.core.lifecycle.ShutdownOperations; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.orm.hibernate.AbstractHibernateDatastore; +import org.grails.orm.hibernate.support.HibernateRuntimeUtils; import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.springframework.orm.hibernate5.SessionFactoryUtils; import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; -import grails.persistence.support.PersistenceContextInterceptor; -import grails.validation.DeferredBindingActions; -import org.grails.core.lifecycle.ShutdownOperations; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.grails.orm.hibernate.support.HibernateRuntimeUtils; - /** * @author Graeme Rocher * @since 0.4 */ -public class HibernatePersistenceContextInterceptor implements PersistenceContextInterceptor, SessionFactoryAwarePersistenceContextInterceptor { +public class HibernatePersistenceContextInterceptor + implements PersistenceContextInterceptor, SessionFactoryAwarePersistenceContextInterceptor { - private static final Logger LOG = LoggerFactory.getLogger(HibernatePersistenceContextInterceptor.class); - private AbstractHibernateDatastore hibernateDatastore; + private static final Logger LOG = + LoggerFactory.getLogger(HibernatePersistenceContextInterceptor.class); + private AbstractHibernateDatastore hibernateDatastore; - private static ThreadLocal<Map<String, Boolean>> participate = ThreadLocal.withInitial(HashMap::new); + private static ThreadLocal<Map<String, Boolean>> participate = + ThreadLocal.withInitial(HashMap::new); - private static ThreadLocal<Map<String, Integer>> nestingCount = ThreadLocal.withInitial(HashMap::new); + private static ThreadLocal<Map<String, Integer>> nestingCount = + ThreadLocal.withInitial(HashMap::new); - private String dataSourceName; + private String dataSourceName; - static { - ShutdownOperations.addOperation(() -> { - participate.remove(); - nestingCount.remove(); + static { + ShutdownOperations.addOperation( + () -> { + participate.remove(); + nestingCount.remove(); }); - } - - private Deque<Connection> disconnected = new ConcurrentLinkedDeque<>(); - private final boolean transactionRequired; - - public HibernatePersistenceContextInterceptor() { - this(ConnectionSource.DEFAULT); - } - - /** - * @param dataSourceName a name of dataSource - */ - public HibernatePersistenceContextInterceptor(String dataSourceName) { - this.dataSourceName = dataSourceName; - this.transactionRequired = true; - } - - /* (non-Javadoc) - * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#destroy() - */ - public void destroy() { - DeferredBindingActions.clear(); - if (!disconnected.isEmpty()) { - disconnected.pop(); - } - if (getSessionFactory() == null || decNestingCount() > 0 || getParticipate()) { - return; - } - - // single session mode - SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory()); - LOG.debug("Closing single Hibernate session in GrailsDispatcherServlet"); - try { - disconnected.clear(); - SessionFactoryUtils.closeSession(holder.getSession()); - } - catch (RuntimeException ex) { - LOG.error("Unexpected exception on closing Hibernate Session", ex); - } - } - - public void disconnect() { - throw new UnsupportedOperationException("disconnect is not supported by Hibernate 6"); - } - - public void reconnect() { - throw new UnsupportedOperationException("reconnect is not supported by Hibernate 6"); - } - - public void flush() { - if (getSessionFactory() == null) return; - if (!getParticipate()) { - if (!transactionRequired) { - getSession().flush(); - } - else if (TransactionSynchronizationManager.isSynchronizationActive()) { - getSession().flush(); - } - } - } - - public void clear() { - if (getSessionFactory() == null) return; - getSession().clear(); - } - - public void setReadOnly() { - if (getSessionFactory() == null) return; - getSession().setHibernateFlushMode(FlushMode.MANUAL); - } - - public void setReadWrite() { - if (getSessionFactory() == null) return; - getSession().setHibernateFlushMode(FlushMode.AUTO); - } - - public boolean isOpen() { - if (getSessionFactory() == null) return false; - try { - return getSession(false).isOpen(); - } - catch (Exception e) { - return false; - } - } - - /* (non-Javadoc) - * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#init() - */ - public void init() { - if (incNestingCount() > 1) { - return; - } - SessionFactory sf = getSessionFactory(); - if (sf == null) { - return; - } - if (TransactionSynchronizationManager.hasResource(sf)) { - // Do not modify the Session: just set the participate flag. - setParticipate(true); - } - else { - setParticipate(false); - LOG.debug("Opening single Hibernate session in HibernatePersistenceContextInterceptor"); - Session session = getSession(); - HibernateRuntimeUtils.enableDynamicFilterEnablerIfPresent(sf, session); - TransactionSynchronizationManager.bindResource(sf, new SessionHolder(session)); - } - } - - private Session getSession() { - return getSession(true); - } - - private Session getSession(boolean allowCreate) { - - Object value = TransactionSynchronizationManager.getResource(getSessionFactory()); - if (value instanceof Session) { - return (Session) value; - } - - if (value instanceof SessionHolder) { - SessionHolder sessionHolder = (SessionHolder) value; - return sessionHolder.getSession(); - } - - if (allowCreate && hibernateDatastore != null) { - return hibernateDatastore.openSession(); - } - - throw new IllegalStateException("No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"); - } - - /** - * @return the sessionFactory - */ - public SessionFactory getSessionFactory() { - return hibernateDatastore.getSessionFactory(); - } - - public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { - this.hibernateDatastore = hibernateDatastore; - } - - @Override - public void setSessionFactory(SessionFactory sessionFactory) { - // ignore - } - - private int incNestingCount() { - Map<String, Integer> map = nestingCount.get(); - Integer current = map.get(dataSourceName); - int value = (current != null) ? current + 1 : 1; - map.put(dataSourceName, value); - return value; - } - - private int decNestingCount() { - Map<String, Integer> map = nestingCount.get(); - Integer current = map.get(dataSourceName); - int value = (current != null) ? current - 1 : 0; - if (value < 0) { - value = 0; - } - map.put(dataSourceName, value); - return value; - } - - private void setParticipate(boolean flag) { - Map<String, Boolean> map = participate.get(); - map.put(dataSourceName, flag); - } - - private boolean getParticipate() { - Map<String, Boolean> map = participate.get(); - Boolean ret = map.get(dataSourceName); - return (ret != null) ? ret : false; - } + } + + private Deque<Connection> disconnected = new ConcurrentLinkedDeque<>(); + private final boolean transactionRequired; + + public HibernatePersistenceContextInterceptor() { + this(ConnectionSource.DEFAULT); + } + + /** + * @param dataSourceName a name of dataSource + */ + public HibernatePersistenceContextInterceptor(String dataSourceName) { + this.dataSourceName = dataSourceName; + this.transactionRequired = true; + } + + /* (non-Javadoc) + * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#destroy() + */ + public void destroy() { + DeferredBindingActions.clear(); + if (!disconnected.isEmpty()) { + disconnected.pop(); + } + if (getSessionFactory() == null || decNestingCount() > 0 || getParticipate()) { + return; + } + + // single session mode + SessionHolder holder = + (SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory()); + LOG.debug("Closing single Hibernate session in GrailsDispatcherServlet"); + try { + disconnected.clear(); + SessionFactoryUtils.closeSession(holder.getSession()); + } catch (RuntimeException ex) { + LOG.error("Unexpected exception on closing Hibernate Session", ex); + } + } + + public void disconnect() { + throw new UnsupportedOperationException("disconnect is not supported by Hibernate 6"); + } + + public void reconnect() { + throw new UnsupportedOperationException("reconnect is not supported by Hibernate 6"); + } + + public void flush() { + if (getSessionFactory() == null) return; + if (!getParticipate()) { + if (!transactionRequired) { + getSession().flush(); + } else if (TransactionSynchronizationManager.isSynchronizationActive()) { + getSession().flush(); + } + } + } + + public void clear() { + if (getSessionFactory() == null) return; + getSession().clear(); + } + + public void setReadOnly() { + if (getSessionFactory() == null) return; + getSession().setHibernateFlushMode(FlushMode.MANUAL); + } + + public void setReadWrite() { + if (getSessionFactory() == null) return; + getSession().setHibernateFlushMode(FlushMode.AUTO); + } + + public boolean isOpen() { + if (getSessionFactory() == null) return false; + try { + return getSession(false).isOpen(); + } catch (Exception e) { + return false; + } + } + + /* (non-Javadoc) + * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#init() + */ + public void init() { + if (incNestingCount() > 1) { + return; + } + SessionFactory sf = getSessionFactory(); + if (sf == null) { + return; + } + if (TransactionSynchronizationManager.hasResource(sf)) { + // Do not modify the Session: just set the participate flag. + setParticipate(true); + } else { + setParticipate(false); + LOG.debug("Opening single Hibernate session in HibernatePersistenceContextInterceptor"); + Session session = getSession(); + HibernateRuntimeUtils.enableDynamicFilterEnablerIfPresent(sf, session); + TransactionSynchronizationManager.bindResource(sf, new SessionHolder(session)); + } + } + + private Session getSession() { + return getSession(true); + } + + private Session getSession(boolean allowCreate) { + + Object value = TransactionSynchronizationManager.getResource(getSessionFactory()); + if (value instanceof Session) { + return (Session) value; + } + + if (value instanceof SessionHolder) { + SessionHolder sessionHolder = (SessionHolder) value; + return sessionHolder.getSession(); + } + + if (allowCreate && hibernateDatastore != null) { + return hibernateDatastore.openSession(); + } + + throw new IllegalStateException( + "No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"); + } + + /** + * @return the sessionFactory + */ + public SessionFactory getSessionFactory() { + return hibernateDatastore.getSessionFactory(); + } + + public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { + this.hibernateDatastore = hibernateDatastore; + } + + @Override + public void setSessionFactory(SessionFactory sessionFactory) { + // ignore + } + + private int incNestingCount() { + Map<String, Integer> map = nestingCount.get(); + Integer current = map.get(dataSourceName); + int value = (current != null) ? current + 1 : 1; + map.put(dataSourceName, value); + return value; + } + + private int decNestingCount() { + Map<String, Integer> map = nestingCount.get(); + Integer current = map.get(dataSourceName); + int value = (current != null) ? current - 1 : 0; + if (value < 0) { + value = 0; + } + map.put(dataSourceName, value); + return value; + } + + private void setParticipate(boolean flag) { + Map<String, Boolean> map = participate.get(); + map.put(dataSourceName, flag); + } + + private boolean getParticipate() { + Map<String, Boolean> map = participate.get(); + Boolean ret = map.get(dataSourceName); + return (ret != null) ? ret : false; + } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java index 41ec12ebf9..762d70c095 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java @@ -18,17 +18,18 @@ */ package org.grails.plugin.hibernate.support; -import org.hibernate.SessionFactory; - import grails.persistence.support.PersistenceContextInterceptor; +import org.hibernate.SessionFactory; /** - * Interface for {@link grails.persistence.support.PersistenceContextInterceptor} instances that are aware of the {@link org.hibernate.SessionFactory} + * Interface for {@link grails.persistence.support.PersistenceContextInterceptor} instances that are + * aware of the {@link org.hibernate.SessionFactory} * * @author Graeme Rocher * @since 2.0.7 */ -public interface SessionFactoryAwarePersistenceContextInterceptor extends PersistenceContextInterceptor { +public interface SessionFactoryAwarePersistenceContextInterceptor + extends PersistenceContextInterceptor { - void setSessionFactory(SessionFactory sessionFactory); + void setSessionFactory(SessionFactory sessionFactory); }
