diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionPropertyHolder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionPropertyHolder.java index 0e1b1681bca8..4cec3d9e2fd3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionPropertyHolder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionPropertyHolder.java @@ -99,11 +99,11 @@ private void applyLocalConvert( Map elementAttributeConversionInfoMap, Map keyAttributeConversionInfoMap) { - // IMPL NOTE : the rules here are quite more lenient than what JPA says. For example, JPA says that @Convert - // on a Map of basic types should default to "value" but it should explicitly specify attributeName of "key" + // IMPL NOTE: the rules here are quite more lenient than what JPA says. For example, JPA says that @Convert + // on a Map of basic types should default to "value" but it should explicitly specify 'attributeName' of "key" // (or prefixed with "key." for embedded paths) to be applied on the key. However, we try to see if conversion - // of either is disabled for whatever reason. For example, if the Map is annotated with @Enumerated the - // elements cannot be converted so any @Convert likely meant the key, so we apply it to the key + // of either is disabled for whatever reason. For example, if the Map is annotated with @Enumerated, the + // elements cannot be converted, and so any @Convert likely meant the key, so we apply it to the key final var info = new AttributeConversionInfo( convertAnnotation, collectionProperty ); final String attributeName = info.getAttributeName(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/DefaultJtaPlatformSelector.java b/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/DefaultJtaPlatformSelector.java index 928865dce313..5f8f838b1a55 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/DefaultJtaPlatformSelector.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/DefaultJtaPlatformSelector.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Objects; -import org.hibernate.cfg.AvailableSettings; +import org.hibernate.cfg.TransactionSettings; import org.hibernate.engine.transaction.jta.platform.internal.AtomikosJtaPlatform; import org.hibernate.engine.transaction.jta.platform.internal.JBossAppServerJtaPlatform; import org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform; @@ -18,7 +18,8 @@ import org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform; import org.hibernate.engine.transaction.jta.platform.internal.WildFlyStandAloneJtaPlatform; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; -import org.hibernate.internal.log.DeprecationLogger; + +import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; public class DefaultJtaPlatformSelector implements LazyServiceResolver { @@ -35,8 +36,9 @@ else if ( name.startsWith( "org." ) ) { return switch ( name ) { case "JBossAS" -> JBossAppServerJtaPlatform.class; case "JBossTS" -> { - DeprecationLogger.DEPRECATION_LOGGER.logDeprecatedJtaPlatformSetting( - AvailableSettings.JTA_PLATFORM, name, List.of( "Narayana", "WildFlyStandadlone" ) ); + DEPRECATION_LOGGER.deprecatedJtaPlatformSetting( + TransactionSettings.JTA_PLATFORM, name, + List.of( "Narayana", "WildFlyStandadlone" ) ); yield JBossStandAloneJtaPlatform.class; } case "Weblogic" -> WeblogicJtaPlatform.class; @@ -66,8 +68,9 @@ private static Class legacy( return JBossAppServerJtaPlatform.class; } case "org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" -> { - DeprecationLogger.DEPRECATION_LOGGER.logDeprecatedJtaPlatformSetting( - AvailableSettings.JTA_PLATFORM, name, List.of( "Narayana", "WildFlyStandadlone" ) ); + DEPRECATION_LOGGER.deprecatedJtaPlatformSetting( + TransactionSettings.JTA_PLATFORM, name, + List.of( "Narayana", "WildFlyStandadlone" ) ); return JBossStandAloneJtaPlatform.class; } case "org.hibernate.engine.transaction.jta.platform.internal.NarayanaJtaPlatform" -> { diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/RegionFactoryInitiator.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/RegionFactoryInitiator.java index bef05c90747d..e0199ee78f8a 100644 --- a/hibernate-core/src/main/java/org/hibernate/cache/internal/RegionFactoryInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/RegionFactoryInitiator.java @@ -11,12 +11,11 @@ import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.cache.CacheException; import org.hibernate.cache.spi.RegionFactory; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.service.spi.ServiceRegistryImplementor; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; +import static org.hibernate.cache.spi.SecondLevelCacheLogger.L2CACHE_LOGGER; import static org.hibernate.cfg.CacheSettings.CACHE_REGION_FACTORY; import static org.hibernate.cfg.CacheSettings.USE_QUERY_CACHE; import static org.hibernate.cfg.CacheSettings.USE_SECOND_LEVEL_CACHE; @@ -30,8 +29,6 @@ */ public class RegionFactoryInitiator implements StandardServiceInitiator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( RegionFactoryInitiator.class ); - /** * Singleton access */ @@ -46,10 +43,10 @@ public Class getServiceInitiated() { public RegionFactory initiateService(Map configurationValues, ServiceRegistryImplementor registry) { final var regionFactory = resolveRegionFactory( configurationValues, registry ); if ( regionFactory instanceof NoCachingRegionFactory ) { - LOG.noRegionFactory(); + L2CACHE_LOGGER.noRegionFactory(); } else { - LOG.regionFactory( regionFactory.getClass().getTypeName() ); + L2CACHE_LOGGER.regionFactory( regionFactory.getClass().getTypeName() ); } return regionFactory; } @@ -74,7 +71,7 @@ protected RegionFactory resolveRegionFactory(Map configurationVal // 1) both are explicitly FALSE // 2) USE_SECOND_LEVEL_CACHE is FALSE and USE_QUERY_CACHE is null if ( useSecondLevelCache == FALSE ) { - if ( useQueryCache == null || useQueryCache == FALSE ) { + if ( useQueryCache == null || !useQueryCache ) { return NoCachingRegionFactory.INSTANCE; } } @@ -102,7 +99,6 @@ protected RegionFactory resolveRegionFactory(Map configurationVal return regionFactory; } - final var fallback = getFallback( configurationValues, registry ); if ( fallback != null ) { return fallback; @@ -115,10 +111,7 @@ protected RegionFactory resolveRegionFactory(Map configurationVal return registeredFactory; } else { - LOG.debugf( - "Cannot default RegionFactory based on registered strategies as `%s` RegionFactory strategies were registered", - implementors - ); + L2CACHE_LOGGER.cannotDefaultRegionFactory( implementors.size() ); } return NoCachingRegionFactory.INSTANCE; diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java index 236a707e5051..4a39dbe4fa5b 100644 --- a/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java @@ -16,6 +16,7 @@ import java.lang.invoke.MethodHandles; +import static org.jboss.logging.Logger.Level.DEBUG; import static org.jboss.logging.Logger.Level.INFO; import static org.jboss.logging.Logger.Level.TRACE; import static org.jboss.logging.Logger.Level.WARN; @@ -221,4 +222,25 @@ public interface SecondLevelCacheLogger extends BasicLogger { id = NAMESPACE + 24 ) void lastUpdateTimestampForSpace(String space, Long lastUpdate, Long timestamp); + + @LogMessage(level = INFO) + @Message( + value = "Second-level cache region factory [%s]", + id = NAMESPACE + 28 + ) + void regionFactory(String name); + + @LogMessage(level = DEBUG) + @Message( + value = "Second-level cache disabled", + id = NAMESPACE + 29 + ) + void noRegionFactory(); + + @LogMessage(level = INFO) + @Message( + value = "Cannot default RegionFactory based on registered strategies as %s RegionFactory strategies were registered", + id = NAMESPACE + 30 + ) + void cannotDefaultRegionFactory(int size); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java index d71784daa7bd..028f0e5de1b5 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java @@ -17,6 +17,7 @@ import org.jboss.logging.annotations.ValidIdRange; import java.lang.invoke.MethodHandles; +import java.sql.SQLException; import static org.jboss.logging.Logger.Level.DEBUG; import static org.jboss.logging.Logger.Level.INFO; @@ -24,7 +25,7 @@ import static org.jboss.logging.Logger.Level.WARN; /** - * Sub-system logging related to JDBC interactions + * Subsystem logging related to JDBC interactions * * @author Steve Ebersole */ @@ -38,7 +39,6 @@ public interface JdbcLogging extends BasicLogger { String NAME = SubSystemLogging.BASE + ".jdbc"; - Logger JDBC_LOGGER = Logger.getLogger( NAME ); JdbcLogging JDBC_MESSAGE_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), JdbcLogging.class, NAME ); @LogMessage(level = WARN) @@ -176,4 +176,17 @@ public interface JdbcLogging extends BasicLogger { @LogMessage(level = DEBUG) @Message(value = "Encountered failure rolling back failed commit", id = 100038) void encounteredFailureRollingBackFailedCommit(@Cause Throwable cause); + + @LogMessage(level = DEBUG) + @Message(value = "Could not access DatabaseMetaData while building the JdbcEnvironment", id = 100039) + void noDatabaseMetaData(@Cause SQLException sqle); + + @LogMessage(level = WARN) + @Message(value = "Could not obtain connection metadata: %s", id = 100045) + void unableToObtainConnectionMetadata(SQLException error); + + @LogMessage(level = WARN) + @Message(value = "Could not obtain connection to query JDBC database metadata", id = 100046) + void unableToObtainConnectionToQueryMetadata(@Cause Exception e); + } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/JdbcBatchLogging.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/JdbcBatchLogging.java index bf2d695fd069..34d61d5f2993 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/JdbcBatchLogging.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/JdbcBatchLogging.java @@ -21,7 +21,7 @@ import static org.jboss.logging.Logger.Level.WARN; /** - * Sub-system logging related to JDBC batch execution + * Subsystem logging related to JDBC batch execution * * @author Steve Ebersole */ @@ -35,7 +35,6 @@ public interface JdbcBatchLogging extends BasicLogger { String NAME = "org.hibernate.orm.jdbc.batch"; - Logger BATCH_LOGGER = Logger.getLogger( NAME ); JdbcBatchLogging BATCH_MESSAGE_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), JdbcBatchLogging.class, NAME ); @LogMessage(level = INFO) @@ -43,30 +42,43 @@ public interface JdbcBatchLogging extends BasicLogger { void batchingEnabled(int batchSize); @LogMessage(level = WARN) - @Message(id = 100502, value = "Unable to release batch statement") + @Message(id = 100502, value = "Unable to release JDBC batch statement") void unableToReleaseBatchStatement(); @LogMessage(level = INFO) - @Message(id=100503, value = "On release of batch it still contained JDBC statements") + @Message(id=100503, value = "JDBC batch still contained JDBC statements on release") void batchContainedStatementsOnRelease(); @LogMessage(level = TRACE) @Message("Created JDBC batch (%s) - [%s]") - void createBatch(int batchSize, String string); + void createBatch(int batchSize, String batchKey); @LogMessage(level = TRACE) @Message("Adding to JDBC batch (%s / %s) - [%s]") - void addToBatch(int batchPosition, int batchSize, String string); + void addToBatch(int batchPosition, int batchSize, String batchKey); @LogMessage(level = TRACE) @Message("Executing JDBC batch (%s / %s) - [%s]") - void executeBatch(int batchPosition, int batchSize, String string); + void executeBatch(int batchPosition, int batchSize, String batchKey); @LogMessage(level = TRACE) @Message("Conditionally executing JDBC batch - [%s]") - void conditionallyExecuteBatch(String string); + void conditionallyExecuteBatch(String batchKey); @LogMessage(level = TRACE) @Message("Aborting JDBC batch - [%s]") - void abortBatch(String string); + void abortBatch(String batchKey); + + @LogMessage(level = TRACE) + @Message("Using standard JDBC batch builder") + void usingStandardBatchBuilder(); + + @LogMessage(level = TRACE) + @Message("No statements to execute in JDBC batch - [%s]") + void emptyBatch(String batchKey); + + // this might actually belong in JdbcLogging + @LogMessage(level = TRACE) + @Message("PreparedStatementDetails did not contain PreparedStatement on releaseStatements: %s") + void noPreparedStatements(String sqlString); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchBuilderImpl.java index 278bf7d3ecf5..af563252200a 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchBuilderImpl.java @@ -19,7 +19,6 @@ import org.hibernate.sql.model.jdbc.JdbcInsertMutation; import static java.util.Collections.emptyList; -import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_LOGGER; import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_MESSAGE_LOGGER; /** @@ -40,7 +39,7 @@ public BatchBuilderImpl(int globalBatchSize) { if ( globalBatchSize > 1 ) { BATCH_MESSAGE_LOGGER.batchingEnabled( globalBatchSize ); } - BATCH_LOGGER.trace( "Using standard BatchBuilder"); + BATCH_MESSAGE_LOGGER.usingStandardBatchBuilder(); this.globalBatchSize = globalBatchSize; } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java index 43d4555b02de..540d0dfaba0d 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java @@ -22,7 +22,6 @@ import static java.util.Objects.requireNonNull; import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER; -import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_LOGGER; import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_MESSAGE_LOGGER; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; @@ -64,7 +63,7 @@ public BatchImpl( sqlStatementLogger = jdbcServices.getSqlStatementLogger(); sqlExceptionHelper = jdbcServices.getSqlExceptionHelper(); - if ( BATCH_LOGGER.isTraceEnabled() ) { + if ( BATCH_MESSAGE_LOGGER.isTraceEnabled() ) { BATCH_MESSAGE_LOGGER.createBatch( batchSizeToUse, key.toLoggableString() @@ -102,7 +101,7 @@ public void addToBatch( @Override public void addToBatch(JdbcValueBindings jdbcValueBindings, TableInclusionChecker inclusionChecker) { - final boolean loggerTraceEnabled = BATCH_LOGGER.isTraceEnabled(); + final boolean loggerTraceEnabled = BATCH_MESSAGE_LOGGER.isTraceEnabled(); if ( loggerTraceEnabled ) { BATCH_MESSAGE_LOGGER.addToBatch( batchPosition + 1, @@ -132,10 +131,9 @@ public void addToBatch(JdbcValueBindings jdbcValueBindings, TableInclusionChecke try { statement.addBatch(); } - catch (SQLException e) { - BATCH_LOGGER.debug( "SQLException escaped proxy", e ); + catch (SQLException exception) { throw sqlExceptionHelper.convert( - e, + exception, "Could not perform addBatch", sqlString ); @@ -212,14 +210,11 @@ protected void abortBatch(Exception cause) { @Override public void execute() { notifyObserversExplicitExecution(); - if ( getStatementGroup().getNumberOfStatements() != 0 ) { + if ( getStatementGroup().getNumberOfStatements() > 0 ) { try { if ( batchPosition == 0 ) { - if ( !batchExecuted && BATCH_LOGGER.isDebugEnabled() ) { - BATCH_LOGGER.debugf( - "No batched statements to execute - %s", - getKey().toLoggableString() - ); + if ( !batchExecuted && BATCH_MESSAGE_LOGGER.isTraceEnabled() ) { + BATCH_MESSAGE_LOGGER.emptyBatch( getKey().toLoggableString() ); } } else { @@ -233,7 +228,7 @@ public void execute() { } protected void performExecution() { - if ( BATCH_LOGGER.isTraceEnabled() ) { + if ( BATCH_MESSAGE_LOGGER.isTraceEnabled() ) { BATCH_MESSAGE_LOGGER.executeBatch( batchPosition, batchSizeToUse, @@ -314,7 +309,7 @@ private void checkRowCounts(int[] rowCounts, PreparedStatementDetails statementD public void release() { if ( BATCH_MESSAGE_LOGGER.isInfoEnabled() ) { final var statementGroup = getStatementGroup(); - if ( statementGroup.getNumberOfStatements() != 0 + if ( statementGroup.getNumberOfStatements() > 0 && statementGroup.hasMatching( statementDetails -> statementDetails.getStatement() != null ) ) { BATCH_MESSAGE_LOGGER.batchContainedStatementsOnRelease(); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java index 9c5dd44f8ff1..e39abf7d9278 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java @@ -17,8 +17,6 @@ import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.resource.beans.container.spi.BeanContainer; import org.hibernate.resource.beans.internal.Helper; import org.hibernate.service.spi.ServiceRegistryImplementor; @@ -43,6 +41,7 @@ import static org.hibernate.cfg.JdbcSettings.USER; import static org.hibernate.cfg.SchemaToolingSettings.ENABLE_SYNONYMS; import static org.hibernate.context.spi.MultiTenancy.isMultiTenancyEnabled; +import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderLogging.CONNECTION_PROVIDER_LOGGER; import static org.hibernate.internal.util.StringHelper.isBlank; import static org.hibernate.internal.util.StringHelper.nullIfBlank; @@ -55,8 +54,6 @@ */ public class ConnectionProviderInitiator implements StandardServiceInitiator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( ConnectionProviderInitiator.class ); - /** * Singleton access */ @@ -100,7 +97,7 @@ public ConnectionProvider initiateService( return provider; } else if ( explicitSetting instanceof Class providerClass ) { - LOG.instantiatingExplicitConnectionProvider( providerClass.getName() ); + CONNECTION_PROVIDER_LOGGER.instantiatingExplicitConnectionProvider( providerClass.getName() ); return instantiateExplicitConnectionProvider( connectionProviderClass( providerClass ), beanContainer ); } else { @@ -126,7 +123,7 @@ private static Class connectionProviderClass(Class private ConnectionProvider instantiateNamedConnectionProvider( String providerName, StrategySelector strategySelector, BeanContainer beanContainer) { - LOG.instantiatingExplicitConnectionProvider( providerName ); + CONNECTION_PROVIDER_LOGGER.instantiatingExplicitConnectionProvider( providerName ); final var providerClass = strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName ); try { return instantiateExplicitConnectionProvider( providerClass, beanContainer ); @@ -181,7 +178,7 @@ else if ( configurationValues.containsKey( URL ) ) { } private ConnectionProvider noAppropriateConnectionProvider() { - LOG.noAppropriateConnectionProvider(); + CONNECTION_PROVIDER_LOGGER.noAppropriateConnectionProvider(); return new UserSuppliedConnectionProviderImpl(); } @@ -225,7 +222,7 @@ private static ConnectionProvider instantiateProvider(StrategySelector selector, return selector.selectStrategyImplementor( ConnectionProvider.class, strategy ).getConstructor().newInstance(); } catch ( Exception e ) { - LOG.providerClassNotFound(strategy); + CONNECTION_PROVIDER_LOGGER.providerClassNotFound(strategy); return null; } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderLogging.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderLogging.java new file mode 100644 index 000000000000..b67f5059f27f --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderLogging.java @@ -0,0 +1,49 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.engine.jdbc.connections.internal; + +import org.hibernate.internal.log.SubSystemLogging; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; + +import static org.jboss.logging.Logger.Level.INFO; +import static org.jboss.logging.Logger.Level.WARN; + +/** + * Subsystem logging related to ConnectionProvider + * + * @author Steve Ebersole + */ +@SubSystemLogging( + name = ConnectionProviderLogging.NAME, + description = "Logging related to ConnectionProvider" +) +@MessageLogger(projectCode = "HHH") +@ValidIdRange(min = 102001, max = 102100) +interface ConnectionProviderLogging { + String NAME = SubSystemLogging.BASE + ".connection"; + ConnectionProviderLogging CONNECTION_PROVIDER_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), ConnectionProviderLogging.class, NAME ); + + @LogMessage(level = WARN) + @Message(id = 102001, + value = "Configuration settings with for connection provider '%s' are set, but the connection provider is not on the classpath; these properties will be ignored") + void providerClassNotFound(String c3p0ProviderClassName); + + @LogMessage(level = INFO) + @Message(id = 102002, + value = "Instantiating explicit connection provider: %s") + void instantiatingExplicitConnectionProvider(String providerClassName); + + @LogMessage(level = WARN) + @Message(id = 102003, + value = "No appropriate connection provider encountered; client must supply connections") + void noAppropriateConnectionProvider(); + +} diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupport.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupport.java index 87c2ab99a7e2..b7ecb9c53bf8 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupport.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/cursor/internal/StandardRefCursorSupport.java @@ -84,15 +84,15 @@ public static boolean supportsRefCursors(DatabaseMetaData meta) { final boolean mightSupportIt = meta.supportsRefCursors(); // Some databases cheat and don't actually support it correctly: add some additional checks. if ( mightSupportIt ) { - if ( "Oracle JDBC driver".equals( meta.getDriverName() ) && meta.getDriverMajorVersion() < 19 ) { + if ( "Oracle JDBC driver".equals( meta.getDriverName() ) + && meta.getDriverMajorVersion() < 19 ) { return false; } } return mightSupportIt; } catch (Exception throwable) { - //If the driver is not compatible with the Java 8 contract, the method might not exit. - LOG.debug( "Unexpected error trying to gauge level of JDBC REF_CURSOR support: " + throwable.getMessage() ); + // If the driver is not compatible with the Java 8 contract, the method might not exit. return false; } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java index 701db9081acf..9b80eb3b079f 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java @@ -30,8 +30,6 @@ import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory; -import org.jboss.logging.Logger; - import static org.hibernate.cfg.MappingSettings.DEFAULT_CATALOG; import static org.hibernate.cfg.MappingSettings.DEFAULT_SCHEMA; import static org.hibernate.engine.config.spi.StandardConverters.STRING; @@ -42,7 +40,6 @@ * @author Steve Ebersole */ public class JdbcEnvironmentImpl implements JdbcEnvironment { - private static final Logger LOG = Logger.getLogger( JdbcEnvironmentImpl.class ); private final Dialect dialect; @@ -120,7 +117,7 @@ private static IdentifierHelper identifierHelper(Dialect dialect, IdentifierHelp } catch (SQLException sqle) { // should never ever happen - LOG.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + JDBC_MESSAGE_LOGGER.noDatabaseMetaData( sqle ); } return builder.build(); } @@ -210,7 +207,7 @@ private IdentifierHelper identifierHelper(DatabaseMetaData databaseMetaData, Dia } catch (SQLException sqle) { // should never ever happen - LOG.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + JDBC_MESSAGE_LOGGER.noDatabaseMetaData( sqle ); } return identifierHelperBuilder.build(); } @@ -224,7 +221,6 @@ private NameQualifierSupport nameQualifierSupport(DatabaseMetaData databaseMetaD private NameQualifierSupport determineNameQualifierSupport(DatabaseMetaData databaseMetaData) throws SQLException { final boolean supportsCatalogs = databaseMetaData.supportsCatalogsInTableDefinitions(); final boolean supportsSchemas = databaseMetaData.supportsSchemasInTableDefinitions(); - if ( supportsCatalogs && supportsSchemas ) { return NameQualifierSupport.BOTH; } @@ -271,7 +267,7 @@ public JdbcEnvironmentImpl( sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect ); - final ConfigurationService cfgService = configurationService( serviceRegistry ); + final var cfgService = configurationService( serviceRegistry ); sqlExceptionHelper = buildSqlExceptionHelper( dialect, @@ -311,7 +307,7 @@ private IdentifierHelper identifierHelper( } catch (SQLException sqle) { // should never ever happen - LOG.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + JDBC_MESSAGE_LOGGER.noDatabaseMetaData( sqle ); } return builder.build(); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java index 43aa8a394041..52183ca7f473 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java @@ -31,8 +31,6 @@ import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; import org.hibernate.event.monitor.internal.EmptyEventMonitor; import org.hibernate.event.monitor.spi.EventMonitor; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.log.ConnectionInfoLogger; import org.hibernate.jdbc.AbstractReturningWork; import org.hibernate.jpa.internal.MutableJpaComplianceImpl; @@ -80,8 +78,6 @@ */ public class JdbcEnvironmentInitiator implements StandardServiceInitiator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( JdbcEnvironmentInitiator.class ); - public static final JdbcEnvironmentInitiator INSTANCE = new JdbcEnvironmentInitiator(); /** @@ -137,7 +133,7 @@ private JdbcEnvironment getJdbcEnvironment( Integer explicitDatabaseMajorVersion, Integer explicitDatabaseMinorVersion, String explicitDatabaseVersion) { - final DialectFactory dialectFactory = registry.requireService( DialectFactory.class ); + final var dialectFactory = registry.requireService( DialectFactory.class ); final JdbcEnvironment jdbcEnvironment; final DatabaseConnectionInfo databaseConnectionInfo; @@ -211,7 +207,7 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentWithExplicitConfiguration( Integer explicitDatabaseMajorVersion, Integer explicitDatabaseMinorVersion, String explicitDatabaseVersion) { - final DialectResolutionInfo dialectResolutionInfo = new DialectResolutionInfoImpl( + final var dialectResolutionInfo = new DialectResolutionInfoImpl( null, explicitDatabaseName, explicitDatabaseVersion, @@ -333,15 +329,15 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata( Integer explicitDatabaseMajorVersion, Integer explicitDatabaseMinorVersion, String explicitDatabaseVersion) { - final JdbcConnectionAccess jdbcConnectionAccess = buildJdbcConnectionAccess( registry ); - final JdbcServicesImpl jdbcServices = new JdbcServicesImpl( registry ); - final TemporaryJdbcSessionOwner temporaryJdbcSessionOwner = new TemporaryJdbcSessionOwner( + final var jdbcConnectionAccess = buildJdbcConnectionAccess( registry ); + final var jdbcServices = new JdbcServicesImpl( registry ); + final var temporaryJdbcSessionOwner = new TemporaryJdbcSessionOwner( jdbcConnectionAccess, jdbcServices, new SqlExceptionHelper( false ), registry ); - final JdbcCoordinatorImpl jdbcCoordinator = new JdbcCoordinatorImpl( null, temporaryJdbcSessionOwner, jdbcServices ); + final var jdbcCoordinator = new JdbcCoordinatorImpl( null, temporaryJdbcSessionOwner, jdbcServices ); try { temporaryJdbcSessionOwner.transactionCoordinator = registry.requireService( TransactionCoordinatorBuilder.class ) @@ -351,10 +347,9 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata( @Override public JdbcEnvironmentImpl execute(Connection connection) { try { - final DatabaseMetaData metadata = connection.getMetaData(); + final var metadata = connection.getMetaData(); logDatabaseAndDriver( metadata ); - - final DialectResolutionInfo dialectResolutionInfo = new DialectResolutionInfoImpl( + final var dialectResolutionInfo = new DialectResolutionInfoImpl( metadata, explicitDatabaseName == null ? metadata.getDatabaseProductName() @@ -385,7 +380,7 @@ public JdbcEnvironmentImpl execute(Connection connection) { ); } catch (SQLException e) { - LOG.unableToObtainConnectionMetadata( e ); + JDBC_MESSAGE_LOGGER.unableToObtainConnectionMetadata( e ); } // accessing the JDBC metadata failed @@ -416,7 +411,7 @@ private int databaseMicroVersion(DatabaseMetaData metadata) throws SQLException ); } catch ( Exception e ) { - LOG.unableToObtainConnectionToQueryMetadata( e ); + JDBC_MESSAGE_LOGGER.unableToObtainConnectionToQueryMetadata( e ); } finally { //noinspection resource @@ -427,7 +422,7 @@ private int databaseMicroVersion(DatabaseMetaData metadata) throws SQLException } private static void logDatabaseAndDriver(DatabaseMetaData dbmd) throws SQLException { - if ( LOG.isDebugEnabled() ) { + if ( JDBC_MESSAGE_LOGGER.isDebugEnabled() ) { JDBC_MESSAGE_LOGGER.logDatabaseInfo( dbmd.getDatabaseProductName(), dbmd.getDatabaseProductVersion(), diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java index 02f600d2d9e0..f874f7a4c694 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcCoordinatorImpl.java @@ -205,7 +205,10 @@ public void executeBatch() { @Override public void conditionallyExecuteBatch(BatchKey key) { if ( currentBatch != null && !currentBatch.getKey().equals( key ) ) { - BATCH_MESSAGE_LOGGER.conditionallyExecuteBatch( currentBatch.getKey().toLoggableString() ); + if ( BATCH_MESSAGE_LOGGER.isTraceEnabled() ) { + BATCH_MESSAGE_LOGGER.conditionallyExecuteBatch( + currentBatch.getKey().toLoggableString() ); + } try { currentBatch.execute(); } @@ -221,7 +224,10 @@ public void conditionallyExecuteBatch(BatchKey key) { @Override public void abortBatch() { if ( currentBatch != null ) { - BATCH_MESSAGE_LOGGER.abortBatch( currentBatch.getKey().toLoggableString()); + if ( BATCH_MESSAGE_LOGGER.isTraceEnabled() ) { + BATCH_MESSAGE_LOGGER.abortBatch( + currentBatch.getKey().toLoggableString() ); + } currentBatch.release(); currentBatch = null; } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractPreparedStatementGroup.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractPreparedStatementGroup.java index e3e8d67123ec..1e6097b14dd7 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractPreparedStatementGroup.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractPreparedStatementGroup.java @@ -11,7 +11,6 @@ import java.sql.PreparedStatement; import java.sql.SQLException; -import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_LOGGER; import static org.hibernate.engine.jdbc.batch.JdbcBatchLogging.BATCH_MESSAGE_LOGGER; public abstract class AbstractPreparedStatementGroup implements PreparedStatementGroup { @@ -44,10 +43,7 @@ protected void clearBatch(PreparedStatementDetails statementDetails) { protected void release(PreparedStatementDetails statementDetails) { if ( statementDetails.toRelease() ) { if ( statementDetails.getStatement() == null ) { - BATCH_LOGGER.debugf( - "PreparedStatementDetails did not contain PreparedStatement on releaseStatements: %s", - statementDetails.getSqlString() - ); + BATCH_MESSAGE_LOGGER.noPreparedStatements( statementDetails.getSqlString() ); } else { clearBatch( statementDetails ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SQLExceptionLogging.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SQLExceptionLogging.java index bfdf94c3e17b..717a4bfaa2a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SQLExceptionLogging.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SQLExceptionLogging.java @@ -7,12 +7,15 @@ import org.hibernate.internal.log.SubSystemLogging; import org.jboss.logging.BasicLogger; import org.jboss.logging.Logger; +import org.jboss.logging.annotations.Cause; import org.jboss.logging.annotations.LogMessage; import org.jboss.logging.annotations.Message; import org.jboss.logging.annotations.MessageLogger; import java.lang.invoke.MethodHandles; +import java.sql.SQLException; +import static org.jboss.logging.Logger.Level.DEBUG; import static org.jboss.logging.Logger.Level.WARN; /** @@ -33,4 +36,12 @@ public interface SQLExceptionLogging extends BasicLogger { @LogMessage(level = WARN) @Message(value = "ErrorCode: %s, SQLState: %s", id = 247) void logErrorCodes(int errorCode, String sqlState); + + @LogMessage(level = DEBUG) + @Message(value = "Could not log SQL warnings", id = 248) + void couldNotLogWarnings(@Cause SQLException sqle); + + @LogMessage(level = DEBUG) + @Message(value = "Could not clear SQL warnings", id = 249) + void couldNotClearWarnings(@Cause SQLException sqle); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlExceptionHelper.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlExceptionHelper.java index 9dca2f90c405..04e17fbea356 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlExceptionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlExceptionHelper.java @@ -311,14 +311,14 @@ public void handleAndClearWarnings(Connection connection, WarningHandler handler } catch (SQLException sqle) { // workaround for WebLogic - WARNING_LOG.debug( "could not log warnings", sqle ); + WARNING_LOG.couldNotLogWarnings( sqle ); } try { // Sybase fail if we don't do that, sigh... connection.clearWarnings(); } catch (SQLException sqle) { - WARNING_LOG.debug( "could not clear warnings", sqle ); + WARNING_LOG.couldNotClearWarnings( sqle ); } } @@ -339,7 +339,7 @@ public void handleAndClearWarnings(Statement statement, WarningHandler handler) } catch (SQLException sqlException) { // workaround for WebLogic - WARNING_LOG.debug( "could not log warnings", sqlException ); + WARNING_LOG.couldNotLogWarnings( sqlException ); } } try { @@ -347,7 +347,7 @@ public void handleAndClearWarnings(Statement statement, WarningHandler handler) statement.clearWarnings(); } catch (SQLException sqle) { - WARNING_LOG.debug( "could not clear warnings", sqle ); + WARNING_LOG.couldNotClearWarnings( sqle ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlStatementLogger.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlStatementLogger.java index 4b0d8c08bbbb..c4aa69549184 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlStatementLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/SqlStatementLogger.java @@ -12,7 +12,6 @@ import org.hibernate.internal.build.AllowSysOut; import org.hibernate.resource.jdbc.spi.JdbcSessionContext; import org.hibernate.service.Service; -import org.hibernate.stat.spi.StatisticsImplementor; import org.jboss.logging.Logger; /** @@ -111,26 +110,24 @@ public void logStatement(String statement) { */ @AllowSysOut public void logStatement(String statement, Formatter formatter) { - if ( !logToStdout && !LOG.isDebugEnabled() ) { - return; - } - - try { - if ( format ) { - statement = formatter.format( statement ); + if ( logToStdout || LOG.isDebugEnabled() ) { + try { + if ( format ) { + statement = formatter.format( statement ); + } + if ( highlight ) { + statement = FormatStyle.HIGHLIGHT.getFormatter().format( statement ); + } } - if ( highlight ) { - statement = FormatStyle.HIGHLIGHT.getFormatter().format( statement ); + catch (RuntimeException ex) { + LOG.debug( "Couldn't format statement", ex ); } - } - catch (RuntimeException ex) { - LOG.warn( "Couldn't format statement", ex ); - } - LOG.debug( statement ); - if ( logToStdout ) { - String prefix = highlight ? "\u001b[35m[Hibernate]\u001b[0m " : "Hibernate: "; - System.out.println( prefix + statement ); + LOG.debug( statement ); + if ( logToStdout ) { + String prefix = highlight ? "\u001b[35m[Hibernate]\u001b[0m " : "Hibernate: "; + System.out.println( prefix + statement ); + } } } @@ -141,17 +138,17 @@ public void logStatement(String statement, Formatter formatter) { * @param startTimeNanos Start time in nanoseconds. */ public void logSlowQuery(final String sql, final long startTimeNanos, final JdbcSessionContext context) { - if ( logSlowQuery < 1 ) { - return; - } - if ( startTimeNanos <= 0 ) { - throw new IllegalArgumentException( "startTimeNanos [" + startTimeNanos + "] should be greater than 0" ); - } + if ( logSlowQuery >= 1 ) { + if ( startTimeNanos <= 0 ) { + throw new IllegalArgumentException( + "startTimeNanos [" + startTimeNanos + "] should be greater than 0" ); + } - final long queryExecutionMillis = elapsedFrom( startTimeNanos ); + final long queryExecutionMillis = elapsedFrom( startTimeNanos ); - if ( queryExecutionMillis > logSlowQuery ) { - logSlowQueryInternal( context, queryExecutionMillis, sql ); + if ( queryExecutionMillis > logSlowQuery ) { + logSlowQueryInternal( context, queryExecutionMillis, sql ); + } } } @@ -167,7 +164,7 @@ private void logSlowQueryInternal(final JdbcSessionContext context, final long q System.out.println( logData ); } if ( context != null ) { - final StatisticsImplementor statisticsImplementor = context.getStatistics(); + final var statisticsImplementor = context.getStatistics(); if ( statisticsImplementor != null && statisticsImplementor.isStatisticsEnabled() ) { statisticsImplementor.slowQuery( sql, queryExecutionMillis ); } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java index 84709009f8c1..dba92f4c45db 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java @@ -27,8 +27,6 @@ import org.hibernate.event.spi.FlushEntityEventListener; import org.hibernate.event.spi.FlushEvent; import org.hibernate.event.spi.PersistContext; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.EntityPrinter; import org.hibernate.internal.util.collections.InstanceIdentityMap; import org.hibernate.persister.entity.EntityPersister; @@ -36,6 +34,7 @@ import static org.hibernate.engine.internal.Collections.processUnreachableCollection; import static org.hibernate.engine.internal.Collections.skipRemoval; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; /** * A convenience base class for listeners whose functionality results in flushing. @@ -44,8 +43,6 @@ */ public abstract class AbstractFlushingEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AbstractFlushingEventListener.class ); - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Pre-flushing section // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -59,7 +56,7 @@ public abstract class AbstractFlushingEventListener { * @throws HibernateException Error flushing caches to execution queues. */ protected void flushEverythingToExecutions(FlushEvent event) throws HibernateException { - LOG.trace( "Flushing session" ); + EVENT_LISTENER_LOGGER.flushingSession(); final var session = event.getSession(); final var persistenceContext = session.getPersistenceContextInternal(); preFlush( session, persistenceContext ); @@ -94,19 +91,17 @@ protected void preFlush(EventSource session, PersistenceContext persistenceConte } protected void logFlushResults(FlushEvent event) { - if ( LOG.isDebugEnabled() ) { + if ( EVENT_LISTENER_LOGGER.isDebugEnabled() ) { final var session = event.getSession(); final var persistenceContext = session.getPersistenceContextInternal(); final var actionQueue = session.getActionQueue(); - LOG.debugf( - "Flushed: %s insertions, %s updates, %s deletions to %s objects", + EVENT_LISTENER_LOGGER.flushedEntitiesSummary( actionQueue.numberOfInsertions(), actionQueue.numberOfUpdates(), actionQueue.numberOfDeletions(), persistenceContext.getNumberOfManagedEntities() ); - LOG.debugf( - "Flushed: %s (re)creations, %s updates, %s removals to %s collections", + EVENT_LISTENER_LOGGER.flushedCollectionsSummary( actionQueue.numberOfCollectionCreations(), actionQueue.numberOfCollectionUpdates(), actionQueue.numberOfCollectionRemovals(), @@ -124,7 +119,7 @@ protected void logFlushResults(FlushEvent event) { */ private void prepareEntityFlushes(EventSource session, PersistenceContext persistenceContext) throws HibernateException { - LOG.trace( "Processing flush-time cascades" ); + EVENT_LISTENER_LOGGER.processingFlushTimeCascades(); final var context = PersistContext.create(); // safe from concurrent modification because of how concurrentEntries() is implemented on IdentityMap for ( var entry : persistenceContext.reentrantSafeEntityEntries() ) { @@ -188,7 +183,7 @@ private void cascadeOnFlush(EventSource session, EntityPersister persister, Obje private void prepareCollectionFlushes(PersistenceContext persistenceContext) throws HibernateException { // Initialize dirty flags for arrays + collections with composite elements // and reset reached, doupdate, etc. - LOG.trace( "Dirty checking collections" ); + EVENT_LISTENER_LOGGER.dirtyCheckingCollections(); final var collectionEntries = persistenceContext.getCollectionEntries(); if ( collectionEntries != null ) { final var identityMap = @@ -209,7 +204,7 @@ private void prepareCollectionFlushes(PersistenceContext persistenceContext) thr */ private int flushEntities(final FlushEvent event, final PersistenceContext persistenceContext) throws HibernateException { - LOG.trace( "Flushing entities and processing referenced collections" ); + EVENT_LISTENER_LOGGER.flushingEntitiesAndProcessingReferencedCollections(); final var source = event.getSession(); final var flushListeners = @@ -267,13 +262,13 @@ private FlushEntityEvent createOrReuseEventInstance( */ private int flushCollections(final EventSource session, final PersistenceContext persistenceContext) throws HibernateException { - LOG.trace( "Processing unreferenced collections" ); + EVENT_LISTENER_LOGGER.processingUnreferencedCollections(); final var collectionEntries = persistenceContext.getCollectionEntries(); final int count = processUnreachableCollections( session, collectionEntries ); // Schedule updates to collections: - LOG.trace( "Scheduling collection removes/(re)creates/updates" ); + EVENT_LISTENER_LOGGER.schedulingCollectionOperations(); final var actionQueue = session.getActionQueue(); final var interceptor = session.getInterceptor(); persistenceContext.forEachCollectionEntry( @@ -370,11 +365,9 @@ private static int processUnreachableCollections( * @param session The session being flushed */ protected void performExecutions(EventSource session) { - LOG.trace( "Executing flush" ); - - // IMPL NOTE : here we alter the flushing flag of the persistence context to allow - // during-flush callbacks more leniency in regards to initializing proxies and - // lazy collections during their processing. + // IMPL NOTE: here we alter the flushing flag of the persistence context to allow + // callbacks occurring during flush more leniency regarding initializing + // proxies and lazy collections // For more information, see HHH-2763 final var persistenceContext = session.getPersistenceContextInternal(); final var jdbcCoordinator = session.getJdbcCoordinator(); @@ -406,7 +399,7 @@ protected void performExecutions(EventSource session) { * */ protected void postFlush(SessionImplementor session) throws HibernateException { - LOG.trace( "Post flush" ); + EVENT_LISTENER_LOGGER.postFlush(); final var persistenceContext = session.getPersistenceContextInternal(); persistenceContext.clearCollectionsByKey(); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java index aebdff29d647..04da87409873 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java @@ -22,8 +22,6 @@ import org.hibernate.event.spi.EventSource; import org.hibernate.id.CompositeNestedGeneratedValueGenerator; import org.hibernate.id.IdentifierGenerationException; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.jpa.event.spi.CallbackRegistry; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; import org.hibernate.persister.entity.EntityPersister; @@ -35,6 +33,7 @@ import static org.hibernate.engine.internal.ManagedTypeHelper.processIfManagedEntity; import static org.hibernate.engine.internal.Versioning.getVersion; import static org.hibernate.engine.internal.Versioning.seedVersion; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.generator.EventType.INSERT; import static org.hibernate.id.IdentifierGeneratorHelper.SHORT_CIRCUIT_INDICATOR; import static org.hibernate.pretty.MessageHelper.infoString; @@ -48,8 +47,6 @@ */ public abstract class AbstractSaveEventListener implements CallbackRegistryConsumer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AbstractSaveEventListener.class ); - private CallbackRegistry callbackRegistry; @Override @@ -158,10 +155,9 @@ private static Object generateId( throw new IdentifierGenerationException( "Null id generated for entity '" + persister.getEntityName() + "'" ); } else { - if ( LOG.isTraceEnabled() ) { + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { // TODO: define toString()s for generators - LOG.tracef( - "Generated identifier [%s] using generator '%s'", + EVENT_LISTENER_LOGGER.generatedId( persister.getIdentifierType().toLoggableString( id, source.getFactory() ), generator.getClass().getName() ); @@ -210,8 +206,9 @@ protected Object performSave( } } - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Persisting " + infoString( persister, id, source.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.persisting( + infoString( persister, id, source.getFactory() ) ); } final var key = useIdentityColumn ? null : entityKey( id, persister, source ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java index 97a7020ba310..c658bc905aa3 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultAutoFlushEventListener.java @@ -9,9 +9,8 @@ import org.hibernate.event.spi.AutoFlushEvent; import org.hibernate.event.spi.AutoFlushEventListener; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; /** @@ -22,8 +21,6 @@ */ public class DefaultAutoFlushEventListener extends AbstractFlushingEventListener implements AutoFlushEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultAutoFlushEventListener.class ); - /** * Handle the given auto-flush event. * @@ -50,7 +47,7 @@ public void onAutoFlush(AutoFlushEvent event) throws HibernateException { final int oldSize = actionQueue.numberOfCollectionRemovals(); flushEverythingToExecutions( event, persistenceContext, session ); if ( flushIsReallyNeeded( event, source ) ) { - LOG.trace( "Need to execute flush" ); + EVENT_LISTENER_LOGGER.needToExecuteFlush(); event.setFlushRequired( true ); // note: performExecutions() clears all collectionXxxxtion @@ -70,7 +67,7 @@ public void onAutoFlush(AutoFlushEvent event) throws HibernateException { } } else { - LOG.trace( "No need to execute flush" ); + EVENT_LISTENER_LOGGER.noNeedToExecuteFlush(); event.setFlushRequired( false ); actionQueue.clearFromFlushNeededCheck( oldSize ); } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java index 254af1db2424..ee51e8b9ef2f 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDeleteEventListener.java @@ -27,8 +27,6 @@ import org.hibernate.event.spi.DeleteEvent; import org.hibernate.event.spi.DeleteEventListener; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.EmptyInterceptor; import org.hibernate.jpa.event.spi.CallbackRegistry; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; @@ -42,6 +40,7 @@ import static java.util.Arrays.fill; import static org.hibernate.engine.internal.Collections.skipRemoval; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; @@ -53,8 +52,6 @@ */ public class DefaultDeleteEventListener implements DeleteEventListener, CallbackRegistryConsumer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultDeleteEventListener.class ); - private CallbackRegistry callbackRegistry; @Override @@ -155,7 +152,7 @@ private void delete(DeleteEvent event, DeleteContext transientEntities) { } private void deleteUnmanagedInstance(DeleteEvent event, DeleteContext transientEntities, Object entity) { - LOG.trace( "Deleted entity was not associated with current session" ); + EVENT_LISTENER_LOGGER.deletedEntityNotAssociatedWithSession(); final var source = event.getSession(); final var persister = source.getEntityPersister( event.getEntityName(), entity ); if ( ForeignKeys.isTransient( persister.getEntityName(), entity, null, source ) ) { @@ -220,7 +217,7 @@ private static boolean flushAndEvictExistingEntity( return true; } else { - LOG.flushAndEvictOnRemove( key.getEntityName() ); + EVENT_LISTENER_LOGGER.flushAndEvictOnRemove( key.getEntityName() ); source.flush(); if ( !persister.isVersioned() || persister.getVersionType() @@ -244,12 +241,12 @@ private void deletePersistentInstance( DeleteContext transientEntities, Object entity, EntityEntry entityEntry) { - LOG.trace( "Deleting a persistent instance" ); + EVENT_LISTENER_LOGGER.deletingPersistentInstance(); final var source = event.getSession(); if ( entityEntry.getStatus().isDeletedOrGone() || source.getPersistenceContextInternal() .containsDeletedUnloadedEntityKey( entityEntry.getEntityKey() ) ) { - LOG.trace( "Object was already deleted" ); + EVENT_LISTENER_LOGGER.alreadyDeleted(); } else { delete( @@ -339,13 +336,13 @@ protected void deleteTransientEntity( Object entity, EntityPersister persister, DeleteContext transientEntities) { - LOG.handlingTransientEntity(); + EVENT_LISTENER_LOGGER.handlingTransientEntity(); if ( transientEntities.add( entity ) ) { cascadeBeforeDelete( session, persister, entity, transientEntities ); cascadeAfterDelete( session, persister, entity, transientEntities ); } else { - LOG.trace( "Already handled transient entity; skipping" ); + EVENT_LISTENER_LOGGER.alreadyHandledTransient(); } } @@ -370,8 +367,9 @@ protected final void deleteEntity( final EntityPersister persister, final DeleteContext transientEntities) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Deleting " + infoString( persister, entityEntry.getId(), session.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.deleting( + infoString( persister, entityEntry.getId(), session.getFactory() ) ); } final Object version = entityEntry.getVersion(); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java index ab88959335bc..515d64532f36 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java @@ -12,11 +12,10 @@ import org.hibernate.event.spi.EventSource; import org.hibernate.event.spi.EvictEvent; import org.hibernate.event.spi.EvictEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.proxy.LazyInitializer; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; @@ -30,8 +29,6 @@ */ public class DefaultEvictEventListener implements EvictEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultEvictEventListener.class ); - /** * Handle the given evict event. * @@ -106,8 +103,8 @@ protected void doEvict( final EntityPersister persister, final EventSource session) throws HibernateException { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Evicting " + infoString( persister ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.evicting( infoString( persister ) ); } final var persistenceContext = session.getPersistenceContextInternal(); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java index 508b985955f9..50b4a23aaccb 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java @@ -24,8 +24,6 @@ import org.hibernate.engine.spi.Status; import org.hibernate.event.spi.FlushEntityEvent; import org.hibernate.event.spi.FlushEntityEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.jpa.event.spi.CallbackRegistry; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; import org.hibernate.persister.entity.EntityPersister; @@ -42,6 +40,7 @@ import static org.hibernate.engine.internal.Versioning.getVersion; import static org.hibernate.engine.internal.Versioning.incrementVersion; import static org.hibernate.engine.internal.Versioning.setVersion; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_INT_ARRAY; import static org.hibernate.pretty.MessageHelper.infoString; @@ -52,8 +51,6 @@ */ public class DefaultFlushEntityEventListener implements FlushEntityEventListener, CallbackRegistryConsumer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultFlushEntityEventListener.class ); - private CallbackRegistry callbackRegistry; @Override @@ -287,21 +284,21 @@ private static int[] getDirtyProperties(FlushEntityEvent event, boolean intercep private static void logScheduleUpdate( EntityEntry entry, SessionFactoryImplementor factory, Status status, EntityPersister persister) { - if ( LOG.isTraceEnabled() ) { + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { final String info = infoString( persister, entry.getId(), factory ); if ( status == Status.DELETED ) { if ( !persister.isMutable() ) { - LOG.trace( "Updating immutable, deleted entity: " + info ); + EVENT_LISTENER_LOGGER.updatingImmutableDeletedEntity( info ); } else if ( !entry.isModifiableEntity() ) { - LOG.trace( "Updating non-modifiable, deleted entity: " + info ); + EVENT_LISTENER_LOGGER.updatingNonModifiableDeletedEntity( info ); } else { - LOG.trace( "Updating deleted entity: " + info ); + EVENT_LISTENER_LOGGER.updatingDeletedEntity( info ); } } else { - LOG.trace( "Updating entity: " + info ); + EVENT_LISTENER_LOGGER.updatingEntity( info ); } } } @@ -648,15 +645,17 @@ public int[] visitAttributes(CustomEntityDirtinessStrategy.AttributeChecker attr } private void logDirtyProperties(EntityEntry entry, int[] dirtyProperties) { - if ( dirtyProperties != null && dirtyProperties.length > 0 && LOG.isTraceEnabled() ) { + if ( dirtyProperties != null && dirtyProperties.length > 0 && EVENT_LISTENER_LOGGER.isTraceEnabled() ) { final var persister = entry.getPersister(); final String[] allPropertyNames = persister.getPropertyNames(); final String[] dirtyPropertyNames = new String[dirtyProperties.length]; for ( int i = 0; i < dirtyProperties.length; i++ ) { dirtyPropertyNames[i] = allPropertyNames[dirtyProperties[i]]; } - LOG.trace( "Found dirty properties [" + infoString( persister.getEntityName(), entry.getId() ) - + "] : " + Arrays.toString( dirtyPropertyNames ) ); + EVENT_LISTENER_LOGGER.foundDirtyProperties( + infoString( persister.getEntityName(), entry.getId() ), + Arrays.toString( dirtyPropertyNames ) + ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java index 9af348b02817..568566433e33 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEventListener.java @@ -8,6 +8,8 @@ import org.hibernate.event.spi.FlushEvent; import org.hibernate.event.spi.FlushEventListener; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; + /** * Defines the default flush event listeners used by hibernate for * flushing session state in response to generated flush events. @@ -26,6 +28,7 @@ public void onFlush(FlushEvent event) throws HibernateException { final var eventMonitor = source.getEventMonitor(); if ( persistenceContext.getNumberOfManagedEntities() > 0 || persistenceContext.getCollectionEntriesSize() > 0 ) { + EVENT_LISTENER_LOGGER.executingFlush(); final var flushEvent = eventMonitor.beginFlushEvent(); final var eventListenerManager = source.getEventListenerManager(); try { @@ -50,6 +53,7 @@ public void onFlush(FlushEvent event) throws HibernateException { } } else if ( source.getActionQueue().hasAnyQueuedActions() ) { + EVENT_LISTENER_LOGGER.executingFlush(); // execute any queued unloaded-entity deletions performExecutions( source ); } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java index 57e66c264453..714473c24990 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultInitializeCollectionEventListener.java @@ -10,12 +10,11 @@ import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.event.spi.InitializeCollectionEvent; import org.hibernate.event.spi.InitializeCollectionEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.sql.results.internal.ResultsHelper; import static org.hibernate.collection.spi.AbstractPersistentCollection.checkPersister; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.loader.internal.CacheLoadHelper.initializeCollectionFromCache; import static org.hibernate.pretty.MessageHelper.collectionInfoString; @@ -24,8 +23,6 @@ */ public class DefaultInitializeCollectionEventListener implements InitializeCollectionEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultInitializeCollectionEventListener.class ); - /** * called by a collection that wants to initialize itself */ @@ -33,30 +30,29 @@ public class DefaultInitializeCollectionEventListener implements InitializeColle public void onInitializeCollection(InitializeCollectionEvent event) throws HibernateException { final var collection = event.getCollection(); final var source = event.getSession(); - final var persistenceContext = source.getPersistenceContextInternal(); - final var ce = persistenceContext.getCollectionEntry( collection ); - if ( ce == null ) { + final var collectionEntry = persistenceContext.getCollectionEntry( collection ); + if ( collectionEntry == null ) { throw new HibernateException( "Collection was evicted" ); } if ( !collection.wasInitialized() ) { - final var loadedPersister = ce.getLoadedPersister(); + final var loadedPersister = collectionEntry.getLoadedPersister(); checkPersister(collection, loadedPersister); - final Object loadedKey = ce.getLoadedKey(); - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Initializing collection " - + collectionInfoString( loadedPersister, collection, loadedKey, source ) ); + final Object loadedKey = collectionEntry.getLoadedKey(); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.initializingCollection( + collectionInfoString( loadedPersister, collection, loadedKey, source ) ); } final boolean foundInCache = initializeFromCache( loadedKey, loadedPersister, collection, source ); if ( foundInCache ) { - LOG.trace( "Collection initialized from cache" ); + EVENT_LISTENER_LOGGER.collectionInitializedFromCache(); } else { - LOG.trace( "Collection not cached" ); + EVENT_LISTENER_LOGGER.collectionNotCached(); loadedPersister.initialize( loadedKey, source ); handlePotentiallyEmptyCollection( collection, persistenceContext, loadedKey, loadedPersister ); - LOG.trace( "Collection initialized" ); + EVENT_LISTENER_LOGGER.collectionInitialized(); final var statistics = source.getFactory().getStatistics(); if ( statistics.isStatisticsEnabled() ) { @@ -101,7 +97,7 @@ private boolean initializeFromCache( SessionImplementor source) { if ( source.getLoadQueryInfluencers().hasEnabledFilters() && persister.isAffectedByEnabledFilters( source ) ) { - LOG.trace( "Disregarding cached version (if any) of collection due to enabled filters" ); + EVENT_LISTENER_LOGGER.disregardingCachedVersionDueToEnabledFilters(); return false; } else { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java index 2bce2ea75847..12e95883e97a 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java @@ -19,8 +19,6 @@ import org.hibernate.event.spi.EventSource; import org.hibernate.event.spi.LoadEvent; import org.hibernate.event.spi.LoadEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.metamodel.mapping.CompositeIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping; @@ -28,6 +26,7 @@ import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable; import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.loader.internal.CacheLoadHelper.loadFromSecondLevelCache; import static org.hibernate.loader.internal.CacheLoadHelper.loadFromSessionCache; import static org.hibernate.pretty.MessageHelper.infoString; @@ -41,8 +40,6 @@ */ public class DefaultLoadEventListener implements LoadEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultLoadEventListener.class ); - /** * Handle the given load event. * @@ -86,25 +83,19 @@ protected EntityPersister getPersister(final LoadEvent event) { } private void doOnLoad(EntityPersister persister, LoadEvent event, LoadType loadType) { - try { - final var keyToLoad = event.getSession().generateEntityKey( event.getEntityId(), persister ); - if ( loadType.isNakedEntityReturned() ) { - //do not return a proxy! - //(this option indicates we are initializing a proxy) - event.setResult( load( event, persister, keyToLoad, loadType ) ); - } - else { - //return a proxy if appropriate - final Object result = - event.getLockMode() == LockMode.NONE - ? proxyOrLoad( event, persister, keyToLoad, loadType ) - : lockAndLoad( event, persister, keyToLoad, loadType ); - event.setResult( result ); - } + final var keyToLoad = event.getSession().generateEntityKey( event.getEntityId(), persister ); + if ( loadType.isNakedEntityReturned() ) { + //do not return a proxy! + //(this option indicates we are initializing a proxy) + event.setResult( load( event, persister, keyToLoad, loadType ) ); } - catch (HibernateException e) { - LOG.unableToLoadCommand( e ); - throw e; + else { + //return a proxy if appropriate + final Object result = + event.getLockMode() == LockMode.NONE + ? proxyOrLoad( event, persister, keyToLoad, loadType ) + : lockAndLoad( event, persister, keyToLoad, loadType ); + event.setResult( result ); } } @@ -217,8 +208,9 @@ else if ( isOptionalInstance && entity != event.getInstanceToLoad() ) { * @return The result of the proxy/load operation. */ private Object proxyOrLoad(LoadEvent event, EntityPersister persister, EntityKey keyToLoad, LoadType options) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Loading entity: " + infoString( persister, event.getEntityId(), persister.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.loadingEntity( + infoString( persister, event.getEntityId(), persister.getFactory() ) ); } if ( hasBytecodeProxy( persister, options ) ) { return loadWithBytecodeProxy( event, persister, keyToLoad, options ); @@ -297,9 +289,9 @@ private static Object loadWithProxyFactory( // existing proxy associated with the PC - and if so, use it final Object proxy = holder == null ? null : holder.getProxy(); if ( proxy != null ) { - LOG.trace( "Entity proxy found in session cache" ); - if ( LOG.isDebugEnabled() && extractLazyInitializer( proxy ).isUnwrap() ) { - LOG.debug( "Ignoring NO_PROXY to honor laziness" ); + EVENT_LISTENER_LOGGER.entityProxyFoundInSessionCache(); + if ( EVENT_LISTENER_LOGGER.isDebugEnabled() && extractLazyInitializer( proxy ).isUnwrap() ) { + EVENT_LISTENER_LOGGER.ignoringNoProxyToHonorLaziness(); } return persistenceContext.narrowProxy( proxy, persister, keyToLoad, null ); } @@ -357,8 +349,8 @@ private static Object proxyOrCached(LoadEvent event, EntityPersister persister, * @return The created/existing proxy */ private Object narrowedProxy(LoadEvent event, EntityPersister persister, EntityKey keyToLoad, LoadType options, Object proxy) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Entity proxy found in session cache" ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.entityProxyFoundInSessionCache(); } final var li = extractLazyInitializer( proxy ); if ( li.isUnwrap() ) { @@ -416,17 +408,13 @@ private static Object createProxyIfNecessary( final Object existing = holder == null ? null : holder.getEntity(); if ( existing != null ) { // return existing object or initialized proxy (unless deleted) - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Entity found in session cache" ); - } + EVENT_LISTENER_LOGGER.entityResolvedInPersistenceContext(); return options.isCheckDeleted() && wasDeleted( event.getSession().getPersistenceContextInternal(), existing ) ? null : existing; } else { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Creating new proxy for entity" ); - } + EVENT_LISTENER_LOGGER.creatingNewProxy(); return createProxy( event, persister, keyToLoad ); } } @@ -506,9 +494,9 @@ private Object lockAndLoad(LoadEvent event, EntityPersister persister, EntityKey */ private Object doLoad(LoadEvent event, EntityPersister persister, EntityKey keyToLoad, LoadType options) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Attempting to resolve: " - + infoString( persister, event.getEntityId(), event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.resolving( + infoString( persister, event.getEntityId(), event.getFactory() ) ); } final var session = event.getSession(); @@ -562,9 +550,9 @@ private Object loadFromCacheOrDatasource(LoadEvent event, EntityPersister persis return loadFromDatasource( event, persister ); } else { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Resolved entity in second-level cache: " - + infoString( persister, event.getEntityId(), event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.entityResolvedInCache( + infoString( persister, event.getEntityId(), event.getFactory() ) ); } return entity; } @@ -580,9 +568,9 @@ private Object loadFromCacheOrDatasource(LoadEvent event, EntityPersister persis * @return The object loaded from the datasource, or null if not found. */ protected Object loadFromDatasource(final LoadEvent event, final EntityPersister persister) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Entity not resolved in any cache, loading from datastore: " - + infoString( persister, event.getEntityId(), event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.entityNotResolvedInCache( + infoString( persister, event.getEntityId(), event.getFactory() ) ); } final Object entity = persister.load( diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLockEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLockEventListener.java index 32d56d88f8b1..3c8eec03629c 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLockEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLockEventListener.java @@ -16,14 +16,13 @@ import org.hibernate.event.spi.AbstractSessionEvent; import org.hibernate.event.spi.LockEvent; import org.hibernate.event.spi.LockEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.type.TypeHelper; import static org.hibernate.engine.internal.Versioning.getVersion; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.loader.ast.internal.LoaderHelper.upgradeLock; import static org.hibernate.pretty.MessageHelper.infoString; @@ -35,8 +34,6 @@ */ public class DefaultLockEventListener implements LockEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultLockEventListener.class ); - /** * Handle the given lock event. * @@ -50,12 +47,9 @@ public void onLock(LockEvent event) throws HibernateException { } final var lockMode = event.getLockMode(); - if ( lockMode == LockMode.WRITE ) { + if ( lockMode == LockMode.WRITE || lockMode == LockMode.UPGRADE_SKIPLOCKED ) { throw new HibernateException( "Invalid lock mode for lock()" ); } - if ( lockMode == LockMode.UPGRADE_SKIPLOCKED ) { - LOG.explicitSkipLockedLockCombo(); - } final var source = event.getSession(); final var persistenceContext = source.getPersistenceContextInternal(); @@ -110,8 +104,9 @@ private void cascadeOnLock(LockEvent event, EntityPersister persister, Object en */ protected final EntityEntry reassociate(AbstractSessionEvent event, Object object, Object id, EntityPersister persister) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Reassociating transient instance: " + infoString( persister, id, event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.reassociatingTransientInstance( + infoString( persister, id, event.getFactory() ) ); } final var source = event.getSession(); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java index d472826e9eea..0d43b7dbf5b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultMergeEventListener.java @@ -23,8 +23,6 @@ import org.hibernate.event.spi.MergeContext; import org.hibernate.event.spi.MergeEvent; import org.hibernate.event.spi.MergeEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.loader.ast.spi.CascadingFetchProfile; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.type.AnyType; @@ -43,7 +41,9 @@ import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable; import static org.hibernate.engine.internal.ManagedTypeHelper.isSelfDirtinessTracker; import static org.hibernate.event.internal.EntityState.getEntityState; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.event.internal.EventUtil.getLoggableName; +import static org.hibernate.pretty.MessageHelper.infoString; import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; /** @@ -56,8 +56,6 @@ public class DefaultMergeEventListener extends AbstractSaveEventListener implements MergeEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultMergeEventListener.class ); - @Override protected Map getMergeMap(MergeContext context) { return context.invertMap(); @@ -100,7 +98,7 @@ public void onMerge(MergeEvent event, MergeContext copiedAlready) throws Hiberna final var lazyInitializer = extractLazyInitializer( original ); if ( lazyInitializer != null ) { if ( lazyInitializer.isUninitialized() ) { - LOG.trace( "Ignoring uninitialized proxy" ); + EVENT_LISTENER_LOGGER.ignoringUninitializedProxy(); event.setResult( source.getReference( lazyInitializer.getEntityName(), lazyInitializer.getInternalIdentifier() ) ); } else { @@ -110,7 +108,7 @@ public void onMerge(MergeEvent event, MergeContext copiedAlready) throws Hiberna else if ( isPersistentAttributeInterceptable( original ) ) { if ( asPersistentAttributeInterceptable( original ).$$_hibernate_getInterceptor() instanceof EnhancementAsProxyLazinessInterceptor proxyInterceptor ) { - LOG.trace( "Ignoring uninitialized enhanced proxy" ); + EVENT_LISTENER_LOGGER.ignoringUninitializedEnhancedProxy(); event.setResult( source.byId( proxyInterceptor.getEntityName() ) .getReference( proxyInterceptor.getIdentifier() ) ); } @@ -126,12 +124,12 @@ else if ( isPersistentAttributeInterceptable( original ) ) { private void doMerge(MergeEvent event, MergeContext copiedAlready, Object entity) { if ( copiedAlready.containsKey( entity ) && copiedAlready.isOperatedOn( entity ) ) { - LOG.trace( "Already in merge process" ); + EVENT_LISTENER_LOGGER.alreadyInMergeProcess(); event.setResult( entity ); } else { if ( copiedAlready.containsKey( entity ) ) { - LOG.trace( "Already in copyCache; setting in merge process" ); + EVENT_LISTENER_LOGGER.alreadyInMergeContext(); copiedAlready.setOperatedOn( entity, true ); } event.setEntity( entity ); @@ -256,11 +254,15 @@ else if ( subtype instanceof ComponentType componentType ) { } protected void entityIsPersistent(MergeEvent event, MergeContext copyCache) { - LOG.trace( "Ignoring persistent instance" ); //TODO: check that entry.getIdentifier().equals(requestedId) final Object entity = event.getEntity(); final var source = event.getSession(); - final var persister = source.getEntityPersister( event.getEntityName(), entity ); + final String entityName = event.getEntityName(); + final var persister = source.getEntityPersister( entityName, entity ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.ignoringPersistentInstance( + infoString( entityName, persister.getIdentifier( entity, copyCache ) ) ); + } copyCache.put( entity, entity, true ); //before cascade! cascadeOnMerge( source, persister, entity, copyCache ); TypeHelper.replace( persister, entity, source, entity, copyCache ); @@ -268,13 +270,14 @@ protected void entityIsPersistent(MergeEvent event, MergeContext copyCache) { } protected void entityIsTransient(MergeEvent event, Object id, MergeContext copyCache) { - LOG.trace( "Merging transient instance" ); - final Object entity = event.getEntity(); final var session = event.getSession(); final var interceptor = session.getInterceptor(); final String entityName = event.getEntityName(); final var persister = session.getEntityPersister( entityName, entity ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.mergingTransientInstance( infoString( entityName, id ) ); + } final String[] propertyNames = persister.getPropertyNames(); final Type[] propertyTypes = persister.getPropertyTypes(); final Object copy = copyEntity( copyCache, entity, session, persister, id ); @@ -395,8 +398,6 @@ private void saveTransientEntity( } protected void entityIsDetached(MergeEvent event, Object copiedId, Object originalId, MergeContext copyCache) { - LOG.trace( "Merging detached instance" ); - final Object entity = event.getEntity(); final var session = event.getSession(); final var persister = session.getEntityPersister( event.getEntityName(), entity ); @@ -409,15 +410,19 @@ protected void entityIsDetached(MergeEvent event, Object copiedId, Object origin ? persister.getIdentifierType().deepCopy( originalId, event.getFactory() ) : copiedId; final Object id = getDetachedEntityId( event, originalId, persister ); - // we must clone embedded composite identifiers, or we will get back the same instance that we pass in - // apply the special MERGE fetch profile and perform the resolution (Session#get) + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.mergingDetachedInstance( infoString( entityName, id ) ); + } + // We must clone embedded composite identifiers, or we will get + // back the same instance that we pass in. Apply the special MERGE + // fetch profile and perform the resolution (Session#get). final Object result = session.getLoadQueryInfluencers() .fromInternalFetchProfile( CascadingFetchProfile.MERGE, () -> session.get( entityName, clonedIdentifier ) ); if ( result == null ) { - LOG.trace( "Detached instance not found in database" ); + EVENT_LISTENER_LOGGER.detachedInstanceNotFoundInDatabase(); // we got here because we assumed that an instance // with an assigned id and no version was detached // when it was really transient (or deleted) diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPersistEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPersistEventListener.java index 67f9697a4bb0..3f8d9ecb7d0e 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPersistEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPersistEventListener.java @@ -15,14 +15,13 @@ import org.hibernate.event.spi.PersistContext; import org.hibernate.event.spi.PersistEvent; import org.hibernate.event.spi.PersistEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.proxy.HibernateProxy; import static org.hibernate.event.internal.EntityState.getEntityState; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; +import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; /** * Defines the default event listener used by Hibernate for persisting @@ -34,8 +33,6 @@ public class DefaultPersistEventListener extends AbstractSaveEventListener implements PersistEventListener, CallbackRegistryConsumer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultPersistEventListener.class ); - @Override protected CascadingAction getCascadeAction() { return CascadingActions.PERSIST; @@ -61,7 +58,7 @@ public void onPersist(PersistEvent event) throws HibernateException { @Override public void onPersist(PersistEvent event, PersistContext createCache) throws HibernateException { final Object object = event.getObject(); - final var lazyInitializer = HibernateProxy.extractLazyInitializer( object ); + final var lazyInitializer = extractLazyInitializer( object ); if ( lazyInitializer != null ) { if ( lazyInitializer.isUninitialized() ) { if ( lazyInitializer.getSession() != event.getSession() ) { @@ -119,12 +116,18 @@ private static String entityName(PersistEvent event, Object entity, EntityEntry } protected void entityIsPersistent(PersistEvent event, PersistContext createCache) { - LOG.trace( "Ignoring persistent instance" ); final var source = event.getSession(); + final String entityName = event.getEntityName(); //TODO: check that entry.getIdentifier().equals(requestedId) final Object entity = source.getPersistenceContextInternal().unproxy( event.getObject() ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + final var persister = source.getEntityPersister( entityName, entity ); + EVENT_LISTENER_LOGGER.ignoringPersistentInstance( + infoString( entityName, persister.getIdentifier( entity ) ) ); + } if ( createCache.add( entity ) ) { - justCascade( createCache, source, entity, source.getEntityPersister( event.getEntityName(), entity ) ); + final var persister = source.getEntityPersister( entityName, entity ); + justCascade( createCache, source, entity, persister ); } } @@ -134,14 +137,8 @@ private void justCascade(PersistContext createCache, EventSource source, Object cascadeAfterSave( source, persister, entity, createCache ); } - /** - * Handle the given persist event. - * - * @param event The persist event to be handled - * @param createCache The copy cache of entity instance to merge/copy instance - */ protected void entityIsTransient(PersistEvent event, PersistContext createCache) { - LOG.trace( "Persisting transient instance" ); + EVENT_LISTENER_LOGGER.persistingTransientInstance(); final var source = event.getSession(); final Object entity = source.getPersistenceContextInternal().unproxy( event.getObject() ); if ( createCache.add( entity ) ) { @@ -153,9 +150,10 @@ private void entityIsDeleted(PersistEvent event, PersistContext createCache) { final var source = event.getSession(); final Object entity = source.getPersistenceContextInternal().unproxy( event.getObject() ); final var persister = source.getEntityPersister( event.getEntityName(), entity ); - if ( LOG.isTraceEnabled() ) { + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { final Object id = persister.getIdentifier( entity, source ); - LOG.trace( "Unscheduling entity deletion: " + infoString( persister, id, source.getFactory() ) ); + EVENT_LISTENER_LOGGER.unschedulingEntityDeletion( + infoString( persister, id, source.getFactory() ) ); } if ( createCache.add( entity ) ) { justCascade( createCache, source, entity, persister ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java index 6ef05db35da1..0658a0899e82 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java @@ -19,8 +19,6 @@ import org.hibernate.event.spi.RefreshContext; import org.hibernate.event.spi.RefreshEvent; import org.hibernate.event.spi.RefreshEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.loader.ast.spi.CascadingFetchProfile; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.proxy.LazyInitializer; @@ -28,6 +26,7 @@ import org.hibernate.type.ComponentType; import org.hibernate.type.Type; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; @@ -39,8 +38,6 @@ */ public class DefaultRefreshEventListener implements RefreshEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultRefreshEventListener.class ); - @Override public void onRefresh(RefreshEvent event) throws HibernateException { onRefresh( event, RefreshContext.create() ); @@ -65,7 +62,7 @@ public void onRefresh(RefreshEvent event, RefreshContext refreshedAlready) { refresh( event, refreshedAlready, entity ); } else { - LOG.trace( "Already refreshed" ); + EVENT_LISTENER_LOGGER.alreadyRefreshed(); } } } @@ -139,16 +136,18 @@ private static void refresh(RefreshEvent event, RefreshContext refreshedAlready, throw new TransientObjectException( "Cannot refresh instance of entity '" + persister.getEntityName() + "' because it has a null identifier" ); } - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Refreshing transient " + infoString( persister, id, event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.refreshingTransient( + infoString( persister, id, event.getFactory() ) ); } if ( persistenceContext.getEntry( source.generateEntityKey( id, persister ) ) != null ) { throw new NonUniqueObjectException( id, persister.getEntityName() ); } } else { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Refreshing " + infoString( entry.getPersister(), entry.getId(), event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.refreshing( + infoString( entry.getPersister(), entry.getId(), event.getFactory() ) ); } if ( !entry.isExistsInDatabase() ) { throw new UnresolvableObjectException( diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultReplicateEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultReplicateEventListener.java index 3da17b2e9014..710c4593eccc 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultReplicateEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultReplicateEventListener.java @@ -17,12 +17,11 @@ import org.hibernate.event.spi.EventSource; import org.hibernate.event.spi.ReplicateEvent; import org.hibernate.event.spi.ReplicateEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.type.BasicType; import org.hibernate.type.Type; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; /** @@ -38,8 +37,6 @@ public class DefaultReplicateEventListener extends AbstractSaveEventListener implements ReplicateEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultReplicateEventListener.class ); - /** * Handle the given replicate event. * @@ -52,12 +49,12 @@ public void onReplicate(ReplicateEvent event) { final var source = event.getSession(); final var persistenceContext = source.getPersistenceContextInternal(); if ( persistenceContext.reassociateIfUninitializedProxy( event.getObject() ) ) { - LOG.trace( "Uninitialized proxy passed to replicate()" ); + EVENT_LISTENER_LOGGER.uninitializedProxyPassedToReplicate(); } else { final Object entity = persistenceContext.unproxyAndReassociate( event.getObject() ); if ( persistenceContext.isEntryFor( entity ) ) { - LOG.trace( "Ignoring persistent instance passed to replicate()" ); + EVENT_LISTENER_LOGGER.ignoringPersistentInstancePassedToReplicate(); //hum ... should we cascade anyway? throw an exception? fine like it is? } else { @@ -83,8 +80,9 @@ private void doReplicate(ReplicateEvent event, EventSource source, Object entity : persister.getCurrentVersion( id, source); // what is the version on the database? if ( oldVersion != null ) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Found existing row for " + infoString( persister, id, event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.foundExistingRowFor( + infoString( persister, id, event.getFactory() ) ); } // If the entity has no version, getCurrentVersion() just returns // a meaningless value to indicate that the row exists (HHH-2378) @@ -95,18 +93,18 @@ private void doReplicate(ReplicateEvent event, EventSource source, Object entity // execute a SQL UPDATE performReplication( entity, id, realOldVersion, persister, replicationMode, source ); } - else if ( LOG.isTraceEnabled() ) { + else if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { // do nothing (don't even reassociate entity!) - LOG.trace( "No need to replicate" ); + EVENT_LISTENER_LOGGER.noNeedToReplicate(); } //TODO: would it be better to do a refresh from db? } else { // no existing row - execute a SQL INSERT - if ( LOG.isTraceEnabled() ) { - LOG.trace( "No existing row, replicating new instance " - + infoString( persister, id, event.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.noExistingRowReplicatingNewInstance( + infoString( persister, id, event.getFactory() ) ); } final boolean regenerate = persister.isIdentifierAssignedByInsert(); // prefer re-generation of identity! final var key = regenerate ? null : source.generateEntityKey( id, persister ); @@ -155,8 +153,9 @@ private void performReplication( ReplicationMode replicationMode, EventSource source) throws HibernateException { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Replicating changes to " + infoString( persister, id, source.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.replicatingChangesTo( + infoString( persister, id, source.getFactory() ) ); } new OnReplicateVisitor( source, id, entity, true ).process( entity, persister ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyAllowedLoggedObserver.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyAllowedLoggedObserver.java index 33902fd089a9..ebb7adc711b7 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyAllowedLoggedObserver.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyAllowedLoggedObserver.java @@ -12,10 +12,9 @@ import org.hibernate.event.spi.EntityCopyObserver; import org.hibernate.event.spi.EntityCopyObserverFactory; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.collections.IdentitySet; +import static org.hibernate.event.internal.EntityCopyLogging.EVENT_COPY_LOGGER; import static org.hibernate.pretty.MessageHelper.infoString; /** @@ -27,8 +26,6 @@ */ public final class EntityCopyAllowedLoggedObserver implements EntityCopyObserver { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( EntityCopyAllowedLoggedObserver.class ); - public static final EntityCopyObserverFactory FACTORY_OF_SELF = EntityCopyAllowedLoggedObserver::new; public static final String SHORT_NAME = "log"; @@ -54,9 +51,10 @@ public void entityCopyDetected( Object mergeEntity2, EventSource session) { final String entityName = session.getEntityName( managedEntity ); - if ( LOG.isTraceEnabled() ) { - LOG.trace( "More than one representation of the same persistent entity being merged for: " - + infoString( entityName, session.getIdentifier( managedEntity ) ) ); + if ( EVENT_COPY_LOGGER.isTraceEnabled() ) { + EVENT_COPY_LOGGER.duplicateRepresentationBeingMerged( + infoString( entityName, session.getIdentifier( managedEntity ) ) + ); } Set detachedEntitiesForManaged = null; if ( managedToMergeEntitiesXref == null ) { @@ -111,49 +109,44 @@ public void topLevelMergeComplete(EventSource session) { // Log the summary. if ( countsByEntityName != null ) { for ( var entry : countsByEntityName.entrySet() ) { - LOG.debug( - String.format( - "Summary: number of %s entities with multiple representations merged: %d", - entry.getKey(), - entry.getValue() - ) - ); + EVENT_COPY_LOGGER.mergeSummaryMultipleRepresentations( + entry.getKey(), entry.getValue() ); } } else { - LOG.debug( "No entity copies merged" ); + EVENT_COPY_LOGGER.noEntityCopiesMerged(); } if ( managedToMergeEntitiesXref != null ) { for ( var entry : managedToMergeEntitiesXref.entrySet() ) { final Object managedEntity = entry.getKey(); - final Set mergeEntities = entry.getValue(); - final var sb = - new StringBuilder( "Details: merged ") - .append( mergeEntities.size() ) - .append( " representations of the same entity " ) - .append( infoString( session.getEntityName( managedEntity ), - session.getIdentifier( managedEntity ) ) ) - .append( " being merged: " ); - boolean first = true; - for ( Object mergeEntity : mergeEntities ) { - if ( first ) { - first = false; - } - else { - sb.append( ", " ); - } - sb.append( getManagedOrDetachedEntityString( managedEntity, mergeEntity ) ); - } - sb.append( "; resulting managed entity: [" ).append( managedEntity ).append( ']' ); - LOG.debug( sb.toString()); + EVENT_COPY_LOGGER.mergeDetails( + entry.getValue().size(), + infoString( session.getEntityName( managedEntity ), + session.getIdentifier( managedEntity ) ), + renderList( entry.getValue(), managedEntity ), + String.valueOf( managedEntity ) + ); } } } - private String getManagedOrDetachedEntityString(Object managedEntity, Object mergeEntity ) { - return mergeEntity == managedEntity - ? "Managed: [" + mergeEntity + "]" - : "Detached: [" + mergeEntity + "]"; + private String renderList(Set mergeEntities, Object managedEntity) { + final var list = new StringBuilder(); + boolean first = true; + for ( Object mergeEntity : mergeEntities ) { + if ( first ) { + first = false; + } + else { + list.append(", "); + } + list.append( mergeEntity == managedEntity ? "Managed" : "Detached" ) + .append( " [" ) + .append( mergeEntity ) + .append( ']' ); + } + return list.toString(); } + } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyLogging.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyLogging.java new file mode 100644 index 000000000000..9933de5d4553 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyLogging.java @@ -0,0 +1,64 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.event.internal; + +import org.hibernate.Internal; +import org.hibernate.internal.log.SubSystemLogging; +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; + +import static org.jboss.logging.Logger.Level.DEBUG; +import static org.jboss.logging.Logger.Level.TRACE; + +/** + * Subsystem logging related to EntityCopyObservers + */ +@SubSystemLogging( + name = EntityCopyLogging.NAME, + description = "Logging related to EntityCopyObservers" +) +@MessageLogger(projectCode = "HHH") +@ValidIdRange(min = 90080001, max = 90090000) +@Internal +public interface EntityCopyLogging extends BasicLogger { + String NAME = EventListenerLogging.NAME + ".copy"; + + EntityCopyLogging EVENT_COPY_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), EntityCopyLogging.class, NAME ); + + + // EntityCopyObserver + + @LogMessage(level = TRACE) + @Message(id = 90080001, value = "More than one representation of the same persistent entity being merged: %s") + void duplicateRepresentationBeingMerged(String infoString); + + @LogMessage(level = DEBUG) + @Message(id = 90080002, value = "Summary: number of %s entities with multiple representations merged: %d") + void mergeSummaryMultipleRepresentations(String entityName, int count); + + @LogMessage(level = DEBUG) + @Message(id = 90080003, value = "No entity copies merged") + void noEntityCopiesMerged(); + + @LogMessage(level = DEBUG) + @Message(id = 90080010, value = "Details: merged %d representations of the same entity %s being merged: %s; resulting managed entity: [%s]") + void mergeDetails(int numberOfRepresentations, String entityInfo, String mergedEntitiesList, String managedEntityString); + + // EntityCopyObserverFactoryInitiator + + @LogMessage(level = TRACE) + @Message(id = 90080100, value = "Configured EntityCopyObserver strategy: %s") + void configuredEntityCopyObserverStrategy(String strategyName); + + @LogMessage(level = TRACE) + @Message(id = 90080101, value = "Configured EntityCopyObserver is a custom implementation of type '%s'") + void configuredEntityCopyObserverCustomImplementation(String typeName); +} diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java index 570c3591e605..e97592fa92ca 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyNotAllowedObserver.java @@ -32,22 +32,21 @@ public void entityCopyDetected( Object mergeEntity2, EventSource session) { if ( mergeEntity1 == managedEntity && mergeEntity2 == managedEntity) { - throw new AssertionFailure( "entity1 and entity2 are the same as managedEntity; must be different." ); + throw new AssertionFailure( "entity1 and entity2 are the same as managedEntity; must be different" ); } - final String managedEntityString = - infoString( session.getEntityName( managedEntity ), - session.getIdentifier( managedEntity ) ); - throw new IllegalStateException( - "Multiple representations of the same entity " + managedEntityString + " are being merged. " + - getManagedOrDetachedEntityString( managedEntity, mergeEntity1 ) + "; " + - getManagedOrDetachedEntityString( managedEntity, mergeEntity2 ) - ); + throw new IllegalStateException( "Multiple representations of the same entity " + + infoString( session.getEntityName( managedEntity ), session.getIdentifier( managedEntity ) ) + + " are being merged: " + managedOrDetachedEntityString( managedEntity, mergeEntity1 ) + + "; " + managedOrDetachedEntityString( managedEntity, mergeEntity2 ) ); } - private String getManagedOrDetachedEntityString(Object managedEntity, Object entity ) { - return entity == managedEntity - ? "Managed: [" + entity + "]" - : "Detached: [" + entity + "]"; + private String managedOrDetachedEntityString(Object managedEntity, Object entity ) { + return new StringBuilder() + .append( entity == managedEntity ? "Managed" : "Detached" ) + .append( " [" ) + .append( entity ) + .append( ']' ) + .toString(); } public void clear() { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java index 5b72c1d71a7c..0e5db3a3ba58 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityCopyObserverFactoryInitiator.java @@ -12,11 +12,10 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.event.spi.EntityCopyObserver; import org.hibernate.event.spi.EntityCopyObserverFactory; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.service.spi.ServiceRegistryImplementor; import static org.hibernate.cfg.AvailableSettings.MERGE_ENTITY_COPY_OBSERVER; +import static org.hibernate.event.internal.EntityCopyLogging.EVENT_COPY_LOGGER; /** * Looks for the configuration property {@value AvailableSettings#MERGE_ENTITY_COPY_OBSERVER} and registers @@ -30,8 +29,6 @@ public class EntityCopyObserverFactoryInitiator implements StandardServiceInitia public static final EntityCopyObserverFactoryInitiator INSTANCE = new EntityCopyObserverFactoryInitiator(); - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( EntityCopyObserverFactoryInitiator.class ); - @Override public EntityCopyObserverFactory initiateService(final Map configurationValues, final ServiceRegistryImplementor registry) { final Object value = getConfigurationValue( configurationValues ); @@ -40,20 +37,17 @@ public EntityCopyObserverFactory initiateService(final Map confi } else if ( value.equals( EntityCopyNotAllowedObserver.SHORT_NAME ) || value.equals( EntityCopyNotAllowedObserver.class.getName() ) ) { - LOG.tracef( "Configured EntityCopyObserver strategy: %s", - EntityCopyNotAllowedObserver.SHORT_NAME ); + EVENT_COPY_LOGGER.configuredEntityCopyObserverStrategy( EntityCopyNotAllowedObserver.SHORT_NAME ); return EntityCopyNotAllowedObserver.FACTORY_OF_SELF; } else if ( value.equals( EntityCopyAllowedObserver.SHORT_NAME ) || value.equals( EntityCopyAllowedObserver.class.getName() ) ) { - LOG.tracef( "Configured EntityCopyObserver strategy: %s", - EntityCopyAllowedObserver.SHORT_NAME ); + EVENT_COPY_LOGGER.configuredEntityCopyObserverStrategy( EntityCopyAllowedObserver.SHORT_NAME ); return EntityCopyAllowedObserver.FACTORY_OF_SELF; } else if ( value.equals( EntityCopyAllowedLoggedObserver.SHORT_NAME ) || value.equals( EntityCopyAllowedLoggedObserver.class.getName() ) ) { - LOG.tracef( "Configured EntityCopyObserver strategy: %s", - EntityCopyAllowedLoggedObserver.SHORT_NAME ); + EVENT_COPY_LOGGER.configuredEntityCopyObserverStrategy( EntityCopyAllowedLoggedObserver.SHORT_NAME ); return EntityCopyAllowedLoggedObserver.FACTORY_OF_SELF; } else { @@ -65,8 +59,7 @@ else if ( value.equals( EntityCopyAllowedLoggedObserver.SHORT_NAME ) registry.requireService( StrategySelector.class ) .resolveStrategy( EntityCopyObserver.class, value ); final var observerType = exampleInstance.getClass(); - LOG.tracef( "Configured EntityCopyObserver is a custom implementation of type '%s'", - observerType.getName() ); + EVENT_COPY_LOGGER.configuredEntityCopyObserverCustomImplementation( observerType.getName() ); return new EntityCopyObserverFactoryFromClass( observerType ); } } @@ -91,15 +84,14 @@ public Class getServiceInitiated() { private record EntityCopyObserverFactoryFromClass(Class observerClass) implements EntityCopyObserverFactory { - @Override - public EntityCopyObserver createEntityCopyObserver() { - try { - return observerClass.newInstance(); - } - catch (Exception e) { - throw new HibernateException( "Could not instantiate class of type " + observerClass.getName() ); - } + public EntityCopyObserver createEntityCopyObserver() { + try { + return observerClass.newInstance(); + } + catch (Exception e) { + throw new HibernateException( "Could not instantiate class of type " + observerClass.getName() ); } } + } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java index 2373195b9390..a45b55269313 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EntityState.java @@ -8,16 +8,10 @@ import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.Status; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; - -import static org.hibernate.event.internal.EventUtil.getLoggableName; public enum EntityState { PERSISTENT, TRANSIENT, DETACHED, DELETED; - static final CoreMessageLogger LOG = CoreLogging.messageLogger( EntityState.class ); - /** * Determine whether the entity is persistent, detached, or transient * @@ -39,42 +33,45 @@ public static EntityState getEntityState( //the entity is associated with the session, so check its status if ( entry.getStatus() != Status.DELETED ) { // do nothing for persistent instances - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Persistent instance of: " + getLoggableName( entityName, entity ) ); - } +// if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { +// EVENT_LISTENER_LOGGER.persistentInstance( getLoggableName( entityName, entity ) ); +// } return PERSISTENT; } - // ie. e.status==DELETED - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Deleted instance of: " + getLoggableName( entityName, entity ) ); + else { + // must be deleted instance +// if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { +// EVENT_LISTENER_LOGGER.deletedInstance( getLoggableName( entityName, entity ) ); +// } + return DELETED; } - return DELETED; } // the object is transient or detached // the entity is not associated with the session, so // try interceptor and unsaved-value - if ( ForeignKeys.isTransient( entityName, entity, assumedUnsaved, source ) ) { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Transient instance of: " + getLoggableName( entityName, entity ) ); - } + else if ( ForeignKeys.isTransient( entityName, entity, assumedUnsaved, source ) ) { +// if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { +// EVENT_LISTENER_LOGGER.transientInstance( getLoggableName( entityName, entity ) ); +// } return TRANSIENT; } - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Detached instance of: " + getLoggableName( entityName, entity ) ); - } - - final var persistenceContext = source.getPersistenceContextInternal(); - if ( persistenceContext.containsDeletedUnloadedEntityKeys() ) { - final var entityPersister = source.getEntityPersister( entityName, entity ); - final Object identifier = entityPersister.getIdentifier( entity, source ); - final var entityKey = source.generateEntityKey( identifier, entityPersister ); - if ( persistenceContext.containsDeletedUnloadedEntityKey( entityKey ) ) { - return EntityState.DELETED; + else { +// if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { +// EVENT_LISTENER_LOGGER.detachedInstance( getLoggableName( entityName, entity ) ); +// } + final var persistenceContext = source.getPersistenceContextInternal(); + if ( persistenceContext.containsDeletedUnloadedEntityKeys() ) { + final var entityPersister = source.getEntityPersister( entityName, entity ); + final Object identifier = entityPersister.getIdentifier( entity, source ); + final var entityKey = source.generateEntityKey( identifier, entityPersister ); + if ( persistenceContext.containsDeletedUnloadedEntityKey( entityKey ) ) { + return EntityState.DELETED; + } } + return DETACHED; } - return DETACHED; } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EventListenerLogging.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EventListenerLogging.java new file mode 100644 index 000000000000..0a284a8003bd --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EventListenerLogging.java @@ -0,0 +1,332 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.event.internal; + +import org.hibernate.Internal; +import org.hibernate.internal.log.SubSystemLogging; + +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; + +import static org.jboss.logging.Logger.Level.DEBUG; +import static org.jboss.logging.Logger.Level.TRACE; + +/** + * Subsystem logging related to event listeners + */ +@SubSystemLogging( + name = EventListenerLogging.NAME, + description = "Logging related to event listeners and event listener services" +) +@MessageLogger(projectCode = "HHH") +@ValidIdRange(min = 90060001, max = 90070000) +@Internal +public interface EventListenerLogging extends BasicLogger { + String NAME = SubSystemLogging.BASE + ".event"; + + EventListenerLogging EVENT_LISTENER_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), EventListenerLogging.class, NAME ); + + // Load + + @LogMessage(level = TRACE) + @Message(id = 90060008, value = "Loading entity %s") + void loadingEntity(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060005, value = "Entity proxy found in session cache") + void entityProxyFoundInSessionCache(); // dupe of SessionLogging + + @LogMessage(level = DEBUG) + @Message(id = 90060007, value = "Ignoring NO_PROXY to honor laziness") + void ignoringNoProxyToHonorLaziness(); // dupe of SessionLogging + + @LogMessage(level = TRACE) + @Message(id = 90060050, value = "Creating new proxy for entity") + void creatingNewProxy(); + + @LogMessage(level = TRACE) + @Message(id = 90060051, value = "Searching caches for entity %s") + void resolving(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060006, value = "Entity found in persistence context") + void entityResolvedInPersistenceContext(); + + @LogMessage(level = TRACE) + @Message(id = 90060052, value = "Entity found in second-level cache %s") + void entityResolvedInCache(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060053, value = "Entity not found in any cache, loading from datastore %s") + void entityNotResolvedInCache(String infoString); + + // Auto-flush + + @LogMessage(level = TRACE) + @Message(id = 90060038, value = "Need to execute flush") + void needToExecuteFlush(); + + @LogMessage(level = TRACE) + @Message(id = 90060039, value = "No need to execute flush") + void noNeedToExecuteFlush(); + + // Flush + + @LogMessage(level = DEBUG) + @Message(id = 90060071, value = "Flushed: %s insertions, %s updates, %s deletions to %s objects") + void flushedEntitiesSummary(int insertions, int updates, int deletions, int objects); + + @LogMessage(level = DEBUG) + @Message(id = 90060072, value = "Flushed: %s (re)creations, %s updates, %s removals to %s collections") + void flushedCollectionsSummary(int recreations, int updates, int removals, int collections); + + @LogMessage(level = TRACE) + @Message(id = 90060011, value = "Flushing session") + void flushingSession(); + + @LogMessage(level = TRACE) + @Message(id = 90060012, value = "Processing flush-time cascades") + void processingFlushTimeCascades(); + + @LogMessage(level = TRACE) + @Message(id = 90060013, value = "Dirty checking collections") + void dirtyCheckingCollections(); + + @LogMessage(level = TRACE) + @Message(id = 90060014, value = "Flushing entities and processing referenced collections") + void flushingEntitiesAndProcessingReferencedCollections(); + + @LogMessage(level = TRACE) + @Message(id = 90060015, value = "Processing unreferenced collections") + void processingUnreferencedCollections(); + + @LogMessage(level = TRACE) + @Message(id = 90060016, value = "Scheduling collection removes, (re)creates, and updates") + void schedulingCollectionOperations(); + + @LogMessage(level = TRACE) + @Message(id = 90060017, value = "Executing flush") + void executingFlush(); + + @LogMessage(level = TRACE) + @Message(id = 90060018, value = "Post flush") + void postFlush(); + + // Flush entity + + @LogMessage(level = TRACE) + @Message(id = 90060059, value = "Updating immutable, deleted entity %s") + void updatingImmutableDeletedEntity(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060060, value = "Updating non-modifiable, deleted entity %s") + void updatingNonModifiableDeletedEntity(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060061, value = "Updating deleted entity %s") + void updatingDeletedEntity(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060062, value = "Updating entity %s") + void updatingEntity(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060063, value = "Found dirty properties [%s] (%s)") + void foundDirtyProperties(String entityInfo, String dirtyPropertyNames); + + // Merge + + @LogMessage(level = TRACE) + @Message(id = 90060019, value = "Ignoring uninitialized proxy in merge") + void ignoringUninitializedProxy(); + + @LogMessage(level = TRACE) + @Message(id = 90060020, value = "Ignoring uninitialized enhanced proxy in merge") + void ignoringUninitializedEnhancedProxy(); + + @LogMessage(level = TRACE) + @Message(id = 90060021, value = "Already in merge process") + void alreadyInMergeProcess(); + + @LogMessage(level = TRACE) + @Message(id = 90060022, value = "Already in merge context; adding to merge process") + void alreadyInMergeContext(); + + @LogMessage(level = TRACE) + @Message(id = 90060023, value = "Ignoring persistent instance %s") + void ignoringPersistentInstance(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060024, value = "Merging transient instance %s") + void mergingTransientInstance(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060025, value = "Merging detached instance %s") + void mergingDetachedInstance(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060026, value = "Detached instance not found in database") + void detachedInstanceNotFoundInDatabase(); + + // Replicate + + @LogMessage(level = TRACE) + @Message(id = 90060027, value = "Uninitialized proxy passed to replicate()") + void uninitializedProxyPassedToReplicate(); + + @LogMessage(level = TRACE) + @Message(id = 90060028, value = "Ignoring persistent instance passed to replicate()") + void ignoringPersistentInstancePassedToReplicate(); + + @LogMessage(level = TRACE) + @Message(id = 90060029, value = "Found existing row for %s") + void foundExistingRowFor(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060030, value = "No need to replicate") + void noNeedToReplicate(); + + @LogMessage(level = TRACE) + @Message(id = 90060031, value = "No existing row, replicating new instance %s") + void noExistingRowReplicatingNewInstance(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060032, value = "Replicating changes to %s") + void replicatingChangesTo(String infoString); + + // Initialize collection + + @LogMessage(level = TRACE) + @Message(id = 90060033, value = "Initializing collection %s") + void initializingCollection(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060034, value = "Collection initialized from cache") + void collectionInitializedFromCache(); + + @LogMessage(level = TRACE) + @Message(id = 90060035, value = "Collection not cached") + void collectionNotCached(); + + @LogMessage(level = TRACE) + @Message(id = 90060036, value = "Collection initialized") + void collectionInitialized(); + + @LogMessage(level = TRACE) + @Message(id = 90060037, value = "Disregarding cached version (if any) of collection due to enabled filters") + void disregardingCachedVersionDueToEnabledFilters(); + + // Persist + + @LogMessage(level = TRACE) + @Message(id = 90060058, value = "Persisting %s") + void persisting(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060040, value = "Persisting transient instance") + void persistingTransientInstance(); + + @LogMessage(level = TRACE) + @Message(id = 90060041, value = "Unscheduling entity deletion %s") + void unschedulingEntityDeletion(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060076, value ="Generated identifier [%s] using generator '%s'") + void generatedId(String loggableString, String name); + + // Refresh + + @LogMessage(level = TRACE) + @Message(id = 90060044, value = "Refreshing %s") + void refreshing(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060043, value = "Refreshing transient %s") + void refreshingTransient(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060042, value = "Already refreshed") + void alreadyRefreshed(); + + // Delete + + @LogMessage(level = TRACE) + @Message(id = 90060047, value = "Deleting %s") + void deleting(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060045, value = "Deleted entity was not associated with current session") + void deletedEntityNotAssociatedWithSession(); + + @LogMessage(level = TRACE) + @Message(id = 90060046, value = "Already handled transient entity; skipping") + void alreadyHandledTransient(); + + @LogMessage(level = DEBUG) + @Message(id = 90060001, value = "Flushing and evicting managed instance of type [%s] before removing detached instance with same id") + void flushAndEvictOnRemove(String entityName); + + @LogMessage(level = DEBUG) + @Message(id = 90060002, value = "Handling transient entity in delete processing") + void handlingTransientEntity(); + + @LogMessage(level = TRACE) + @Message(id = 90060009, value = "Deleting a persistent instance") + void deletingPersistentInstance(); + + @LogMessage(level = TRACE) + @Message(id = 90060010, value = "Persistent instance was already deleted or scheduled for deletion") + void alreadyDeleted(); + + // Evict + + @LogMessage(level = TRACE) + @Message(id = 90060048, value = "Evicting %s") + void evicting(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060049, value = "Evicting collection %s") + void evictingCollection(String collectionInfo); + + // Lock + + @LogMessage(level = TRACE) + @Message(id = 90060064, value = "Reassociating transient instance: %s") + void reassociatingTransientInstance(String infoString); + + // EntityState + +// @LogMessage(level = TRACE) +// @Message(id = 90060054, value = "Persistent instance of: %s") +// void persistentInstance(String loggableName); +// +// @LogMessage(level = TRACE) +// @Message(id = 90060055, value = "Deleted instance of: %s") +// void deletedInstance(String loggableName); +// +// @LogMessage(level = TRACE) +// @Message(id = 90060056, value = "Transient instance of: %s") +// void transientInstance(String loggableName); +// +// @LogMessage(level = TRACE) +// @Message(id = 90060057, value = "Detached instance of: %s") +// void detachedInstance(String loggableName); + + // Reattach / wrap + + @LogMessage(level = TRACE) + @Message(id = 90060066, value = "Collection dereferenced while transient %s") + void collectionDereferencedWhileTransient(String infoString); + + @LogMessage(level = TRACE) + @Message(id = 90060067, value = "Wrapped collection in role: %s") + void wrappedCollectionInRole(String role); +} diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/EvictVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/EvictVisitor.java index 81b285fe6dda..e9c08dd24de3 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/EvictVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/EvictVisitor.java @@ -9,10 +9,9 @@ import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.spi.CollectionKey; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.type.CollectionType; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.collectionInfoString; /** @@ -24,8 +23,6 @@ */ public class EvictVisitor extends AbstractVisitor { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( EvictVisitor.class ); - private final Object owner; public EvictVisitor(EventSource session, Object owner) { @@ -70,8 +67,9 @@ private void evictCollection(PersistentCollection collection) { final var persister = ce.getLoadedPersister(); final Object loadedKey = ce.getLoadedKey(); - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Evicting collection: " + collectionInfoString( persister, collection, loadedKey, session ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.evictingCollection( + collectionInfoString( persister, collection, loadedKey, session ) ); } if ( persister != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java index f3cc7522727a..eb059e50b610 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/ReattachVisitor.java @@ -7,12 +7,11 @@ import org.hibernate.HibernateException; import org.hibernate.action.internal.CollectionRemoveAction; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.type.CompositeType; import org.hibernate.type.Type; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.pretty.MessageHelper.collectionInfoString; /** @@ -22,8 +21,6 @@ */ public abstract class ReattachVisitor extends ProxyVisitor { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( ReattachVisitor.class ); - private final Object ownerIdentifier; private final Object owner; @@ -76,11 +73,13 @@ Object processComponent(Object component, CompositeType componentType) throws Hi */ void removeCollection(CollectionPersister role, Object collectionKey, EventSource source) throws HibernateException { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Collection dereferenced while transient " - + collectionInfoString( role, ownerIdentifier, source.getFactory() ) ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.collectionDereferencedWhileTransient( + collectionInfoString( role, ownerIdentifier, source.getFactory() ) + ); } - source.getActionQueue().addAction( new CollectionRemoveAction( owner, role, collectionKey, false, source ) ); + source.getActionQueue() + .addAction( new CollectionRemoveAction( owner, role, collectionKey, false, source ) ); } /** @@ -95,10 +94,9 @@ void removeCollection(CollectionPersister role, Object collectionKey, EventSourc */ final Object extractCollectionKeyFromOwner(CollectionPersister role) { final var collectionType = role.getCollectionType(); - if ( collectionType.useLHSPrimaryKey() ) { - return ownerIdentifier; - } - return role.getOwnerEntityPersister() - .getPropertyValue( owner, collectionType.getLHSPropertyName() ); + return collectionType.useLHSPrimaryKey() + ? ownerIdentifier : + role.getOwnerEntityPersister() + .getPropertyValue( owner, collectionType.getLHSPropertyName() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java b/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java index 26df88192ee4..90c6ec8f37d0 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/WrapVisitor.java @@ -11,8 +11,6 @@ import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.spi.CollectionKey; import org.hibernate.event.spi.EventSource; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.type.CollectionType; import org.hibernate.type.CompositeType; @@ -20,6 +18,7 @@ import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable; import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; import static org.hibernate.persister.entity.AbstractEntityPersister.getCollectionKey; /** @@ -29,8 +28,6 @@ */ public class WrapVisitor extends ProxyVisitor { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( WrapVisitor.class ); - protected Object entity; protected Object id; @@ -117,8 +114,8 @@ else if ( attributeInterceptor instanceof LazyAttributeLoadingInterceptor lazyLo final var persistentCollection = collectionType.wrap( session, collection ); persistenceContext.addNewCollection( persister, persistentCollection ); - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Wrapped collection in role: " + collectionType.getRole() ); + if ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) { + EVENT_LISTENER_LOGGER.wrappedCollectionInRole( collectionType.getRole() ); } return persistentCollection; //Force a substitution! } diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java index f901aea300de..81e9fa72a644 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerGroupImpl.java @@ -26,13 +26,12 @@ import org.hibernate.jpa.event.spi.CallbackRegistry; import org.hibernate.jpa.event.spi.CallbackRegistryConsumer; -import org.jboss.logging.Logger; - import static java.lang.System.arraycopy; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static java.util.concurrent.CompletableFuture.completedFuture; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; /** * Standard EventListenerGroup implementation @@ -42,8 +41,6 @@ */ class EventListenerGroupImpl implements EventListenerGroup { - private static final Logger LOG = Logger.getLogger( EventListenerGroupImpl.class ); - private static final DuplicationStrategy DEFAULT_DUPLICATION_STRATEGY = new DuplicationStrategy() { @Override @@ -296,7 +293,7 @@ private void handleListenerAddition(T listener, Consumer additionHandler) { final T[] listenersWrite = createListenerArrayForWrite( size ); arraycopy( listenersRead, 0, listenersWrite, 0, size ); - final boolean traceEnabled = LOG.isTraceEnabled(); + final boolean traceEnabled = EVENT_LISTENER_LOGGER.isTraceEnabled(); for ( DuplicationStrategy strategy : duplicationStrategies ) { @@ -308,13 +305,13 @@ private void handleListenerAddition(T listener, Consumer additionHandler) { for ( int i = 0; i < size; i++ ) { final T existingListener = listenersRead[i]; if ( traceEnabled ) { - LOG.tracef( "Checking incoming listener [`%s`] for match against existing listener [`%s`]", + EVENT_LISTENER_LOGGER.tracef( "Checking incoming listener [`%s`] for match against existing listener [`%s`]", listener, existingListener ); } if ( strategy.areMatch( listener, existingListener ) ) { if ( traceEnabled ) { - LOG.tracef( "Found listener match between `%s` and `%s`", + EVENT_LISTENER_LOGGER.tracef( "Found listener match between `%s` and `%s`", listener, existingListener ); } @@ -324,13 +321,13 @@ private void handleListenerAddition(T listener, Consumer additionHandler) { throw new EventListenerRegistrationException( "Duplicate event listener found" ); case KEEP_ORIGINAL: if ( traceEnabled ) { - LOG.tracef( "Skipping listener registration (%s) : `%s`", + EVENT_LISTENER_LOGGER.tracef( "Skipping listener registration (%s) : `%s`", action, listener ); } return; case REPLACE_ORIGINAL: if ( traceEnabled ) { - LOG.tracef( "Replacing listener registration (%s) : `%s` -> `%s`", + EVENT_LISTENER_LOGGER.tracef( "Replacing listener registration (%s) : `%s` -> `%s`", action, existingListener, listener ); } prepareListener( listener ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java index e478f5aa4155..e95e1dbf6665 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/PostCommitEventListenerGroupImpl.java @@ -8,10 +8,10 @@ import org.hibernate.event.spi.PostCommitDeleteEventListener; import org.hibernate.event.spi.PostCommitInsertEventListener; import org.hibernate.event.spi.PostCommitUpdateEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.jpa.event.spi.CallbackRegistry; +import static org.hibernate.event.internal.EventListenerLogging.EVENT_LISTENER_LOGGER; + /** * Historically, the listeners for the post-commit events simply reused the * contracts from the non-post-commit variants. That has changed as part of @@ -22,7 +22,6 @@ * @author Steve Ebersole */ class PostCommitEventListenerGroupImpl extends EventListenerGroupImpl { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PostCommitEventListenerGroupImpl.class ); private final Class extendedListenerContract; @@ -54,7 +53,7 @@ public void appendListener(T listener) { private void checkAgainstExtendedContract(T listener) { if ( !extendedListenerContract.isInstance( listener ) ) { - LOG.warnf( + EVENT_LISTENER_LOGGER.warnf( "Encountered event listener [%s] for post-commit event [%s] " + "which did not implement the corresponding extended " + "listener contract [%s]", diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/MergeContext.java b/hibernate-core/src/main/java/org/hibernate/event/spi/MergeContext.java index 85b4bd0f00b2..4806036405ad 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/MergeContext.java +++ b/hibernate-core/src/main/java/org/hibernate/event/spi/MergeContext.java @@ -361,8 +361,11 @@ private String printEntity(Object entity) { if ( session.getPersistenceContextInternal().getEntry( entity ) != null ) { return MessageHelper.infoString( session.getEntityName( entity ), session.getIdentifier( entity ) ); } - // Entity was not found in current persistence context. Use Object#toString() method. - return "[" + entity + "]"; + else { + // Entity was not found in the current persistence context. + // Use Object#toString() method. + return "[" + entity + "]"; + } } public EventSource getEventSource() { diff --git a/hibernate-core/src/main/java/org/hibernate/id/GUIDGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/GUIDGenerator.java index b7b4aab2ea94..68ff6a79575a 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/GUIDGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/GUIDGenerator.java @@ -4,14 +4,12 @@ */ package org.hibernate.id; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; + +import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; /** * The legacy id generator named {@code guid}. @@ -25,38 +23,37 @@ @Deprecated(since = "6.0") public class GUIDGenerator implements IdentifierGenerator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( GUIDGenerator.class ); - private static boolean WARNED; public GUIDGenerator() { if ( !WARNED ) { WARNED = true; - LOG.deprecatedUuidGenerator( UUIDGenerator.class.getName(), UUIDGenerationStrategy.class.getName() ); + DEPRECATION_LOGGER.deprecatedUuidGenerator( + UUIDGenerator.class.getName(), + UUIDGenerationStrategy.class.getName() ); } } public Object generate(SharedSessionContractImplementor session, Object obj) throws HibernateException { final String sql = session.getJdbcServices().getJdbcEnvironment().getDialect().getSelectGUIDString(); try { - final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql ); + final var jdbcCoordinator = session.getJdbcCoordinator(); + final var st = jdbcCoordinator.getStatementPreparer().prepareStatement( sql ); try { - final ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st, sql ); + final var rs = jdbcCoordinator.getResultSetReturn().extract( st, sql ); try { if ( !rs.next() ) { throw new HibernateException( "The database returned no GUID identity value" ); } - final String result = rs.getString( 1 ); - LOG.guidGenerated( result ); - return result; + return rs.getString( 1 ); } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( rs, st ); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( rs, st ); } } finally { - session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st ); - session.getJdbcCoordinator().afterStatementExecution(); + jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( st ); + jdbcCoordinator.afterStatementExecution(); } } catch (SQLException sqle) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceMismatchStrategy.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceMismatchStrategy.java index faab3a88938a..8d664c4a50d2 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceMismatchStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceMismatchStrategy.java @@ -8,6 +8,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.cfg.MappingSettings.SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY; + /** * Describes the strategy for handling the mismatch between a database sequence configuration and * the one defined by the entity mapping. @@ -47,29 +49,27 @@ public enum SequenceMismatchStrategy { *

* Valid values are either a {@link SequenceMismatchStrategy} object or its String representation. *

- * For string values, the matching is case insensitive, so you can use either {@code FIX} or {@code fix}. + * For string values, the matching is case-insensitive, so you can use either {@code FIX} or {@code fix}. * - * @param sequenceMismatchStrategy configured {@link SequenceMismatchStrategy} representation + * @param setting configured {@link SequenceMismatchStrategy} representation * * @return associated {@link SequenceMismatchStrategy} object */ - public static SequenceMismatchStrategy interpret(@Nullable Object sequenceMismatchStrategy) { - if ( sequenceMismatchStrategy == null ) { + public static SequenceMismatchStrategy interpret(@Nullable Object setting) { + if ( setting == null ) { return EXCEPTION; } - else if ( sequenceMismatchStrategy instanceof SequenceMismatchStrategy mismatchStrategy ) { + else if ( setting instanceof SequenceMismatchStrategy mismatchStrategy ) { return mismatchStrategy; } - else if ( sequenceMismatchStrategy instanceof String sequenceMismatchStrategyString ) { - for ( SequenceMismatchStrategy value : values() ) { - if ( value.name().equalsIgnoreCase( sequenceMismatchStrategyString ) ) { + else if ( setting instanceof String mismatchStrategyName ) { + for ( var value : values() ) { + if ( value.name().equalsIgnoreCase( mismatchStrategyName ) ) { return value; } } } - throw new HibernateException( - "Unrecognized sequence.increment_size_mismatch_strategy value : [" + sequenceMismatchStrategy - + "]. Supported values include [log], [exception], and [fix]." - ); + throw new HibernateException( "Setting '" + SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY + + "' should be one of [LOG, EXCEPTION, FIX, NONE] but was [" + setting + "]" ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java index d76ea5de653e..9b64c7735ae0 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java @@ -14,11 +14,11 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.uuid.StandardRandomStrategy; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.UUIDJavaType; +import static org.hibernate.id.UUIDLogger.UUID_MESSAGE_LOGGER; + /** * An {@link IdentifierGenerator} which generates {@link UUID} values using a pluggable * {@linkplain UUIDGenerationStrategy generation strategy}. The values this generator @@ -40,8 +40,6 @@ @Deprecated(since = "6.0") public class UUIDGenerator implements IdentifierGenerator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( UUIDGenerator.class ); - public static final String UUID_GEN_STRATEGY = "uuid_gen_strategy"; public static final String UUID_GEN_STRATEGY_CLASS = "uuid_gen_strategy_class"; @@ -52,50 +50,53 @@ public class UUIDGenerator implements IdentifierGenerator { public void configure(GeneratorCreationContext creationContext, Properties parameters) throws MappingException { // check first for an explicit strategy instance strategy = (UUIDGenerationStrategy) parameters.get( UUID_GEN_STRATEGY ); - if ( strategy == null ) { // next check for an explicit strategy class - final String strategyClassName = parameters.getProperty( UUID_GEN_STRATEGY_CLASS ); - if ( strategyClassName != null ) { - try { - final Class strategyClass = - creationContext.getServiceRegistry().requireService( ClassLoaderService.class ) - .classForName( strategyClassName ); - try { - strategy = (UUIDGenerationStrategy) strategyClass.newInstance(); - } - catch ( Exception e ) { - LOG.unableToInstantiateUuidGenerationStrategy(e); - } - } - catch ( ClassLoadingException ignore ) { - LOG.unableToLocateUuidGenerationStrategy( strategyClassName ); - } - } - } - - if ( strategy == null ) { - // lastly use the standard random generator - strategy = StandardRandomStrategy.INSTANCE; + strategy = strategy( creationContext, parameters ); } + valueTransformer = valueTransformer( creationContext ); + } + private UUIDJavaType.ValueTransformer valueTransformer(GeneratorCreationContext creationContext) { final Type type = creationContext.getType(); if ( UUID.class.isAssignableFrom( type.getReturnedClass() ) ) { - valueTransformer = UUIDJavaType.PassThroughTransformer.INSTANCE; + return UUIDJavaType.PassThroughTransformer.INSTANCE; } else if ( String.class.isAssignableFrom( type.getReturnedClass() ) ) { // todo (6.0) : allow for org.hibernate.type.descriptor.java.UUIDJavaType.NoDashesStringTransformer - valueTransformer = UUIDJavaType.ToStringTransformer.INSTANCE; + return UUIDJavaType.ToStringTransformer.INSTANCE; } else if ( byte[].class.isAssignableFrom( type.getReturnedClass() ) ) { - valueTransformer = UUIDJavaType.ToBytesTransformer.INSTANCE; + return UUIDJavaType.ToBytesTransformer.INSTANCE; } else { throw new HibernateException( "Unanticipated return type [" + type.getReturnedClassName() + "] for UUID conversion" ); } } - public Object generate(SharedSessionContractImplementor session, Object object) throws HibernateException { + private UUIDGenerationStrategy strategy(GeneratorCreationContext creationContext, Properties parameters) { + final String strategyClassName = parameters.getProperty( UUID_GEN_STRATEGY_CLASS ); + if ( strategyClassName != null ) { + final var classLoaderService = + creationContext.getServiceRegistry() + .requireService( ClassLoaderService.class ); + try { + final var strategyClass = classLoaderService.classForName( strategyClassName ); + try { + return (UUIDGenerationStrategy) strategyClass.newInstance(); + } + catch ( Exception exception ) { + UUID_MESSAGE_LOGGER.unableToInstantiateUuidGenerationStrategy( exception ); + } + } + catch ( ClassLoadingException ignore ) { + UUID_MESSAGE_LOGGER.unableToLocateUuidGenerationStrategy( strategyClassName ); + } + } + return StandardRandomStrategy.INSTANCE; + } + + public Object generate(SharedSessionContractImplementor session, Object object) { return valueTransformer.transform( strategy.generateUUID( session ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java index e078390d0295..fac6747d68c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java @@ -9,9 +9,8 @@ import org.hibernate.MappingException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.GeneratorCreationContext; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; +import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; import static org.hibernate.internal.util.config.ConfigurationHelper.getString; /** @@ -31,8 +30,6 @@ @Deprecated(since = "6") public class UUIDHexGenerator extends AbstractUUIDGenerator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( UUIDHexGenerator.class ); - /** * The configuration parameter specifying the separator to use. */ @@ -45,7 +42,9 @@ public class UUIDHexGenerator extends AbstractUUIDGenerator { public UUIDHexGenerator() { if ( !WARNED ) { WARNED = true; - LOG.usingUuidHexGenerator( this.getClass().getName(), UUIDGenerator.class.getName() ); + DEPRECATION_LOGGER.deprecatedUuidHexGenerator( + UUIDHexGenerator.class.getName(), + UUIDGenerator.class.getName() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/UUIDLogger.java b/hibernate-core/src/main/java/org/hibernate/id/UUIDLogger.java new file mode 100644 index 000000000000..43834809bdcd --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/id/UUIDLogger.java @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.id; + +import org.hibernate.Internal; +import org.hibernate.internal.log.SubSystemLogging; + +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.Cause; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; + +import static org.jboss.logging.Logger.Level.WARN; + +/** + * Logging related to UUID/GUID identifier generators + */ +@SubSystemLogging( + name = UUIDLogger.NAME, + description = "Logging related to UUID/GUID identifier generation" +) +@MessageLogger(projectCode = "HHH") +@ValidIdRange(min = 90301, max = 90400) +@Internal +public interface UUIDLogger extends BasicLogger { + String NAME = SubSystemLogging.BASE + ".id.uuid"; + + UUIDLogger UUID_MESSAGE_LOGGER = Logger.getMessageLogger( + MethodHandles.lookup(), + UUIDLogger.class, + NAME + ); + + @LogMessage(level = WARN) + @Message(value = "Unable to instantiate UUID generation strategy class", id = 90301) + void unableToInstantiateUuidGenerationStrategy(@Cause Exception ignore); + + @LogMessage(level = WARN) + @Message(value = "Unable to locate requested UUID generation strategy class: %s", id = 90302) + void unableToLocateUuidGenerationStrategy(String strategyClassName); + + @LogMessage(level = WARN) + @Message(value = "GUID identifier generated: %s", id = 90305) + void guidGenerated(String result); +} diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java index dd4ffa203d4d..91675a39a0c8 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/HiLoOptimizer.java @@ -12,7 +12,8 @@ import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.QueryLiteral; -import org.jboss.logging.Logger; + +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import java.io.Serializable; import java.util.Map; @@ -59,7 +60,6 @@ * @author Steve Ebersole */ public class HiLoOptimizer extends AbstractOptimizer { - private static final Logger LOG = Logger.getLogger( HiLoOptimizer.class ); private static class GenerationState { private IntegralDataTypeHolder lastSourceValue; @@ -79,10 +79,7 @@ public HiLoOptimizer(Class returnClass, int incrementSize) { if ( incrementSize < 1 ) { throw new HibernateException( "increment size cannot be less than 1" ); } - if ( LOG.isTraceEnabled() ) { - LOG.tracev( "Creating hilo optimizer with [incrementSize={0}; returnClass={1}]", - incrementSize, returnClass.getName() ); - } + OPTIMIZER_MESSAGE_LOGGER.creatingHiLoOptimizer( incrementSize, returnClass.getName() ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java index cc5175a1f003..432a300d2a78 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/LegacyHiLoAlgorithmOptimizer.java @@ -12,7 +12,8 @@ import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.QueryLiteral; -import org.jboss.logging.Logger; + +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import java.io.Serializable; import java.util.Map; @@ -27,7 +28,6 @@ * @author Steve Ebersole */ public class LegacyHiLoAlgorithmOptimizer extends AbstractOptimizer { - private static final Logger LOG = Logger.getLogger( LegacyHiLoAlgorithmOptimizer.class ); private final long initialMaxLo; @@ -51,10 +51,7 @@ public LegacyHiLoAlgorithmOptimizer(Class returnClass, int incrementSize) { if ( incrementSize < 1 ) { throw new HibernateException( "increment size cannot be less than 1" ); } - if ( LOG.isTraceEnabled() ) { - LOG.tracev( "Creating hilo optimizer (legacy) with [incrementSize={0}; returnClass={1}]", - incrementSize, returnClass.getName() ); - } + OPTIMIZER_MESSAGE_LOGGER.creatingLegacyHiLoOptimizer( incrementSize, returnClass.getName() ); initialMaxLo = incrementSize; } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerFactory.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerFactory.java index d47230f230b0..3c55ec148adb 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerFactory.java @@ -4,12 +4,10 @@ */ package org.hibernate.id.enhanced; -import java.lang.reflect.Constructor; import java.util.Properties; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; +import static org.hibernate.cfg.MappingSettings.PREFERRED_POOLED_OPTIMIZER; +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import static org.hibernate.internal.util.StringHelper.isNotEmpty; @@ -21,29 +19,31 @@ */ public class OptimizerFactory { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( OptimizerFactory.class ); - private static final Class[] CTOR_SIG = new Class[] { Class.class, int.class }; private static Optimizer buildOptimizer(OptimizerDescriptor descriptor, Class returnClass, int incrementSize) { + final var optimizer = createOptimizer( descriptor, returnClass, incrementSize ); + return optimizer != null ? optimizer : buildFallbackOptimizer( returnClass, incrementSize ); + } + + private static Optimizer createOptimizer(OptimizerDescriptor descriptor, Class returnClass, int incrementSize) { final Class optimizerClass; try { optimizerClass = descriptor.getOptimizerClass(); } catch ( Throwable ignore ) { - LOG.unableToLocateCustomOptimizerClass( descriptor.getExternalName() ); + OPTIMIZER_MESSAGE_LOGGER.unableToLocateCustomOptimizerClass( descriptor.getExternalName() ); return buildFallbackOptimizer( returnClass, incrementSize ); } try { - final Constructor ctor = optimizerClass.getConstructor( CTOR_SIG ); + final var ctor = optimizerClass.getConstructor( CTOR_SIG ); return ctor.newInstance( returnClass, incrementSize ); } catch ( Throwable ignore ) { - LOG.unableToInstantiateOptimizer( descriptor.getExternalName() ); + OPTIMIZER_MESSAGE_LOGGER.unableToInstantiateOptimizer( descriptor.getExternalName() ); } - - return buildFallbackOptimizer( returnClass, incrementSize ); + return null; } private static Optimizer buildFallbackOptimizer(Class returnClass, int incrementSize) { @@ -61,7 +61,7 @@ private static Optimizer buildFallbackOptimizer(Class returnClass, int increm * @return The built optimizer */ public static Optimizer buildOptimizer(OptimizerDescriptor type, Class returnClass, int incrementSize, long explicitInitialValue) { - final Optimizer optimizer = buildOptimizer( type, returnClass, incrementSize ); + final var optimizer = buildOptimizer( type, returnClass, incrementSize ); if ( optimizer instanceof InitialValueAwareOptimizer initialValueAwareOptimizer ) { initialValueAwareOptimizer.injectInitialValue( explicitInitialValue ); } @@ -76,16 +76,13 @@ public static String determineImplicitOptimizerName(int incrementSize, Propertie return StandardOptimizerDescriptor.NONE.getExternalName(); } else { - // see if the user defined a preferred pooled optimizer... + // see if the user defined a preferred pooled optimizer final String preferredPooledOptimizerStrategy = - configSettings.getProperty( AvailableSettings.PREFERRED_POOLED_OPTIMIZER ); - if ( isNotEmpty( preferredPooledOptimizerStrategy ) ) { - return preferredPooledOptimizerStrategy; - } - else { - // otherwise fallback to the fallback strategy - return StandardOptimizerDescriptor.POOLED.getExternalName(); - } + configSettings.getProperty( PREFERRED_POOLED_OPTIMIZER ); + return isNotEmpty( preferredPooledOptimizerStrategy ) + ? preferredPooledOptimizerStrategy + // otherwise fall back to the fallback strategy + : StandardOptimizerDescriptor.POOLED.getExternalName(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerLogger.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerLogger.java new file mode 100644 index 000000000000..c5fdb650677d --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/OptimizerLogger.java @@ -0,0 +1,71 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.id.enhanced; + +import org.hibernate.Internal; +import org.hibernate.id.IntegralDataTypeHolder; +import org.hibernate.internal.log.SubSystemLogging; + +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import java.lang.invoke.MethodHandles; + +import static org.jboss.logging.Logger.Level.DEBUG; +import static org.jboss.logging.Logger.Level.INFO; +import static org.jboss.logging.Logger.Level.TRACE; +import static org.jboss.logging.Logger.Level.WARN; + +/** + * Logging related to Optimizer operations in identifier generation + */ +@SubSystemLogging( + name = OptimizerLogger.NAME, + description = "Logging related to identifier generator optimizers" +) +@MessageLogger(projectCode = "HHH") +@ValidIdRange(min = 90401, max = 90500) +@Internal +public interface OptimizerLogger extends BasicLogger { + String NAME = SubSystemLogging.BASE + ".id.optimizer"; + + OptimizerLogger OPTIMIZER_MESSAGE_LOGGER = Logger.getMessageLogger( + MethodHandles.lookup(), + OptimizerLogger.class, + NAME + ); + + @LogMessage(level = TRACE) + @Message(value = "Creating hilo optimizer with [incrementSize=%s, returnClass=%s]", id = 90401) + void creatingHiLoOptimizer(int incrementSize, String returnClassName); + + @LogMessage(level = TRACE) + @Message(value = "Creating hilo optimizer (legacy) with [incrementSize=%s, returnClass=%s]", id = 90402) + void creatingLegacyHiLoOptimizer(int incrementSize, String returnClassName); + + @LogMessage(level = TRACE) + @Message(value = "Creating pooled optimizer with [incrementSize=%s, returnClass=%s]", id = 90403) + void creatingPooledOptimizer(int incrementSize, String returnClassName); + + @LogMessage(level = DEBUG) + @Message(value = "Creating pooled optimizer (lo) with [incrementSize=%s, returnClass=%s]", id = 90404) + void creatingPooledLoOptimizer(int incrementSize, String returnClassName); + + @LogMessage(level = INFO) + @Message(value = "Pooled optimizer source reported [%s] as the initial value; use of 1 or greater highly recommended", id = 90405) + void pooledOptimizerReportedInitialValue(IntegralDataTypeHolder value); + + @LogMessage(level = WARN) + @Message(value = "Unable to interpret specified optimizer [%s], falling back to noop optimizer", id = 90406) + void unableToLocateCustomOptimizerClass(String type); + + @LogMessage(level = WARN) + @Message(value = "Unable to instantiate specified optimizer [%s], falling back to noop optimizer", id = 90407) + void unableToInstantiateOptimizer(String type); +} diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java index a8a71bb5c718..5e92bc98e571 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoOptimizer.java @@ -7,8 +7,7 @@ import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.id.IntegralDataTypeHolder; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import org.hibernate.sql.ast.tree.expression.Expression; import java.io.Serializable; @@ -27,8 +26,6 @@ */ public class PooledLoOptimizer extends AbstractOptimizer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PooledLoOptimizer.class ); - private static class GenerationState { // last value read from db source private IntegralDataTypeHolder lastSourceValue; @@ -49,15 +46,14 @@ public PooledLoOptimizer(Class returnClass, int incrementSize) { if ( incrementSize < 1 ) { throw new HibernateException( "increment size cannot be less than 1" ); } - LOG.creatingPooledLoOptimizer( incrementSize, returnClass.getName() ); + OPTIMIZER_MESSAGE_LOGGER.creatingPooledLoOptimizer( incrementSize, returnClass.getName() ); } @Override public Serializable generate(AccessCallback callback) { lock.lock(); try { - final GenerationState generationState = locateGenerationState( callback.getTenantIdentifier() ); - + final var generationState = locateGenerationState( callback.getTenantIdentifier() ); if ( generationState.lastSourceValue == null || ! generationState.value.lt( generationState.upperLimitValue ) ) { generationState.lastSourceValue = callback.getNextValue(); @@ -90,23 +86,29 @@ private GenerationState locateGenerationState(String tenantIdentifier) { return noTenantState; } else { - GenerationState state; - if ( tenantSpecificState == null ) { - tenantSpecificState = new ConcurrentHashMap<>(); - state = new GenerationState(); - tenantSpecificState.put( tenantIdentifier, state ); - } - else { - state = tenantSpecificState.get( tenantIdentifier ); - if ( state == null ) { - state = new GenerationState(); - tenantSpecificState.put( tenantIdentifier, state ); - } - } - return state; + return generationState( tenantIdentifier ); + } + } + + private GenerationState generationState(String tenantIdentifier) { + if ( tenantSpecificState == null ) { + tenantSpecificState = new ConcurrentHashMap<>(); + return assignNewStateToTenant( tenantIdentifier ); + } + else { + final var state = tenantSpecificState.get( tenantIdentifier ); + return state == null + ? assignNewStateToTenant( tenantIdentifier ) + : state; } } + private GenerationState assignNewStateToTenant(String tenantIdentifier) { + final var newState = new GenerationState(); + tenantSpecificState.put( tenantIdentifier, newState ); + return newState; + } + private GenerationState noTenantGenerationState() { if ( noTenantState == null ) { throw new IllegalStateException( "Could not locate previous generation state for no-tenant" ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java index a3572b16658d..cf3e8a26ea3d 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java @@ -7,8 +7,7 @@ import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.id.IntegralDataTypeHolder; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import org.hibernate.sql.ast.tree.expression.Expression; import java.io.Serializable; @@ -27,8 +26,6 @@ */ public class PooledLoThreadLocalOptimizer extends AbstractOptimizer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PooledLoOptimizer.class ); - private final ThreadLocal singleTenantState = ThreadLocal.withInitial( GenerationState::new ); private final ThreadLocal> multiTenantStates = ThreadLocal.withInitial( HashMap::new ); @@ -43,7 +40,7 @@ public PooledLoThreadLocalOptimizer(Class returnClass, int incrementSize) { if ( incrementSize < 1 ) { throw new HibernateException( "increment size cannot be less than 1" ); } - LOG.creatingPooledLoOptimizer( incrementSize, returnClass.getName() ); + OPTIMIZER_MESSAGE_LOGGER.creatingPooledLoOptimizer( incrementSize, returnClass.getName() ); } @Override @@ -57,8 +54,8 @@ private GenerationState locateGenerationState(String tenantIdentifier) { return singleTenantState.get(); } else { - Map states = multiTenantStates.get(); - GenerationState state = states.get( tenantIdentifier ); + var states = multiTenantStates.get(); + var state = states.get( tenantIdentifier ); if ( state == null ) { state = new GenerationState(); states.put( tenantIdentifier, state ); @@ -69,8 +66,7 @@ private GenerationState locateGenerationState(String tenantIdentifier) { // for Hibernate testsuite use only private GenerationState noTenantGenerationState() { - GenerationState noTenantState = locateGenerationState( null ); - + final var noTenantState = locateGenerationState( null ); if ( noTenantState == null ) { throw new IllegalStateException( "Could not locate previous generation state for no-tenant" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java index 4b278bcac48c..cef1de1820f3 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledOptimizer.java @@ -7,9 +7,7 @@ import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.id.IntegralDataTypeHolder; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.metamodel.mapping.BasicValuedMapping; +import static org.hibernate.id.enhanced.OptimizerLogger.OPTIMIZER_MESSAGE_LOGGER; import org.hibernate.query.sqm.BinaryArithmeticOperator; import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; import org.hibernate.sql.ast.tree.expression.Expression; @@ -37,8 +35,6 @@ */ public class PooledOptimizer extends AbstractOptimizer implements InitialValueAwareOptimizer { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PooledOptimizer.class ); - private static class GenerationState { private IntegralDataTypeHolder hiValue; private IntegralDataTypeHolder value; @@ -57,10 +53,7 @@ public PooledOptimizer(Class returnClass, int incrementSize) { if ( incrementSize < 1 ) { throw new HibernateException( "increment size cannot be less than 1" ); } - if ( LOG.isTraceEnabled() ) { - LOG.tracev( "Creating pooled optimizer with [incrementSize={0}; returnClass={1}]", - incrementSize, returnClass.getName() ); - } + OPTIMIZER_MESSAGE_LOGGER.creatingPooledOptimizer( incrementSize, returnClass.getName() ); } @@ -77,7 +70,7 @@ public Serializable generate(AccessCallback callback) { // because we would not be able to control this if // we are using a sequence... if ( generationState.hiValue.lt( 1 ) ) { - LOG.pooledOptimizerReportedInitialValue( generationState.hiValue ); + OPTIMIZER_MESSAGE_LOGGER.pooledOptimizerReportedInitialValue( generationState.hiValue ); } // the call to obtain next-value just gave us the initialValue if ( ( initialValue == -1 @@ -116,23 +109,29 @@ private GenerationState locateGenerationState(String tenantIdentifier) { return noTenantState; } else { - GenerationState state; - if ( tenantSpecificState == null ) { - tenantSpecificState = new ConcurrentHashMap<>(); - state = new GenerationState(); - tenantSpecificState.put( tenantIdentifier, state ); - } - else { - state = tenantSpecificState.get( tenantIdentifier ); - if ( state == null ) { - state = new GenerationState(); - tenantSpecificState.put( tenantIdentifier, state ); - } - } - return state; + return generationState( tenantIdentifier ); + } + } + + private GenerationState generationState(String tenantIdentifier) { + if ( tenantSpecificState == null ) { + tenantSpecificState = new ConcurrentHashMap<>(); + return assignNewStateToTenant( tenantIdentifier ); + } + else { + final var state = tenantSpecificState.get( tenantIdentifier ); + return state == null + ? assignNewStateToTenant( tenantIdentifier ) + : state; } } + private GenerationState assignNewStateToTenant(String tenantIdentifier) { + final var newState = new GenerationState(); + tenantSpecificState.put( tenantIdentifier, newState ); + return newState; + } + private GenerationState noTenantGenerationState() { if ( noTenantState == null ) { throw new IllegalStateException( "Could not locate previous generation state for no-tenant" ); @@ -168,7 +167,7 @@ public void injectInitialValue(long initialValue) { @Override public Expression createLowValueExpression(Expression databaseValue, SessionFactoryImplementor sessionFactory) { - BasicValuedMapping integerType = sessionFactory.getTypeConfiguration().getBasicTypeForJavaType( Integer.class ); + final var integerType = sessionFactory.getTypeConfiguration().getBasicTypeForJavaType( Integer.class ); return new BinaryArithmeticExpression( databaseValue, BinaryArithmeticOperator.SUBTRACT, diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceGeneratorLogger.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceGeneratorLogger.java index 1561bb54962f..013054508e34 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceGeneratorLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceGeneratorLogger.java @@ -16,6 +16,7 @@ import java.lang.invoke.MethodHandles; import static org.jboss.logging.Logger.Level.INFO; +import static org.jboss.logging.Logger.Level.TRACE; import static org.jboss.logging.Logger.Level.WARN; /** @@ -33,7 +34,6 @@ public interface SequenceGeneratorLogger extends BasicLogger { String NAME = SubSystemLogging.BASE + ".id.table"; - Logger SEQUENCE_GENERATOR_LOGGER = Logger.getLogger(NAME); SequenceGeneratorLogger SEQUENCE_GENERATOR_MESSAGE_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), SequenceGeneratorLogger.class, @@ -46,14 +46,19 @@ public interface SequenceGeneratorLogger extends BasicLogger { void forcingTableUse(); @LogMessage(level = WARN) - @Message(value = "The increment size of the sequence '%s' is set to [%d] in the entity mapping while the associated database sequence increment size is [%d]" - + " - the database sequence increment size will take precedence to avoid identifier allocation conflicts.", + @Message(value = "The increment size of the sequence '%s' is set to [%d] in the entity mapping but the mapped database sequence increment size is [%d]", id = 90202) void sequenceIncrementSizeMismatch(String sequenceName, int incrementSize, int databaseIncrementSize); + @LogMessage(level = TRACE) + @Message(value = "The increment size of the sequence '%s' is set to [%d] in the entity mapping but the mapped database sequence increment size is [%d]" + + " - the database sequence increment size will take precedence to avoid identifier allocation conflicts.", + id = 90203) + void sequenceIncrementSizeMismatchFixed(String sequenceName, int incrementSize, int databaseIncrementSize); + @LogMessage(level = WARN) @Message(value = "Sequence-style generator configuration specified explicit optimizer [%s], but [%s=%s]; using optimizer [%s] increment default of [%s]", - id = 90203) + id = 90205) void honoringOptimizerSetting( String none, String incrementParam, diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index 037a8e504281..700d9be51400 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -4,9 +4,7 @@ */ package org.hibernate.id.enhanced; -import java.util.Iterator; import java.util.Properties; -import java.util.Set; import java.util.function.BiConsumer; import org.hibernate.HibernateException; @@ -15,10 +13,7 @@ import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; -import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; @@ -39,6 +34,7 @@ import jakarta.persistence.SequenceGenerator; import static java.util.Collections.singleton; +import static org.hibernate.cfg.MappingSettings.SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY; import static org.hibernate.id.IdentifierGeneratorHelper.getNamingStrategy; import static org.hibernate.id.enhanced.OptimizerFactory.determineImplicitOptimizerName; import static org.hibernate.id.enhanced.SequenceGeneratorLogger.SEQUENCE_GENERATOR_MESSAGE_LOGGER; @@ -155,7 +151,6 @@ public class SequenceStyleGenerator private DatabaseStructure databaseStructure; private Optimizer optimizer; private Type identifierType; - private String options; /** * Getter for property 'databaseStructure'. @@ -190,16 +185,16 @@ public Type getIdentifierType() { @Override public void configure(GeneratorCreationContext creationContext, Properties parameters) throws MappingException { - final ServiceRegistry serviceRegistry = creationContext.getServiceRegistry(); - final JdbcEnvironment jdbcEnvironment = serviceRegistry.requireService( JdbcEnvironment.class ); - final Dialect dialect = jdbcEnvironment.getDialect(); + final var serviceRegistry = creationContext.getServiceRegistry(); + final var jdbcEnvironment = serviceRegistry.requireService( JdbcEnvironment.class ); + final var dialect = jdbcEnvironment.getDialect(); - this.identifierType = creationContext.getType(); + identifierType = creationContext.getType(); - final QualifiedName sequenceName = determineSequenceName( parameters, jdbcEnvironment, serviceRegistry ); + final var sequenceName = determineSequenceName( parameters, jdbcEnvironment, serviceRegistry ); final int initialValue = determineInitialValue( parameters ); int incrementSize = determineIncrementSize( parameters ); - final OptimizerDescriptor optimizationStrategy = determineOptimizationStrategy( parameters, incrementSize ); + final var optimizationStrategy = determineOptimizationStrategy( parameters, incrementSize ); boolean forceTableUse = getBoolean( FORCE_TBL_PARAM, parameters ); final boolean physicalSequence = isPhysicalSequence( jdbcEnvironment, forceTableUse ); @@ -238,8 +233,6 @@ public void configure(GeneratorCreationContext creationContext, Properties param getInt( INITIAL_PARAM, parameters, -1 ) ); databaseStructure.configure( optimizer ); - - options = parameters.getProperty( OPTIONS ); } private int adjustIncrementSize( @@ -251,9 +244,9 @@ private int adjustIncrementSize( ServiceRegistry serviceRegistry, String contributor, GeneratorCreationContext creationContext) { - final ConfigurationService configurationService = serviceRegistry.requireService( ConfigurationService.class ); - final SequenceMismatchStrategy sequenceMismatchStrategy = configurationService.getSetting( - AvailableSettings.SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY, + final var configurationService = serviceRegistry.requireService( ConfigurationService.class ); + final var sequenceMismatchStrategy = configurationService.getSetting( + SEQUENCE_INCREMENT_SIZE_MISMATCH_STRATEGY, SequenceMismatchStrategy::interpret, SequenceMismatchStrategy.EXCEPTION ); @@ -261,46 +254,76 @@ private int adjustIncrementSize( if ( sequenceMismatchStrategy != SequenceMismatchStrategy.NONE && optimizationStrategy.isPooled() && physicalSequence ) { - final Database database = creationContext.getDatabase(); - final String databaseSequenceName = database != null ? - database.getPhysicalNamingStrategy().toPhysicalSequenceName( - sequenceName.getObjectName(), - jdbcEnvironment - ).getText() : - sequenceName.getObjectName().getText(); - final Number databaseIncrementValue = - isSchemaToBeRecreated( contributor, configurationService ) ? null - : getSequenceIncrementValue( jdbcEnvironment, databaseSequenceName ); - if ( databaseIncrementValue != null && databaseIncrementValue.intValue() != incrementSize) { - final int dbIncrementValue = databaseIncrementValue.intValue(); - switch ( sequenceMismatchStrategy ) { - case EXCEPTION: - throw new MappingException( - String.format( - "The increment size of the [%s] sequence is set to [%d] in the entity mapping " - + "while the associated database sequence increment size is [%d].", - databaseSequenceName, incrementSize, dbIncrementValue - ) - ); - case FIX: - incrementSize = dbIncrementValue; - case LOG: - //TODO: the log message is correct for the case of FIX, but wrong for LOG - SEQUENCE_GENERATOR_MESSAGE_LOGGER.sequenceIncrementSizeMismatch( databaseSequenceName, incrementSize, dbIncrementValue ); - break; - } - } + incrementSize = + validatedIncrementSize( + jdbcEnvironment, + sequenceName, + incrementSize, + contributor, + creationContext, + configurationService, + sequenceMismatchStrategy + ); } return determineAdjustedIncrementSize( optimizationStrategy, incrementSize ); } + private int validatedIncrementSize( + JdbcEnvironment jdbcEnvironment, + QualifiedName sequenceName, + int incrementSize, + String contributor, + GeneratorCreationContext creationContext, + ConfigurationService configurationService, + SequenceMismatchStrategy sequenceMismatchStrategy) { + final var database = creationContext.getDatabase(); + final Identifier databaseSequenceIdentifier = + database != null + ? database.getPhysicalNamingStrategy() + .toPhysicalSequenceName( sequenceName.getObjectName(), jdbcEnvironment ) + : sequenceName.getObjectName(); + final String databaseSequenceName = databaseSequenceIdentifier.getText(); + final Number databaseIncrementValue = + isSchemaToBeRecreated( contributor, configurationService ) ? null + : getSequenceIncrementValue( jdbcEnvironment, databaseSequenceName ); + if ( databaseIncrementValue != null && databaseIncrementValue.intValue() != incrementSize ) { + final int dbIncrementValue = databaseIncrementValue.intValue(); + return switch ( sequenceMismatchStrategy ) { + case NONE -> incrementSize; + case FIX -> { + // log at TRACE level + SEQUENCE_GENERATOR_MESSAGE_LOGGER.sequenceIncrementSizeMismatchFixed( + databaseSequenceName, incrementSize, dbIncrementValue ); + yield dbIncrementValue; + } + case LOG -> { + // log at WARN level + SEQUENCE_GENERATOR_MESSAGE_LOGGER.sequenceIncrementSizeMismatch( + databaseSequenceName, incrementSize, dbIncrementValue ); + yield incrementSize; + } + case EXCEPTION -> throw new MappingException( + String.format( + "The increment size of the [%s] sequence is set to [%d] in the entity mapping " + + "but the mapped database sequence increment size is [%d]", + databaseSequenceName, incrementSize, dbIncrementValue + ) + ); + }; + } + else { + return incrementSize; + } + } + private boolean isSchemaToBeRecreated(String contributor, ConfigurationService configurationService) { - final Set actions = - ActionGrouping.interpret( singleton( contributor ), configurationService.getSettings() ); + final var actions = + ActionGrouping.interpret( singleton( contributor ), + configurationService.getSettings() ); // We know this will only contain at most 1 action - final Iterator it = actions.iterator(); - final Action dbAction = it.hasNext() ? it.next().getDatabaseAction() : null; - return dbAction == Action.CREATE || dbAction == Action.CREATE_DROP; + final var iterator = actions.iterator(); + final var action = iterator.hasNext() ? iterator.next().getDatabaseAction() : null; + return action == Action.CREATE || action == Action.CREATE_DROP; } @Override @@ -328,7 +351,7 @@ protected QualifiedName determineSequenceName( Properties params, JdbcEnvironment jdbcEnv, ServiceRegistry serviceRegistry) { - final IdentifierHelper identifierHelper = jdbcEnv.getIdentifierHelper(); + final var identifierHelper = jdbcEnv.getIdentifierHelper(); final Identifier catalog = identifierHelper.toIdentifier( getString( CATALOG, params ) ); final Identifier schema = identifierHelper.toIdentifier( getString( SCHEMA, params ) ); final String sequenceName = getString( SEQUENCE_PARAM, params, () -> getString( ALT_SEQUENCE_PARAM, params ) ); @@ -557,7 +580,7 @@ public String determineBulkInsertionIdentifierGenerationSelectFragment(SqlString */ private Number getSequenceIncrementValue(JdbcEnvironment jdbcEnvironment, String sequenceName) { for ( var information : jdbcEnvironment.getExtractedDatabaseMetaData().getSequenceInformationList() ) { - final QualifiedSequenceName name = information.getSequenceName(); + final var name = information.getSequenceName(); if ( sequenceName.equalsIgnoreCase( name.getSequenceName().getText() ) && isDefaultSchema( jdbcEnvironment, name.getCatalogName(), name.getSchemaName() ) ) { final Number incrementValue = information.getIncrementValue(); diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index 155e52c067d7..84394424f2d3 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -23,9 +23,7 @@ import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; import org.hibernate.boot.model.relational.SqlStringGenerationContext; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.config.spi.ConfigurationService; -import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.Size; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; @@ -33,34 +31,21 @@ import org.hibernate.engine.jdbc.spi.SqlStatementLogger; import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.monitor.spi.DiagnosticEvent; -import org.hibernate.event.monitor.spi.EventMonitor; import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.id.IdentifierGeneratorHelper; import org.hibernate.id.IntegralDataTypeHolder; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.jdbc.AbstractReturningWork; -import org.hibernate.mapping.Column; import org.hibernate.mapping.PrimaryKey; import org.hibernate.mapping.Table; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.SimpleSelect; -import org.hibernate.stat.spi.StatisticsImplementor; -import org.hibernate.type.BasicType; -import org.hibernate.type.BasicTypeRegistry; import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.Type; -import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Properties; -import java.util.function.BiConsumer; import static org.hibernate.boot.model.internal.GeneratorBinder.applyIfNotEmpty; +import static org.hibernate.cfg.MappingSettings.TABLE_GENERATOR_STORE_LAST_USED; +import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN; import static org.hibernate.id.enhanced.TableGeneratorLogger.TABLE_GENERATOR_MESSAGE_LOGGER; import static org.hibernate.id.IdentifierGeneratorHelper.getNamingStrategy; import static org.hibernate.id.enhanced.OptimizerFactory.determineImplicitOptimizerName; @@ -202,7 +187,6 @@ public class TableGenerator implements PersistentIdentifierGenerator { private boolean storeLastUsedValue; - private Type identifierType; private QualifiedName qualifiedTableName; @@ -338,12 +322,13 @@ public String[] getAllSqlForTests() { @Override public void configure(GeneratorCreationContext creationContext, Properties parameters) throws MappingException { - final ServiceRegistry serviceRegistry = creationContext.getServiceRegistry(); - storeLastUsedValue = serviceRegistry.requireService( ConfigurationService.class ) - .getSetting( AvailableSettings.TABLE_GENERATOR_STORE_LAST_USED, StandardConverters.BOOLEAN, true ); + final var serviceRegistry = creationContext.getServiceRegistry(); + storeLastUsedValue = + serviceRegistry.requireService( ConfigurationService.class ) + .getSetting( TABLE_GENERATOR_STORE_LAST_USED, BOOLEAN, true ); identifierType = creationContext.getType(); - final JdbcEnvironment jdbcEnvironment = serviceRegistry.requireService( JdbcEnvironment.class ); + final var jdbcEnvironment = serviceRegistry.requireService( JdbcEnvironment.class ); qualifiedTableName = determineGeneratorTableName( parameters, jdbcEnvironment, serviceRegistry ); segmentColumnName = determineSegmentColumnName( parameters, jdbcEnvironment ); @@ -385,8 +370,11 @@ private static OptimizerDescriptor determineOptimizationStrategy(Properties para * @param jdbcEnvironment The JDBC environment * @return The table name to use. */ - protected QualifiedName determineGeneratorTableName(Properties params, JdbcEnvironment jdbcEnvironment, ServiceRegistry serviceRegistry) { - final IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); + protected QualifiedName determineGeneratorTableName( + Properties params, + JdbcEnvironment jdbcEnvironment, + ServiceRegistry serviceRegistry) { + final var identifierHelper = jdbcEnvironment.getIdentifierHelper(); final Identifier catalog = identifierHelper.toIdentifier( getString( CATALOG, params ) ); final Identifier schema = identifierHelper.toIdentifier( getString( SCHEMA, params ) ); final String tableName = getString( TABLE_PARAM, params ); @@ -466,7 +454,8 @@ protected String determineSegmentValue(Properties params) { protected String determineDefaultSegmentValue(Properties params) { final boolean preferSegmentPerEntity = getBoolean( CONFIG_PREFER_SEGMENT_PER_ENTITY, params ); final String defaultToUse = preferSegmentPerEntity ? params.getProperty( TABLE ) : DEF_SEGMENT_VALUE; - TABLE_GENERATOR_MESSAGE_LOGGER.usingDefaultIdGeneratorSegmentValue( qualifiedTableName.render(), segmentColumnName, defaultToUse ); + TABLE_GENERATOR_MESSAGE_LOGGER.usingDefaultIdGeneratorSegmentValue( + qualifiedTableName.render(), segmentColumnName, defaultToUse ); return defaultToUse; } @@ -492,13 +481,12 @@ protected int determineIncrementSize(Properties params) { } protected String buildSelectQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) { - final LockOptions lockOptions = new LockOptions( LockMode.PESSIMISTIC_WRITE ); - final SimpleSelect select = new SimpleSelect( context.getDialect() ) + return new SimpleSelect( context.getDialect() ) .addColumn( valueColumnName ) .setTableName( formattedPhysicalTableName ) .addRestriction( segmentColumnName ) - .setLockOptions( lockOptions ); - return select.toStatementString(); + .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) ) + .toStatementString(); } protected String buildUpdateQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) { @@ -513,11 +501,8 @@ protected String buildInsertQuery(String formattedPhysicalTableName, SqlStringGe } protected InitCommand generateInsertInitCommand(SqlStringGenerationContext context) { - String renderedTableName = context.format( physicalTableName ); - int value = initialValue; - if ( storeLastUsedValue ) { - value = initialValue - 1; - } + final String renderedTableName = context.format( physicalTableName ); + final int value = storeLastUsedValue ? initialValue - 1 : initialValue; return new InitCommand( "insert into " + renderedTableName + "(" + segmentColumnName + ", " + valueColumnName + ")" + " values ('" + segmentValue + "'," + ( value ) + ")" ); @@ -529,10 +514,10 @@ private IntegralDataTypeHolder makeValue() { @Override public Object generate(final SharedSessionContractImplementor session, final Object obj) { - final SqlStatementLogger statementLogger = + final var statementLogger = session.getFactory().getJdbcServices() .getSqlStatementLogger(); - final SessionEventListenerManager statsCollector = session.getEventListenerManager(); + final var statsCollector = session.getEventListenerManager(); return optimizer.generate( new AccessCallback() { @Override @@ -565,10 +550,10 @@ private IntegralDataTypeHolder nextValue( int rows; do { TABLE_GENERATOR_MESSAGE_LOGGER.retrievingCurrentValueForSegment( segmentValue ); - try ( PreparedStatement selectPS = prepareStatement( connection, selectQuery, logger, listener, session ) ) { - selectPS.setString( 1, segmentValue ); - final ResultSet selectRS = executeQuery( selectPS, listener, selectQuery, session ); - if ( !selectRS.next() ) { + try ( var prepareStatement = prepareStatement( connection, selectQuery, logger, listener, session ) ) { + prepareStatement.setString( 1, segmentValue ); + final var resultSet = executeQuery( prepareStatement, listener, selectQuery, session ); + if ( !resultSet.next() ) { final long initializationValue = storeLastUsedValue ? initialValue - 1 : initialValue; value.initialize( initializationValue ); @@ -581,15 +566,15 @@ private IntegralDataTypeHolder nextValue( } else { final int defaultValue = storeLastUsedValue ? 0 : 1; - value.initialize( selectRS, defaultValue ); - if ( selectRS.wasNull() ) { + value.initialize( resultSet, defaultValue ); + if ( resultSet.wasNull() ) { throw new HibernateException( String.format( "%s for %s '%s' is null", valueColumnName, segmentColumnName, segmentValue ) ); } } - selectRS.close(); + resultSet.close(); } catch (SQLException e) { TABLE_GENERATOR_MESSAGE_LOGGER.unableToReadOrInitializeHiValue( physicalTableName.render(), e ); @@ -604,7 +589,7 @@ private IntegralDataTypeHolder nextValue( updateValue.increment(); } TABLE_GENERATOR_MESSAGE_LOGGER.updatingCurrentValueForSegment( updateValue, segmentValue ); - try ( PreparedStatement statement = prepareStatement( connection, updateQuery, logger, listener, session ) ) { + try ( var statement = prepareStatement( connection, updateQuery, logger, listener, session ) ) { updateValue.bind( statement, 1 ); value.bind( statement, 2 ); statement.setString( 3, segmentValue ); @@ -628,21 +613,21 @@ private PreparedStatement prepareStatement( SessionEventListenerManager listener, SharedSessionContractImplementor session) throws SQLException { logger.logStatement( sql, FormatStyle.BASIC.getFormatter() ); - final EventMonitor eventMonitor = session.getEventMonitor(); - final DiagnosticEvent creationEvent = eventMonitor.beginJdbcPreparedStatementCreationEvent(); - final StatisticsImplementor stats = session.getFactory().getStatistics(); + final var eventMonitor = session.getEventMonitor(); + final var creationEvent = eventMonitor.beginJdbcPreparedStatementCreationEvent(); + final var statistics = session.getFactory().getStatistics(); try { listener.jdbcPrepareStatementStart(); - if ( stats != null && stats.isStatisticsEnabled() ) { - stats.prepareStatement(); + if ( statistics != null && statistics.isStatisticsEnabled() ) { + statistics.prepareStatement(); } return connection.prepareStatement( sql ); } finally { eventMonitor.completeJdbcPreparedStatementCreationEvent( creationEvent, sql ); listener.jdbcPrepareStatementEnd(); - if ( stats != null && stats.isStatisticsEnabled() ) { - stats.closeStatement(); + if ( statistics != null && statistics.isStatisticsEnabled() ) { + statistics.closeStatement(); } } } @@ -652,8 +637,8 @@ private int executeUpdate( SessionEventListenerManager listener, String sql, SharedSessionContractImplementor session) throws SQLException { - final EventMonitor eventMonitor = session.getEventMonitor(); - final DiagnosticEvent executionEvent = eventMonitor.beginJdbcPreparedStatementExecutionEvent(); + final var eventMonitor = session.getEventMonitor(); + final var executionEvent = eventMonitor.beginJdbcPreparedStatementExecutionEvent(); try { listener.jdbcExecuteStatementStart(); return ps.executeUpdate(); @@ -669,8 +654,8 @@ private ResultSet executeQuery( SessionEventListenerManager listener, String sql, SharedSessionContractImplementor session) throws SQLException { - final EventMonitor eventMonitor = session.getEventMonitor(); - final DiagnosticEvent executionEvent = eventMonitor.beginJdbcPreparedStatementExecutionEvent(); + final var eventMonitor = session.getEventMonitor(); + final var executionEvent = eventMonitor.beginJdbcPreparedStatementExecutionEvent(); try { listener.jdbcExecuteStatementStart(); return ps.executeQuery(); @@ -698,16 +683,13 @@ public void registerExportables(Database database) { table.setOptions( options ); } - final BasicTypeRegistry basicTypeRegistry = database.getTypeConfiguration().getBasicTypeRegistry(); + final var basicTypeRegistry = database.getTypeConfiguration().getBasicTypeRegistry(); // todo : not sure the best solution here. do we add the columns if missing? other? - final DdlTypeRegistry ddlTypeRegistry = database.getTypeConfiguration().getDdlTypeRegistry(); - final Column segmentColumn = ExportableColumnHelper.column( - database, - table, - segmentColumnName, - basicTypeRegistry.resolve( StandardBasicTypes.STRING ), - ddlTypeRegistry.getTypeName( Types.VARCHAR, Size.length( segmentValueLength ) ) - ); + final var ddlTypeRegistry = database.getTypeConfiguration().getDdlTypeRegistry(); + final var segmentColumn = + ExportableColumnHelper.column( database, table, segmentColumnName, + basicTypeRegistry.resolve( StandardBasicTypes.STRING ), + ddlTypeRegistry.getTypeName( Types.VARCHAR, Size.length( segmentValueLength ) ) ); segmentColumn.setNullable( false ); table.addColumn( segmentColumn ); @@ -715,14 +697,10 @@ public void registerExportables(Database database) { table.setPrimaryKey( new PrimaryKey( table ) ); table.getPrimaryKey().addColumn( segmentColumn ); - final BasicType type = basicTypeRegistry.resolve( StandardBasicTypes.LONG ); - final Column valueColumn = ExportableColumnHelper.column( - database, - table, - valueColumnName, - type, - ddlTypeRegistry.getTypeName( type.getJdbcType().getDdlTypeCode(), database.getDialect() ) - ); + final var type = basicTypeRegistry.resolve( StandardBasicTypes.LONG ); + final var valueColumn = + ExportableColumnHelper.column( database, table, valueColumnName, type, + ddlTypeRegistry.getTypeName( type.getJdbcType().getDdlTypeCode(), database.getDialect() ) ); table.addColumn( valueColumn ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGeneratorLogger.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGeneratorLogger.java index 3da68ce6550f..f6dd94ffdcda 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGeneratorLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGeneratorLogger.java @@ -38,7 +38,6 @@ public interface TableGeneratorLogger extends BasicLogger { String NAME = SubSystemLogging.BASE + ".id.table"; - Logger TABLE_GENERATOR_LOGGER = Logger.getLogger(NAME); TableGeneratorLogger TABLE_GENERATOR_MESSAGE_LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), TableGeneratorLogger.class, diff --git a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java index 24fced457a7f..46050a1144d5 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java @@ -16,7 +16,6 @@ import org.hibernate.HibernateException; import org.hibernate.Internal; import org.hibernate.cache.CacheException; -import org.hibernate.id.IntegralDataTypeHolder; import org.hibernate.type.SerializationException; import org.jboss.logging.BasicLogger; @@ -45,23 +44,10 @@ @Internal public interface CoreMessageLogger extends BasicLogger { - @LogMessage(level = WARN) - @Message(value = "Configuration settings with for connection provider '%s' are set, but the connection provider is not on the classpath; these properties will be ignored", - id = 22) - void providerClassNotFound(String c3p0ProviderClassName); - @LogMessage(level = WARN) @Message(value = "I/O reported cached file could not be found: [%s]: %s", id = 23) void cachedFileNotFound(String path, FileNotFoundException error); - @LogMessage(level = INFO) - @Message(value = "Second-level cache region factory [%s]", id = 25) - void regionFactory(String name); - - @LogMessage(level = DEBUG) - @Message(value = "Second-level cache disabled", id = 26) - void noRegionFactory(); - @LogMessage(level = WARN) @Message(value = "Composite id class does not override equals(): %s", id = 38) void compositeIdClassDoesNotOverrideEquals(String name); @@ -78,10 +64,6 @@ public interface CoreMessageLogger extends BasicLogger { @Message(value = "Defining %s=true ignored in HEM", id = 59) void definingFlushBeforeCompletionIgnoredInHem(String flushBeforeCompletion); - @LogMessage(level = WARN) - @Message(value = "DEPRECATED: use [%s] instead with custom [%s] implementation", id = 65) - void deprecatedUuidGenerator(String name, String name2); - @LogMessage(level = WARN) @Message(value = "Duplicate generator name %s", id = 69) void duplicateGeneratorName(String name); @@ -105,14 +87,6 @@ void expectedType(String name, + " to unsafe use of the session): %s", id = 99) void failed(Throwable throwable); - @LogMessage(level = WARN) - @Message(value = "GUID identifier generated: %s", id = 113) - void guidGenerated(String result); - - @LogMessage(level = DEBUG) - @Message(value = "Handling transient entity in delete processing", id = 114) - void handlingTransientEntity(); - @LogMessage(level = WARN) @Message(value = "HSQLDB supports only READ_UNCOMMITTED isolation", id = 118) void hsqldbSupportsOnlyReadCommittedIsolation(); @@ -129,10 +103,6 @@ void expectedType(String name, @Message(value = "IllegalArgumentException in class: %s, setter method of property: %s", id = 123) void illegalPropertySetterArgument(String name, String propertyName); - @LogMessage(level = INFO) - @Message(value = "Instantiating explicit connection provider: %s", id = 130) - void instantiatingExplicitConnectionProvider(String providerClassName); - @LogMessage(level = INFO) @Message(value = "java.sql.Types mapped the same code [%s] multiple times; was [%s]; now [%s]", id = 141) void JavaSqlTypesMappedSameCodeMultipleTimes(int code, String old, String name); @@ -151,11 +121,6 @@ void missingArguments( @Message(value = "Narrowing proxy to %s - this operation breaks ==", id = 179) void narrowingProxy(Class concreteProxyClass); - @LogMessage(level = WARN) - @Message(value = "No appropriate connection provider encountered, assuming application will be supplying connections", - id = 181) - void noAppropriateConnectionProvider(); - @LogMessage(level = INFO) @Message(value = "No default (no-argument) constructor for class [%s] (class must be instantiated by Interceptor)", id = 182) @@ -173,11 +138,6 @@ void missingArguments( @Message(value = "LinkageError while attempting to load package: %s", id = 195) void linkageError(String packageName, @Cause LinkageError e); - @LogMessage(level = INFO) - @Message(value = "Pooled optimizer source reported [%s] as the initial value; use of 1 or greater highly recommended", - id = 201) - void pooledOptimizerReportedInitialValue(IntegralDataTypeHolder value); - @LogMessage(level = INFO) @Message(value = "Processing PersistenceUnitInfo [name: %s]", id = 204) void processingPersistenceUnitInfoName(String persistenceUnitName); @@ -293,30 +253,10 @@ void missingArguments( @Message(value = "Could not find any META-INF/persistence.xml file in the classpath", id = 318) void unableToFindPersistenceXmlInClasspath(); - @LogMessage(level = WARN) - @Message(value = "Unable to interpret specified optimizer [%s], falling back to noop", id = 321) - void unableToLocateCustomOptimizerClass(String type); - - @LogMessage(level = WARN) - @Message(value = "Unable to instantiate specified optimizer [%s], falling back to noop", id = 322) - void unableToInstantiateOptimizer(String type); - - @LogMessage(level = WARN) - @Message(value = "Unable to instantiate UUID generation strategy class: %s", id = 325) - void unableToInstantiateUuidGenerationStrategy(Exception ignore); - - @LogMessage(level = INFO) - @Message(value = "Error performing load command", id = 327) - void unableToLoadCommand(@Cause HibernateException e); - @LogMessage(level = ERROR) @Message(value = "Problem loading properties from hibernate.properties", id = 329) void unableToLoadProperties(); - @LogMessage(level = WARN) - @Message(value = "Unable to locate requested UUID generation strategy class: %s", id = 334) - void unableToLocateUuidGenerationStrategy(String strategyClassName); - @LogMessage(level = WARN) @Message(value = "Unable to log SQLWarnings: %s", id = 335) void unableToLogSqlWarnings(SQLException sqle); @@ -329,14 +269,6 @@ void missingArguments( @Message(value = "Unable to mark for rollback on TransientObjectException: ", id = 338) void unableToMarkForRollbackOnTransientObjectException(@Cause Exception e); - @LogMessage(level = WARN) - @Message(value = "Could not obtain connection metadata: %s", id = 339) - void unableToObtainConnectionMetadata(SQLException error); - - @LogMessage(level = WARN) - @Message(value = "Could not obtain connection to query JDBC database metadata", id = 342) - void unableToObtainConnectionToQueryMetadata(@Cause Exception e); - @LogMessage(level = ERROR) @Message(value = "Could not release a cache lock: %s", id = 353) void unableToReleaseCacheLock(CacheException ce); @@ -370,11 +302,6 @@ void missingArguments( @Message(value = "Don't use old DTDs, read the Hibernate 3.x Migration Guide", id = 404) void usingOldDtd(); - @LogMessage(level = WARN) - @Message(value = "Using %s which does not generate IETF RFC 4122 compliant UUID values; consider using %s instead", - id = 409) - void usingUuidHexGenerator(String name, String name2); - @LogMessage(level = INFO) @Message(value = "Hibernate ORM core version %s", id = 412) void version(String versionString); @@ -419,25 +346,15 @@ void cannotResolveNonNullableTransientDependencies( ) void usingFollowOnLocking(); - @LogMessage(level = WARN) - @Message( - value = "Explicit use of UPGRADE_SKIPLOCKED in lock() calls is not recommended; use normal UPGRADE locking instead", - id = 447 - ) - void explicitSkipLockedLockCombo(); - @LogMessage(level = WARN) @Message( id = 449, - value = "@Convert annotation applied to Map attribute [%s] did not explicitly specify 'attributeName' " + - "using 'key'/'value' as required by spec; attempting to DoTheRightThing" + value = "@Convert annotation applied to Map attribute [%s] did not explicitly specify " + + "'attributeName=\"key\" or 'attributeName=\"value\"' as required by spec; " + + "attempting to infer whether converter applies to key or value" ) void nonCompliantMapConversion(String collectionRole); - @LogMessage(level = DEBUG) - @Message(value = "Creating pooled optimizer (lo) with [incrementSize=%s; returnClass=%s]", id = 467) - void creatingPooledLoOptimizer(int incrementSize, String name); - @LogMessage(level = INFO) @Message(value = "Omitting cached file [%s] as the mapping file is newer", id = 473) void cachedFileObsolete(File cachedFile); @@ -523,11 +440,6 @@ void cannotResolveNonNullableTransientDependencies( id = 516) void enhancementDiscoveryFailed(String className, @Cause Throwable cause); - @LogMessage(level = DEBUG) - @Message(value = "Flushing and evicting managed instance of type [%s] before removing detached instance with same id", - id = 530) - void flushAndEvictOnRemove(String entityName); - @LogMessage(level = ERROR) @Message(value = "Illegal argument on static metamodel field injection: %s#%s; expected type: %s; encountered type: %s", id = 15007) void illegalArgumentOnStaticMetamodelFieldInjection( diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java index e3a59f85389f..515ba5fb7c0f 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -972,7 +972,8 @@ public void initializeCollection(PersistentCollection collection, boolean wri final var loadedPersister = ce.getLoadedPersister(); final Object loadedKey = ce.getLoadedKey(); if ( SESSION_LOGGER.isTraceEnabled() ) { - SESSION_LOGGER.initializingCollection( collectionInfoString( loadedPersister, collection, loadedKey, this ) ); + SESSION_LOGGER.initializingCollection( + collectionInfoString( loadedPersister, collection, loadedKey, this ) ); } final boolean foundInCache = initializeCollectionFromCache( loadedKey, loadedPersister, collection, this ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/log/DeprecationLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/log/DeprecationLogger.java index 0f78e6051fe9..e097de473ad6 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/log/DeprecationLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/log/DeprecationLogger.java @@ -233,5 +233,19 @@ void recognizedObsoleteHibernateNamespace( id = 90000038, value = "Encountered deprecated value for JtaPlatform setting [%s]: [%s]; use a non-deprecated value among %s instead" ) - void logDeprecatedJtaPlatformSetting(String settingName, String deprecatedValue, List replacements); + void deprecatedJtaPlatformSetting(String settingName, String deprecatedValue, List replacements); + + @LogMessage(level = WARN) + @Message( + id = 90000039, + value = "Using %s which does not generate IETF RFC 4122 compliant UUID values; consider using %s instead" + ) + void deprecatedUuidHexGenerator(String name, String name2); + + @LogMessage(level = WARN) + @Message( + id = 90000040, + value = "DEPRECATED: use [%s] instead with custom [%s] implementation" + ) + void deprecatedUuidGenerator(String name, String name2); } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java index 2035e59be132..679a71a0c480 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java @@ -24,7 +24,6 @@ import org.hibernate.resource.transaction.spi.TransactionStatus; import static java.util.Collections.emptyList; -import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_LOGGER; import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER; /** @@ -300,7 +299,7 @@ public TransactionStatus getStatus() { @Override public void markRollbackOnly() { if ( getStatus() != TransactionStatus.ROLLED_BACK ) { - if ( JDBC_LOGGER.isTraceEnabled() ) { + if ( JDBC_MESSAGE_LOGGER.isTraceEnabled() ) { JDBC_MESSAGE_LOGGER.jdbcTransactionMarkedForRollbackOnly( new Exception( "exception just for purpose of providing stack trace" ) ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/batch/BatchReleaseStatementDebugMessageTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/batch/BatchReleaseStatementDebugMessageTest.java index e86a78e46261..3e807d36f2c4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/batch/BatchReleaseStatementDebugMessageTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/batch/BatchReleaseStatementDebugMessageTest.java @@ -39,7 +39,7 @@ public class BatchReleaseStatementDebugMessageTest { @BeforeAll public void setUp(SessionFactoryScope scope) { trigger = new TriggerOnDebugMessageListener(); - LogInspectionHelper.registerListener( trigger, JdbcBatchLogging.BATCH_LOGGER ); + LogInspectionHelper.registerListener( trigger, JdbcBatchLogging.BATCH_MESSAGE_LOGGER ); } @Test diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/PostgreSQLSequenceGeneratorWithSerialTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/PostgreSQLSequenceGeneratorWithSerialTest.java index 14e81b117fde..00dc8d094c6a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/PostgreSQLSequenceGeneratorWithSerialTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/PostgreSQLSequenceGeneratorWithSerialTest.java @@ -36,7 +36,6 @@ import static org.hibernate.id.enhanced.SequenceGeneratorLogger.SEQUENCE_GENERATOR_MESSAGE_LOGGER; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Vlad Mihalcea @@ -48,7 +47,7 @@ public class PostgreSQLSequenceGeneratorWithSerialTest extends EntityManagerFact @Rule public LoggerInspectionRule logInspection = new LoggerInspectionRule( SEQUENCE_GENERATOR_MESSAGE_LOGGER ); - private final Triggerable triggerable = logInspection.watchForLogMessages( "HHH090202:" ); + private final Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203:" ); @Override protected Class[] getAnnotatedClasses() { @@ -105,7 +104,8 @@ protected boolean exportSchema() { @Override protected void entityManagerFactoryBuilt(EntityManagerFactory factory) { - assertTrue( triggerable.wasTriggered() ); + // this message is logged at trace level + assertFalse( triggerable.wasTriggered() ); } @Test diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyDefaultExceptionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyDefaultExceptionTest.java index 8ec672d5a7c0..011fde18d1f7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyDefaultExceptionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyDefaultExceptionTest.java @@ -60,7 +60,7 @@ public EntityManagerFactory produceEntityManagerFactory() { catch (Exception e) { Throwable rootCause = ExceptionUtil.rootCause( e ); assertTrue( rootCause instanceof MappingException ); - assertTrue( rootCause.getMessage().contains( "in the entity mapping while the associated database sequence increment size is" ) ); + assertTrue( rootCause.getMessage().contains( "in the entity mapping but the mapped database sequence increment size is" ) ); new SchemaExport().drop( EnumSet.of( TargetType.DATABASE ), metadata ); StandardServiceRegistryBuilder.destroy( serviceRegistry ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyFixWithSequenceGeneratorTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyFixWithSequenceGeneratorTest.java index 5b5fdda0f554..2bb0ef008b4a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyFixWithSequenceGeneratorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyFixWithSequenceGeneratorTest.java @@ -35,7 +35,7 @@ import static org.hibernate.id.enhanced.SequenceGeneratorLogger.SEQUENCE_GENERATOR_MESSAGE_LOGGER; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; /** @@ -48,7 +48,7 @@ public class SequenceMismatchStrategyFixWithSequenceGeneratorTest extends Entity @Rule public LoggerInspectionRule logInspection = new LoggerInspectionRule( SEQUENCE_GENERATOR_MESSAGE_LOGGER ); - private final Triggerable triggerable = logInspection.watchForLogMessages( "HHH090202:" ); + private final Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203:" ); protected ServiceRegistry serviceRegistry; protected MetadataImplementor metadata; @@ -90,7 +90,8 @@ protected void addConfigOptions(Map options) { @Override protected void entityManagerFactoryBuilt(EntityManagerFactory factory) { - assertTrue( triggerable.wasTriggered() ); + // This message is trace level + assertFalse( triggerable.wasTriggered() ); } @Override diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyUnknownEnumValueTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyUnknownEnumValueTest.java index 67cc41308cce..dcb6bbfe9289 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyUnknownEnumValueTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/hhh12973/SequenceMismatchStrategyUnknownEnumValueTest.java @@ -12,7 +12,6 @@ import org.hibernate.testing.util.ExceptionUtil; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -33,7 +32,6 @@ public void test() { catch (Exception e) { Throwable rootCause = ExceptionUtil.rootCause( e ); assertTrue( rootCause instanceof HibernateException ); - assertEquals( "Unrecognized sequence.increment_size_mismatch_strategy value : [acme]. Supported values include [log], [exception], and [fix].", rootCause.getMessage() ); } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/NegativeValueSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/NegativeValueSequenceTest.java index 59f155d29517..07043fd65e5d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/NegativeValueSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/NegativeValueSequenceTest.java @@ -56,7 +56,7 @@ public void testNegativeOneAllocationSizeNoopOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( NegativeOneIncrementSize.class ) @@ -104,7 +104,7 @@ public void testNegativeTwoAllocationSizeNoopOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( NegativeTwoIncrementSize.class ) @@ -153,7 +153,7 @@ public void testPositiveOneAllocationSizeNoopOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( PositiveOneIncrementSize.class ) @@ -202,7 +202,7 @@ public void testPositiveTwoAllocationSizeNoopOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( PositiveTwoIncrementSize.class ) @@ -252,7 +252,7 @@ public void testPositiveTwoAllocationSizePooledOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( PositiveTwoIncrementSize.class ) @@ -302,7 +302,7 @@ public void testNegativeTwoAllocationSizePositiveStartNoopOptimizer() { .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); - Triggerable triggerable = logInspection.watchForLogMessages( "HHH090203" ); + Triggerable triggerable = logInspection.watchForLogMessages( "HHH090205" ); Metadata metadata = new MetadataSources( serviceRegistry ) .addAnnotatedClass( NegativeTwoIncrementSizePositiveInitialValue.class ) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/PooledWithCustomNamingStrategyTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/PooledWithCustomNamingStrategyTest.java index c9ecf985863b..5bf43a804c2b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/PooledWithCustomNamingStrategyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/sequence/PooledWithCustomNamingStrategyTest.java @@ -61,7 +61,7 @@ public void testWrongIncrementSize() { catch (Exception e) { assertThat( e.getMessage() ).isEqualTo( "The increment size of the [MY_SEQ] sequence is set to [50] in the entity " + - "mapping while the associated database sequence increment size is [5]." + "mapping but the mapped database sequence increment size is [5]" ); } }