44 */
55package org .hibernate .engine .jdbc .env .internal ;
66
7- import java .sql .Connection ;
8- import java .sql .DatabaseMetaData ;
9- import java .sql .SQLException ;
10- import java .util .Collections ;
11- import java .util .Map ;
12- import java .util .StringTokenizer ;
13-
7+ import org .hibernate .HibernateException ;
148import org .hibernate .boot .registry .StandardServiceInitiator ;
159import org .hibernate .cfg .JdbcSettings ;
1610import org .hibernate .dialect .DatabaseVersion ;
2418import org .hibernate .engine .jdbc .connections .spi .MultiTenantConnectionProvider ;
2519import org .hibernate .engine .jdbc .dialect .spi .DialectFactory ;
2620import org .hibernate .engine .jdbc .dialect .spi .DialectResolutionInfo ;
21+ import org .hibernate .engine .jdbc .env .JdbcMetadataOnBoot ;
2722import org .hibernate .engine .jdbc .env .spi .JdbcEnvironment ;
2823import org .hibernate .engine .jdbc .internal .JdbcCoordinatorImpl ;
2924import org .hibernate .engine .jdbc .internal .JdbcServicesImpl ;
4439import org .hibernate .service .spi .ServiceRegistryImplementor ;
4540import org .hibernate .stat .spi .StatisticsImplementor ;
4641
47-
48- import static org .hibernate .engine .jdbc .JdbcLogging .JDBC_LOGGER ;
42+ import java .sql .Connection ;
43+ import java .sql .DatabaseMetaData ;
44+ import java .sql .SQLException ;
45+ import java .util .Collections ;
46+ import java .util .Locale ;
47+ import java .util .Map ;
48+ import java .util .StringTokenizer ;
4949
5050import static java .lang .Integer .parseInt ;
5151import static org .hibernate .cfg .AvailableSettings .CONNECTION_HANDLING ;
6262import static org .hibernate .cfg .JdbcSettings .DIALECT ;
6363import static org .hibernate .cfg .JdbcSettings .DIALECT_DB_VERSION ;
6464import static org .hibernate .cfg .JdbcSettings .JAKARTA_HBM2DDL_DB_VERSION ;
65- import static org .hibernate .engine .config .spi .StandardConverters .BOOLEAN ;
6665import static org .hibernate .context .spi .MultiTenancy .isMultiTenancyEnabled ;
66+ import static org .hibernate .engine .config .spi .StandardConverters .BOOLEAN ;
67+ import static org .hibernate .engine .jdbc .JdbcLogging .JDBC_LOGGER ;
6768import static org .hibernate .internal .log .ConnectionInfoLogger .CONNECTION_INFO_LOGGER ;
6869import static org .hibernate .internal .log .DeprecationLogger .DEPRECATION_LOGGER ;
6970import static org .hibernate .internal .util .NullnessHelper .coalesceSuppliedValues ;
@@ -86,7 +87,7 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
8687 * {@value org.hibernate.cfg.JdbcSettings#ALLOW_METADATA_ON_BOOT}.
8788 */
8889 @ Deprecated (since ="6" , forRemoval = true )
89- private static final String USE_JDBC_METADATA_DEFAULTS = "hibernate.temp.use_jdbc_metadata_defaults" ;
90+ public static final String USE_JDBC_METADATA_DEFAULTS = "hibernate.temp.use_jdbc_metadata_defaults" ;
9091
9192 @ Override
9293 public Class <JdbcEnvironment > getServiceInitiated () {
@@ -137,8 +138,10 @@ private JdbcEnvironment getJdbcEnvironment(
137138
138139 final JdbcEnvironment jdbcEnvironment ;
139140 final DatabaseConnectionInfo databaseConnectionInfo ;
140- if ( allowJdbcMetadataAccess ( configurationValues ) ) {
141+ final JdbcMetadataOnBoot jdbcMetadataAccess = jdbcMetadataAccess ( configurationValues );
142+ if ( jdbcMetadataAccess != JdbcMetadataOnBoot .DISALLOW ) {
141143 jdbcEnvironment = getJdbcEnvironmentUsingJdbcMetadata (
144+ jdbcMetadataAccess ,
142145 configurationValues ,
143146 registry ,
144147 dialectFactory ,
@@ -241,20 +244,37 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentWithExplicitConfiguration(
241244 *
242245 * @see JdbcSettings#ALLOW_METADATA_ON_BOOT
243246 */
244- public static boolean allowJdbcMetadataAccess (Map <String , Object > configurationValues ) {
245- final Boolean allow = getBooleanWrapper ( ALLOW_METADATA_ON_BOOT , configurationValues , null );
246- if ( allow != null ) {
247- return allow ;
247+ public static JdbcMetadataOnBoot jdbcMetadataAccess (Map <String , Object > configurationValues ) {
248+ final Object setting = configurationValues .get ( ALLOW_METADATA_ON_BOOT );
249+ if ( setting != null ) {
250+ // might be any number of forms....
251+ if ( setting instanceof JdbcMetadataOnBoot asEnum ) {
252+ return asEnum ;
253+ }
254+
255+ if ( setting instanceof String asString ) {
256+ if ( asString .equalsIgnoreCase ( "true" ) ) {
257+ return JdbcMetadataOnBoot .ALLOW ;
258+ }
259+ if ( asString .equalsIgnoreCase ( "false" ) ) {
260+ return JdbcMetadataOnBoot .DISALLOW ;
261+ }
262+ return JdbcMetadataOnBoot .valueOf ( asString .toUpperCase ( Locale .ROOT ) );
263+ }
264+
265+ if ( setting instanceof Boolean asBoolean ) {
266+ return asBoolean ? JdbcMetadataOnBoot .ALLOW : JdbcMetadataOnBoot .DISALLOW ;
267+ }
248268 }
249269
250270 final Boolean use = getBooleanWrapper ( USE_JDBC_METADATA_DEFAULTS , configurationValues , null );
251271 if ( use != null ) {
252272 DEPRECATION_LOGGER .deprecatedSetting ( USE_JDBC_METADATA_DEFAULTS , ALLOW_METADATA_ON_BOOT );
253- return use ;
273+ return use ? JdbcMetadataOnBoot . ALLOW : JdbcMetadataOnBoot . DISALLOW ;
254274 }
255275
256276 // allow by default
257- return true ;
277+ return JdbcMetadataOnBoot . ALLOW ;
258278 }
259279
260280 private static String getExplicitDatabaseVersion (
@@ -323,6 +343,7 @@ private static String getExplicitDatabaseName(Map<String, Object> configurationV
323343
324344 // Used by Hibernate Reactive
325345 protected JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata (
346+ JdbcMetadataOnBoot jdbcMetadataAccess ,
326347 Map <String , Object > configurationValues ,
327348 ServiceRegistryImplementor registry ,
328349 DialectFactory dialectFactory , String explicitDatabaseName ,
@@ -345,7 +366,7 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata(
345366 return temporaryJdbcSessionOwner .transactionCoordinator .createIsolationDelegate ().delegateWork (
346367 new AbstractReturningWork <>() {
347368 @ Override
348- public JdbcEnvironmentImpl execute (Connection connection ) {
369+ public JdbcEnvironmentImpl execute (Connection connection ) throws SQLException {
349370 try {
350371 final var metadata = connection .getMetaData ();
351372 logDatabaseAndDriver ( metadata );
@@ -380,7 +401,12 @@ public JdbcEnvironmentImpl execute(Connection connection) {
380401 );
381402 }
382403 catch (SQLException e ) {
383- JDBC_LOGGER .unableToObtainConnectionMetadata ( e );
404+ if ( jdbcMetadataAccess == JdbcMetadataOnBoot .REQUIRE ) {
405+ throw e ;
406+ }
407+ else {
408+ JDBC_LOGGER .unableToObtainConnectionMetadata ( e );
409+ }
384410 }
385411
386412 // accessing the JDBC metadata failed
@@ -411,7 +437,12 @@ private int databaseMicroVersion(DatabaseMetaData metadata) throws SQLException
411437 );
412438 }
413439 catch ( Exception e ) {
414- JDBC_LOGGER .unableToObtainConnectionToQueryMetadata ( e );
440+ if ( jdbcMetadataAccess == JdbcMetadataOnBoot .REQUIRE ) {
441+ throw new HibernateException ( "Unable to access JDBC metadata" , e );
442+ }
443+ else {
444+ JDBC_LOGGER .unableToObtainConnectionToQueryMetadata ( e );
445+ }
415446 }
416447 finally {
417448 //noinspection resource
0 commit comments