diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index d4abe8813a67..686879c863d3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -80,7 +80,6 @@ import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder; import org.hibernate.stat.Statistics; import org.hibernate.type.format.FormatMapper; -import org.hibernate.type.format.jackson.JacksonIntegration; import org.hibernate.type.format.jaxb.JaxbXmlFormatMapper; import jakarta.persistence.criteria.Nulls; @@ -118,6 +117,7 @@ import static org.hibernate.type.format.jackson.JacksonIntegration.getJsonJacksonFormatMapperOrNull; import static org.hibernate.type.format.jackson.JacksonIntegration.getOsonJacksonFormatMapperOrNull; import static org.hibernate.type.format.jackson.JacksonIntegration.getXMLJacksonFormatMapperOrNull; +import static org.hibernate.type.format.jackson.JacksonIntegration.isJacksonOsonExtensionAvailable; import static org.hibernate.type.format.jakartajson.JakartaJsonIntegration.getJakartaJsonBFormatMapperOrNull; /** @@ -309,13 +309,13 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo settings.get( AvailableSettings.JAKARTA_VALIDATION_FACTORY ) ); - jsonFormatMapper = determineJsonFormatMapper( + jsonFormatMapper = jsonFormatMapper( settings.get( AvailableSettings.JSON_FORMAT_MAPPER ), !getBoolean( ORACLE_OSON_DISABLED ,settings), strategySelector ); - xmlFormatMapper = determineXmlFormatMapper( + xmlFormatMapper = xmlFormatMapper( settings.get( AvailableSettings.XML_FORMAT_MAPPER ), strategySelector, xmlFormatMapperLegacyFormatEnabled = @@ -620,17 +620,20 @@ private SqmMultiTableMutationStrategy resolveSqmMutationStrategy( strategyName, (SqmMultiTableMutationStrategy) null, strategyClass -> { - Constructor dialectConstructor = null; - Constructor emptyConstructor = null; + Constructor dialectConstructor = null; + Constructor emptyConstructor = null; // todo (6.0) : formalize the allowed constructor parameterizations - for ( Constructor declaredConstructor : strategyClass.getDeclaredConstructors() ) { - final Class[] parameterTypes = declaredConstructor.getParameterTypes(); + for ( var declaredConstructor : strategyClass.getDeclaredConstructors() ) { + final var parameterTypes = declaredConstructor.getParameterTypes(); + final var constructor = + (Constructor) + declaredConstructor; if ( parameterTypes.length == 1 && parameterTypes[0] == Dialect.class ) { - dialectConstructor = (Constructor) declaredConstructor; + dialectConstructor = constructor; break; } else if ( parameterTypes.length == 0 ) { - emptyConstructor = (Constructor) declaredConstructor; + emptyConstructor = constructor; } } @@ -646,11 +649,13 @@ else if ( emptyConstructor != null ) { } catch (Exception e) { throw new StrategySelectionException( - String.format( "Could not instantiate named strategy class [%s]", strategyClass.getName() ), + "Could not instantiate named strategy class [" + strategyClass.getName() + "]", e ); } - throw new IllegalArgumentException( "Cannot instantiate the class [" + strategyClass.getName() + "] because it does not have a constructor that accepts a dialect or an empty constructor" ); + throw new IllegalArgumentException( "Cannot instantiate the class [" + + strategyClass.getName() + + "] because it does not have a constructor that accepts a dialect or an empty constructor" ); } ); } @@ -669,17 +674,20 @@ private SqmMultiTableInsertStrategy resolveSqmInsertStrategy( strategyName, (SqmMultiTableInsertStrategy) null, strategyClass -> { - Constructor dialectConstructor = null; - Constructor emptyConstructor = null; + Constructor dialectConstructor = null; + Constructor emptyConstructor = null; // todo (6.0) : formalize the allowed constructor parameterizations - for ( Constructor declaredConstructor : strategyClass.getDeclaredConstructors() ) { - final Class[] parameterTypes = declaredConstructor.getParameterTypes(); + for ( var declaredConstructor : strategyClass.getDeclaredConstructors() ) { + final var parameterTypes = declaredConstructor.getParameterTypes(); + final var constructor = + (Constructor) + declaredConstructor; if ( parameterTypes.length == 1 && parameterTypes[0] == Dialect.class ) { - dialectConstructor = (Constructor) declaredConstructor; + dialectConstructor = constructor; break; } else if ( parameterTypes.length == 0 ) { - emptyConstructor = (Constructor) declaredConstructor; + emptyConstructor = constructor; } } @@ -695,11 +703,13 @@ else if ( emptyConstructor != null ) { } catch (Exception e) { throw new StrategySelectionException( - String.format( "Could not instantiate named strategy class [%s]", strategyClass.getName() ), + "Could not instantiate named strategy class [" + strategyClass.getName() + "]", e ); } - throw new IllegalArgumentException( "Cannot instantiate the class [" + strategyClass.getName() + "] because it does not have a constructor that accepts a dialect or an empty constructor" ); + throw new IllegalArgumentException( "Cannot instantiate the class [" + + strategyClass.getName() + + "] because it does not have a constructor that accepts a dialect or an empty constructor" ); } ); } @@ -708,23 +718,15 @@ private HqlTranslator resolveHqlTranslator( String producerName, StandardServiceRegistry serviceRegistry, StrategySelector strategySelector) { - if ( isEmpty( producerName ) ) { - return null; - } - else { - //noinspection Convert2Lambda - return strategySelector.resolveDefaultableStrategy( - HqlTranslator.class, - producerName, - new Callable<>() { - @Override - public HqlTranslator call() throws Exception { - return (HqlTranslator) serviceRegistry.requireService( ClassLoaderService.class ) - .classForName( producerName ).newInstance(); - } - } - ); - } + return isEmpty( producerName ) + ? null + : strategySelector.resolveDefaultableStrategy( + HqlTranslator.class, + producerName, + () -> (HqlTranslator) + serviceRegistry.requireService( ClassLoaderService.class ) + .classForName( producerName ).newInstance() + ); } private SqmTranslatorFactory resolveSqmTranslator( @@ -754,8 +756,7 @@ private static Interceptor determineInterceptor( private static Supplier determineStatelessInterceptor( Map configurationSettings, StrategySelector strategySelector) { - Object setting = configurationSettings.get( SESSION_SCOPED_INTERCEPTOR ); - + final Object setting = configurationSettings.get( SESSION_SCOPED_INTERCEPTOR ); if ( setting == null ) { return null; } @@ -782,7 +783,7 @@ private static Supplier interceptorSupplier(Class) () -> { + selector, + () -> { // Prefer the OSON Jackson FormatMapper by default if available final FormatMapper jsonJacksonFormatMapper = - (osonExtensionEnabled && JacksonIntegration.isJacksonOsonExtensionAvailable()) + osonExtensionEnabled && isJacksonOsonExtensionAvailable() ? getOsonJacksonFormatMapperOrNull() : getJsonJacksonFormatMapperOrNull(); - return jsonJacksonFormatMapper != null ? jsonJacksonFormatMapper : getJakartaJsonBFormatMapperOrNull(); + return jsonJacksonFormatMapper != null + ? jsonJacksonFormatMapper + : getJakartaJsonBFormatMapperOrNull(); } ); } - private static FormatMapper determineXmlFormatMapper(Object setting, StrategySelector strategySelector, boolean legacyFormat) { - return strategySelector.resolveDefaultableStrategy( - FormatMapper.class, + private static FormatMapper xmlFormatMapper(Object setting, StrategySelector selector, boolean legacyFormat) { + return formatMapper( setting, - (Callable) () -> { - final FormatMapper jacksonFormatMapper = getXMLJacksonFormatMapperOrNull( legacyFormat ); - return jacksonFormatMapper != null ? jacksonFormatMapper : new JaxbXmlFormatMapper( legacyFormat ); + selector, + () -> { + final FormatMapper jacksonFormatMapper = + getXMLJacksonFormatMapperOrNull( legacyFormat ); + return jacksonFormatMapper != null + ? jacksonFormatMapper + : new JaxbXmlFormatMapper( legacyFormat ); } ); } + private static FormatMapper formatMapper(Object setting, StrategySelector selector, Callable defaultResolver) { + return selector.resolveDefaultableStrategy( FormatMapper.class, setting, defaultResolver ); + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // SessionFactoryOptionsState @@ -1601,8 +1611,8 @@ public void disableJtaTransactionAccess() { } public SessionFactoryOptions buildOptions() { - if ( jpaCompliance instanceof MutableJpaCompliance ) { - jpaCompliance = mutableJpaCompliance().immutableCopy(); + if ( jpaCompliance instanceof MutableJpaCompliance mutableJpaCompliance ) { + jpaCompliance = mutableJpaCompliance.immutableCopy(); } return this; } @@ -1692,7 +1702,7 @@ private Map initializeDefaultSessionProperties(ConfigurationServ LegacySpecHints.HINT_JAVAEE_QUERY_TIMEOUT }; - final Map configurationServiceSettings = configurationService.getSettings(); + final var configurationServiceSettings = configurationService.getSettings(); for ( String key : ENTITY_MANAGER_SPECIFIC_PROPERTIES ) { if ( configurationServiceSettings.containsKey( key ) ) { settings.put( key, configurationServiceSettings.get( key ) ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java index dc4f2addbc17..5ea084c1347a 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java @@ -103,6 +103,26 @@ public static Integer getIsolation(DataSource dataSource) { } } + static Integer getFetchSize(ConnectionCreator creator) { + try ( var conn = creator.createConnection() ) { + try ( var statement = conn.createStatement() ) { + return statement.getFetchSize(); + } + } + catch ( SQLException ignored ) { + return null; + } + } + + static Integer getIsolation(ConnectionCreator creator) { + try ( var conn = creator.createConnection() ) { + return conn.getTransactionIsolation(); + } + catch ( SQLException ignored ) { + return null; + } + } + @Override public String getJdbcUrl() { return jdbcUrl; diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index 49c25cf32ca6..6097620194fb 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -8,7 +8,6 @@ import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.Enumeration; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentLinkedQueue; @@ -40,6 +39,8 @@ import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.extractIsolation; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.getConnectionProperties; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; import static org.hibernate.internal.util.config.ConfigurationHelper.getInt; import static org.hibernate.internal.util.config.ConfigurationHelper.getLong; @@ -142,7 +143,20 @@ private static ConnectionCreator buildCreator( final Integer isolation = extractIsolation( configurationValues ); final String initSql = (String) configurationValues.get( INIT_SQL ); - final ConnectionCreatorFactory factory = getConnectionCreatorFactory( configurationValues, serviceRegistry ); + final var connectionCreator = + getConnectionCreatorFactory( configurationValues, serviceRegistry ) + .create( + driver, + serviceRegistry, + url, + connectionProps, + autoCommit, + isolation, + initSql, + configurationValues + ); + + ; dbInfo = new DatabaseConnectionInfoImpl( DriverManagerConnectionProviderImpl.class, @@ -150,35 +164,28 @@ private static ConnectionCreator buildCreator( driverList, SimpleDatabaseVersion.ZERO_VERSION, Boolean.toString( autoCommit ), - isolation != null ? toIsolationNiceName( isolation ) : null, + isolation != null + ? toIsolationNiceName( isolation ) + : toIsolationNiceName( getIsolation( connectionCreator ) ), getInt( MIN_SIZE, configurationValues, 1 ), getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ), - null + getFetchSize( connectionCreator ) ); - return factory.create( - driver, - serviceRegistry, - url, - connectionProps, - autoCommit, - isolation, - initSql, - configurationValues - ); + return connectionCreator; } private static String driverList() { //we're hoping that the driver is already loaded ConnectionInfoLogger.INSTANCE.jdbcDriverNotSpecified(); - final StringBuilder list = new StringBuilder(); - final Enumeration drivers = DriverManager.getDrivers(); - while ( drivers.hasMoreElements() ) { - if ( !list.isEmpty() ) { - list.append(", "); - } - list.append( drivers.nextElement().getClass().getName() ); - } + final var list = new StringBuilder(); + DriverManager.drivers() + .forEach( driver -> { + if ( !list.isEmpty() ) { + list.append( ", " ); + } + list.append( driver.getClass().getName() ); + } ); return list.toString(); }