Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.hibernate.DuplicateMappingException;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.CollectionTypeRegistration;
import org.hibernate.annotations.Imported;
import org.hibernate.annotations.Parameter;
Expand Down Expand Up @@ -345,7 +344,7 @@ public SessionFactoryBuilder getSessionFactoryBuilder() {
}

@Override
public SessionFactory buildSessionFactory() {
public SessionFactoryImplementor buildSessionFactory() {
throw new UnsupportedOperationException(
"You should not be building a SessionFactory from an in-flight metadata collector; and of course " +
"we should better segment this in the API :)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
import org.hibernate.boot.model.NamedEntityGraphDefinition;
Expand Down Expand Up @@ -205,8 +204,8 @@ private ClassLoaderService getClassLoaderService() {
}

@Override
public SessionFactory buildSessionFactory() {
return getSessionFactoryBuilder().build();
public SessionFactoryImplementor buildSessionFactory() {
return (SessionFactoryImplementor) getSessionFactoryBuilder().build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,7 @@
*/
package org.hibernate.boot.spi;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.hibernate.MappingException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
import org.hibernate.boot.model.NamedEntityGraphDefinition;
Expand All @@ -36,6 +28,13 @@
import org.hibernate.type.Type;
import org.hibernate.type.spi.TypeConfiguration;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
* Convenience base class for custom implementors of {@link MetadataImplementor} using delegation.
*
Expand Down Expand Up @@ -75,7 +74,7 @@ public SessionFactoryBuilder getSessionFactoryBuilder() {
}

@Override
public SessionFactory buildSessionFactory() {
public SessionFactoryImplementor buildSessionFactory() {
return delegate.buildSessionFactory();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,7 @@ public interface MetadataImplementor extends Metadata {
Component getGenericComponent(Class<?> componentClass);

DiscriminatorType<?> resolveEmbeddableDiscriminatorType(Class<?> embeddableClass, Supplier<DiscriminatorType<?>> supplier);

@Override
SessionFactoryImplementor buildSessionFactory();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3653,7 +3653,12 @@ public String[] getDropSchemaCommand(String schemaName) {
* make use of the Java 1.7 {@link Connection#getSchema()} method.
*
* @return The current schema retrieval SQL
*
* @deprecated Since Hibernate now baselines on Java 17,
* {@link Connection#getSchema()} is always available directly.
* Never used internally.
*/
@Deprecated
public String getCurrentSchemaCommand() {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,8 @@
*/
package org.hibernate.dialect;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import jakarta.persistence.TemporalType;
import org.hibernate.HibernateException;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.TypeContributions;
import org.hibernate.dialect.function.CommonFunctionFactory;
Expand All @@ -24,20 +18,22 @@
import org.hibernate.dialect.unique.SkipNullableUniqueDelegate;
import org.hibernate.dialect.unique.UniqueDelegate;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver;
import org.hibernate.engine.jdbc.env.spi.IdentifierCaseStrategy;
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
import org.hibernate.engine.jdbc.env.spi.SchemaNameResolver;
import org.hibernate.engine.spi.LoadQueryInfluencers;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.procedure.internal.JTDSCallableStatementSupport;
import org.hibernate.procedure.internal.SybaseCallableStatementSupport;
import org.hibernate.procedure.spi.CallableStatementSupport;
import org.hibernate.query.common.TemporalUnit;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.query.spi.QueryParameterBindings;
import org.hibernate.query.sqm.CastType;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.common.TemporalUnit;
import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.sql.SqmTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
Expand All @@ -63,7 +59,15 @@
import org.hibernate.type.descriptor.jdbc.TinyIntAsSmallIntJdbcType;
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;

import jakarta.persistence.TemporalType;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import static org.hibernate.type.descriptor.DateTimeUtils.appendAsDate;
import static org.hibernate.type.descriptor.DateTimeUtils.appendAsLocalTime;
Expand Down Expand Up @@ -91,6 +95,8 @@
@Deprecated(forRemoval = true)
protected final boolean jtdsDriver;

private final SchemaNameResolver schemaNameResolver;

public SybaseDialect() {
this( MINIMUM_VERSION );
}
Expand All @@ -99,12 +105,22 @@
super(version);
this.driverKind = SybaseDriverKind.OTHER;
this.jtdsDriver = true;
this.schemaNameResolver = determineSchemaNameResolver( driverKind );
}

private static SchemaNameResolver determineSchemaNameResolver(SybaseDriverKind driverKind) {
// if the driver is jTDS, then we need to use a query to determine the schema name.
// if we don't know the driver (OTHER), then be safe and use the query approach
return driverKind != SybaseDriverKind.JCONNECT
? new JTDSSchemaNameResolver()
: DefaultSchemaNameResolver.INSTANCE;
}

public SybaseDialect(DialectResolutionInfo info) {
super(info);
this.driverKind = SybaseDriverKind.determineKind( info );
this.jtdsDriver = driverKind == SybaseDriverKind.JTDS;
this.schemaNameResolver = determineSchemaNameResolver( driverKind );
}

@Override
Expand Down Expand Up @@ -321,6 +337,11 @@
return false;
}

@Override
public SchemaNameResolver getSchemaNameResolver() {
return schemaNameResolver;
}

@Override
public String getCurrentSchemaCommand() {
return "select user_name()";
Expand Down Expand Up @@ -538,7 +559,7 @@

@Override
public boolean supportsRowValueConstructorSyntax() {
return false;
}

@Override
Expand All @@ -556,4 +577,26 @@
return false;
}

private static class JTDSSchemaNameResolver implements SchemaNameResolver {
@Override
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
//noinspection deprecation
final String command = dialect.getCurrentSchemaCommand();

Check notice

Code scanning / CodeQL

Deprecated method or constructor invocation Note

Invoking
Dialect.getCurrentSchemaCommand
should be avoided because it has been deprecated.
if ( command == null ) {
throw new HibernateException(
"Use of DefaultSchemaNameResolver requires Dialect to provide the " +
"proper SQL statement/command but provided Dialect [" +
dialect.getClass().getName() + "] did not return anything " +
"from Dialect#getCurrentSchemaCommand"
);
}

try (final java.sql.Statement statement = connection.createStatement()) {
try (ResultSet resultSet = statement.executeQuery( command )) {
return resultSet.next() ? resultSet.getString( 1 ) : null;
}
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,108 +4,27 @@
*/
package org.hibernate.engine.jdbc.env.internal;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.hibernate.HibernateException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.env.spi.SchemaNameResolver;

import org.jboss.logging.Logger;
import java.sql.Connection;
import java.sql.SQLException;

/**
* Default implementation of {@link SchemaNameResolver}.
* Default implementation of {@link SchemaNameResolver}
* using {@link Connection#getSchema()}.
*
* @author Steve Ebersole
*/
public class DefaultSchemaNameResolver implements SchemaNameResolver {
private static final Logger log = Logger.getLogger( DefaultSchemaNameResolver.class );

public static final DefaultSchemaNameResolver INSTANCE = new DefaultSchemaNameResolver();

// NOTE: The actual delegate should not be cached in DefaultSchemaNameResolver because,
// in the case of multiple data sources, there may be a data source that
// requires a different delegate. See HHH-12392.

private DefaultSchemaNameResolver() {
}

private SchemaNameResolver determineAppropriateResolverDelegate(Connection connection) {
// unfortunately Connection#getSchema is only available in Java 1.7 and above
// and Hibernate still baselines on 1.6. So for now, use reflection and
// leverage the Connection#getSchema method if it is available.
try {
final Class<? extends Connection> jdbcConnectionClass = connection.getClass();
final Method getSchemaMethod = jdbcConnectionClass.getMethod( "getSchema" );
if ( getSchemaMethod.getReturnType().equals( String.class ) ) {
try {
// If the JDBC driver does not implement the Java 7 spec, but the JRE is Java 7
// then the getSchemaMethod is not null but the call to getSchema() throws an java.lang.AbstractMethodError
connection.getSchema();
return new SchemaNameResolverJava17Delegate();
}
catch (AbstractMethodError e) {
log.debugf( "Unable to use Java 1.7 Connection#getSchema" );
return SchemaNameResolverFallbackDelegate.INSTANCE;
}
}
else {
log.debugf( "Unable to use Java 1.7 Connection#getSchema" );
return SchemaNameResolverFallbackDelegate.INSTANCE;
}
}
catch (Exception e) {
log.debugf(
"Unable to use Java 1.7 Connection#getSchema : An error occurred trying to resolve the connection default schema resolver: %s",
e.getMessage() );
return SchemaNameResolverFallbackDelegate.INSTANCE;
}
}

@Override
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
// NOTE: delegate should not be cached in DefaultSchemaNameResolver because,
// in the case of multiple data sources, there may be a data source that
// requires a different delegate. See HHH-12392.
final SchemaNameResolver delegate = determineAppropriateResolverDelegate( connection );
return delegate.resolveSchemaName( connection, dialect );
}

public static class SchemaNameResolverJava17Delegate implements SchemaNameResolver {

@Override
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
return connection.getSchema();
}
return connection.getSchema();
}

public static class SchemaNameResolverFallbackDelegate implements SchemaNameResolver {
/**
* Singleton access
*/
public static final SchemaNameResolverFallbackDelegate INSTANCE = new SchemaNameResolverFallbackDelegate();

@Override
public String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException {
final String command = dialect.getCurrentSchemaCommand();
if ( command == null ) {
throw new HibernateException(
"Use of DefaultSchemaNameResolver requires Dialect to provide the " +
"proper SQL statement/command but provided Dialect [" +
dialect.getClass().getName() + "] did not return anything " +
"from Dialect#getCurrentSchemaCommand"
);
}

try (
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery( dialect.getCurrentSchemaCommand() )
) {
return resultSet.next() ? resultSet.getString( 1 ) : null;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,20 @@ public interface JdbcEnvironment extends Service {
ExtractedDatabaseMetaData getExtractedDatabaseMetaData();

/**
* Get the current database catalog. Typically will come from either {@link java.sql.Connection#getCatalog()}
* or {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
* Get the current database catalog. Typically, will come from either
* {@link java.sql.Connection#getCatalog()} or
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
*
* @return The current catalog.
*/
Identifier getCurrentCatalog();

/**
* Get the current database catalog. Typically will come from either
* {@link SchemaNameResolver#resolveSchemaName(java.sql.Connection, Dialect)} or
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_CATALOG}.
* Get the current database catalog. Typically, will come from either
* {@link java.sql.Connection#getSchema()} or
* {@value org.hibernate.cfg.AvailableSettings#DEFAULT_SCHEMA}.
*
* @see org.hibernate.engine.jdbc.env.spi.SchemaNameResolver
*
* @return The current schema
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
/**
* Contract for resolving the schema of a {@link Connection}.
*
* @apiNote Exists mainly for historical reasons when Hibernate
* baselines on Java versions before 8 when {@linkplain Connection#getSchema()}
* was introduced. We still use it at the moment because some drivers do not
* implement it (jTDS) and/or some databases do not support schemas and
* their drivers don't DoTheRightThing.
*
* @author Steve Ebersole
*/
public interface SchemaNameResolver {
Expand All @@ -21,7 +27,7 @@ public interface SchemaNameResolver {
* @param connection The JDBC connection
* @param dialect The {@link Dialect}
*
* @return The name of the schema (may be null).
* @return The name of the schema; may be null.
*/
String resolveSchemaName(Connection connection, Dialect dialect) throws SQLException;
}
Loading
Loading