Skip to content

Commit 280beaf

Browse files
committed
HHH-19063 - Deprecate SchemaNameResolver
1 parent 151e5d7 commit 280beaf

File tree

6 files changed

+31
-267
lines changed

6 files changed

+31
-267
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3653,7 +3653,12 @@ public String[] getDropSchemaCommand(String schemaName) {
36533653
* make use of the Java 1.7 {@link Connection#getSchema()} method.
36543654
*
36553655
* @return The current schema retrieval SQL
3656+
*
3657+
* @deprecated Since Hibernate now baselines on Java 17,
3658+
* {@link Connection#getSchema()} is always available directly.
3659+
* Never used internally.
36563660
*/
3661+
@Deprecated
36573662
public String getCurrentSchemaCommand() {
36583663
return null;
36593664
}
@@ -3663,7 +3668,12 @@ public String getCurrentSchemaCommand() {
36633668
* {@link Connection}, usually {@link DefaultSchemaNameResolver}.
36643669
*
36653670
* @return The schema name resolver strategy
3671+
*
3672+
* @deprecated Since Hibernate now baselines on Java 17,
3673+
* {@link Connection#getSchema()} is always available directly.
3674+
* Never used internally.
36663675
*/
3676+
@Deprecated
36673677
public SchemaNameResolver getSchemaNameResolver() {
36683678
return DefaultSchemaNameResolver.INSTANCE;
36693679
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/DefaultSchemaNameResolver.java

Lines changed: 7 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -4,108 +4,30 @@
44
*/
55
package org.hibernate.engine.jdbc.env.internal;
66

7-
import java.lang.reflect.Method;
8-
import java.sql.Connection;
9-
import java.sql.ResultSet;
10-
import java.sql.SQLException;
11-
import java.sql.Statement;
12-
13-
import org.hibernate.HibernateException;
147
import org.hibernate.dialect.Dialect;
158
import org.hibernate.engine.jdbc.env.spi.SchemaNameResolver;
169

17-
import org.jboss.logging.Logger;
10+
import java.sql.Connection;
11+
import java.sql.SQLException;
1812

1913
/**
2014
* Default implementation of {@link SchemaNameResolver}.
2115
*
16+
* @deprecated Since Hibernate now baselines on Java 17,
17+
* {@link Connection#getSchema()} is always available directly.
18+
*
2219
* @author Steve Ebersole
2320
*/
21+
@Deprecated
2422
public class DefaultSchemaNameResolver implements SchemaNameResolver {
25-
private static final Logger log = Logger.getLogger( DefaultSchemaNameResolver.class );
26-
2723
public static final DefaultSchemaNameResolver INSTANCE = new DefaultSchemaNameResolver();
2824

29-
// NOTE: The actual delegate should not be cached in DefaultSchemaNameResolver because,
30-
// in the case of multiple data sources, there may be a data source that
31-
// requires a different delegate. See HHH-12392.
32-
3325
private DefaultSchemaNameResolver() {
3426
}
3527

36-
private SchemaNameResolver determineAppropriateResolverDelegate(Connection connection) {
37-
// unfortunately Connection#getSchema is only available in Java 1.7 and above
38-
// and Hibernate still baselines on 1.6. So for now, use reflection and
39-
// leverage the Connection#getSchema method if it is available.
40-
try {
41-
final Class<? extends Connection> jdbcConnectionClass = connection.getClass();
42-
final Method getSchemaMethod = jdbcConnectionClass.getMethod( "getSchema" );
43-
if ( getSchemaMethod.getReturnType().equals( String.class ) ) {
44-
try {
45-
// If the JDBC driver does not implement the Java 7 spec, but the JRE is Java 7
46-
// then the getSchemaMethod is not null but the call to getSchema() throws an java.lang.AbstractMethodError
47-
connection.getSchema();
48-
return new SchemaNameResolverJava17Delegate();
49-
}
50-
catch (AbstractMethodError e) {
51-
log.debugf( "Unable to use Java 1.7 Connection#getSchema" );
52-
return SchemaNameResolverFallbackDelegate.INSTANCE;
53-
}
54-
}
55-
else {
56-
log.debugf( "Unable to use Java 1.7 Connection#getSchema" );
57-
return SchemaNameResolverFallbackDelegate.INSTANCE;
58-
}
59-
}
60-
catch (Exception e) {
61-
log.debugf(
62-
"Unable to use Java 1.7 Connection#getSchema : An error occurred trying to resolve the connection default schema resolver: %s",
63-
e.getMessage() );
64-
return SchemaNameResolverFallbackDelegate.INSTANCE;
65-
}
66-
}
67-
6828
@Override
6929
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
70-
// NOTE: delegate should not be cached in DefaultSchemaNameResolver because,
71-
// in the case of multiple data sources, there may be a data source that
72-
// requires a different delegate. See HHH-12392.
73-
final SchemaNameResolver delegate = determineAppropriateResolverDelegate( connection );
74-
return delegate.resolveSchemaName( connection, dialect );
75-
}
76-
77-
public static class SchemaNameResolverJava17Delegate implements SchemaNameResolver {
78-
79-
@Override
80-
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
81-
return connection.getSchema();
82-
}
30+
return connection.getSchema();
8331
}
8432

85-
public static class SchemaNameResolverFallbackDelegate implements SchemaNameResolver {
86-
/**
87-
* Singleton access
88-
*/
89-
public static final SchemaNameResolverFallbackDelegate INSTANCE = new SchemaNameResolverFallbackDelegate();
90-
91-
@Override
92-
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
93-
final String command = dialect.getCurrentSchemaCommand();
94-
if ( command == null ) {
95-
throw new HibernateException(
96-
"Use of DefaultSchemaNameResolver requires Dialect to provide the " +
97-
"proper SQL statement/command but provided Dialect [" +
98-
dialect.getClass().getName() + "] did not return anything " +
99-
"from Dialect#getCurrentSchemaCommand"
100-
);
101-
}
102-
103-
try (
104-
final Statement statement = connection.createStatement();
105-
final ResultSet resultSet = statement.executeQuery( dialect.getCurrentSchemaCommand() )
106-
) {
107-
return resultSet.next() ? resultSet.getString( 1 ) : null;
108-
}
109-
}
110-
}
11133
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.sql.SQLException;
99

1010
import org.hibernate.boot.model.naming.Identifier;
11-
import org.hibernate.boot.registry.selector.spi.StrategySelector;
1211
import org.hibernate.cfg.AvailableSettings;
1312
import org.hibernate.dialect.Dialect;
1413
import org.hibernate.engine.config.spi.ConfigurationService;
@@ -22,7 +21,6 @@
2221
import org.hibernate.engine.jdbc.env.spi.LobCreatorBuilder;
2322
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
2423
import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter;
25-
import org.hibernate.engine.jdbc.env.spi.SchemaNameResolver;
2624
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
2725
import org.hibernate.exception.internal.SQLExceptionTypeDelegate;
2826
import org.hibernate.exception.internal.SQLStateConversionDelegate;
@@ -294,7 +292,7 @@ public JdbcEnvironmentImpl(
294292
this.extractedMetaDataSupport =
295293
new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess )
296294
.apply( databaseMetaData )
297-
.setConnectionSchemaName( determineCurrentSchemaName( databaseMetaData, serviceRegistry, dialect ) )
295+
.setConnectionSchemaName( determineCurrentSchemaName( databaseMetaData ) )
298296
.setSupportsNamedParameters( dialect.supportsNamedParameters( databaseMetaData ) )
299297
.build();
300298

@@ -330,33 +328,16 @@ private static IdentifierHelper identifierHelper(
330328
return identifierHelperBuilder.build();
331329
}
332330

333-
public static final String SCHEMA_NAME_RESOLVER = "hibernate.schema_name_resolver";
334-
335-
private String determineCurrentSchemaName(
336-
DatabaseMetaData databaseMetaData,
337-
ServiceRegistry serviceRegistry,
338-
Dialect dialect) {
339-
final SchemaNameResolver resolver = getSchemaNameResolver( serviceRegistry, dialect );
331+
private String determineCurrentSchemaName(DatabaseMetaData databaseMetaData) {
340332
try {
341-
return resolver.resolveSchemaName( databaseMetaData.getConnection(), dialect );
333+
return databaseMetaData.getConnection().getSchema();
342334
}
343335
catch (Exception e) {
344336
log.debug( "Unable to resolve connection default schema", e );
345337
return null;
346338
}
347339
}
348340

349-
private static SchemaNameResolver getSchemaNameResolver(ServiceRegistry serviceRegistry, Dialect dialect) {
350-
final Object setting =
351-
serviceRegistry.requireService( ConfigurationService.class )
352-
.getSettings().get( SCHEMA_NAME_RESOLVER );
353-
return setting == null
354-
? dialect.getSchemaNameResolver()
355-
: serviceRegistry.requireService( StrategySelector.class )
356-
.resolveDefaultableStrategy( SchemaNameResolver.class, setting,
357-
dialect.getSchemaNameResolver() );
358-
}
359-
360341
private static SqlExceptionHelper buildSqlExceptionHelper(Dialect dialect, boolean logWarnings) {
361342
final SQLExceptionConversionDelegate dialectDelegate = dialect.buildSQLExceptionConversionDelegate();
362343
final SQLExceptionConversionDelegate[] delegates = dialectDelegate == null

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/JdbcEnvironment.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,18 @@ public interface JdbcEnvironment extends Service {
3535
ExtractedDatabaseMetaData getExtractedDatabaseMetaData();
3636

3737
/**
38-
* Get the current database catalog. Typically will come from either {@link java.sql.Connection#getCatalog()}
39-
* or {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
38+
* Get the current database catalog. Typically, will come from either
39+
* {@link java.sql.Connection#getCatalog()} or
40+
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
4041
*
4142
* @return The current catalog.
4243
*/
4344
Identifier getCurrentCatalog();
4445

4546
/**
46-
* Get the current database catalog. Typically will come from either
47-
* {@link SchemaNameResolver#resolveSchemaName(java.sql.Connection, Dialect)} or
48-
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
47+
* Get the current database catalog. Typically, will come from either
48+
* {@link java.sql.Connection#getSchema()} or
49+
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_SCHEMA}.
4950
*
5051
* @return The current schema
5152
*/

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/SchemaNameResolver.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@
1212
/**
1313
* Contract for resolving the schema of a {@link Connection}.
1414
*
15+
* @deprecated Since Hibernate now baselines on Java 17,
16+
* {@link Connection#getSchema()} is always available directly.
17+
*
1518
* @author Steve Ebersole
1619
*/
20+
@Deprecated
1721
public interface SchemaNameResolver {
1822
/**
1923
* Given a JDBC {@link Connection}, resolve the name of the schema (if one) to which it connects.
2024
*
2125
* @param connection The JDBC connection
2226
* @param dialect The {@link Dialect}
2327
*
24-
* @return The name of the schema (may be null).
28+
* @return The name of the schema; may be null.
2529
*/
2630
String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException;
2731
}

0 commit comments

Comments
 (0)