Skip to content

Commit 3d366a5

Browse files
committed
HHH-8561 - hibernate.dialect_resolvers causes failures
1 parent 4428464 commit 3d366a5

24 files changed

+596
-798
lines changed

hibernate-core/src/main/java/org/hibernate/engine/jdbc/dialect/internal/DatabaseInfoDialectResolverInitiator.java

Lines changed: 0 additions & 84 deletions
This file was deleted.

hibernate-core/src/main/java/org/hibernate/engine/jdbc/dialect/internal/DatabaseInfoDialectResolverSet.java

Lines changed: 0 additions & 99 deletions
This file was deleted.

hibernate-core/src/main/java/org/hibernate/engine/jdbc/dialect/internal/DialectFactoryImpl.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323
*/
2424
package org.hibernate.engine.jdbc.dialect.internal;
2525

26-
import java.sql.Connection;
27-
import java.sql.DatabaseMetaData;
28-
import java.sql.SQLException;
2926
import java.util.Map;
3027

3128
import org.hibernate.HibernateException;
@@ -34,37 +31,44 @@
3431
import org.hibernate.cfg.AvailableSettings;
3532
import org.hibernate.dialect.Dialect;
3633
import org.hibernate.engine.jdbc.dialect.spi.DialectFactory;
34+
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
35+
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource;
3736
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
38-
import org.hibernate.service.spi.InjectService;
37+
import org.hibernate.service.spi.ServiceRegistryAwareService;
38+
import org.hibernate.service.spi.ServiceRegistryImplementor;
3939

4040
/**
4141
* Standard implementation of the {@link DialectFactory} service.
4242
*
4343
* @author Steve Ebersole
4444
*/
45-
public class DialectFactoryImpl implements DialectFactory {
45+
public class DialectFactoryImpl implements DialectFactory, ServiceRegistryAwareService {
4646
private StrategySelector strategySelector;
47+
private DialectResolver dialectResolver;
4748

48-
@InjectService
49-
public void setStrategySelector(StrategySelector strategySelector) {
50-
this.strategySelector = strategySelector;
49+
@Override
50+
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
51+
this.strategySelector = serviceRegistry.getService( StrategySelector.class );
52+
this.dialectResolver = serviceRegistry.getService( DialectResolver.class );
5153
}
5254

53-
private DialectResolver dialectResolver;
54-
55-
@InjectService
55+
/**
56+
* Intended only for use from testing.
57+
*
58+
* @param dialectResolver The DialectResolver to use
59+
*/
5660
public void setDialectResolver(DialectResolver dialectResolver) {
5761
this.dialectResolver = dialectResolver;
5862
}
5963

6064
@Override
61-
public Dialect buildDialect(Map configValues, Connection connection) throws HibernateException {
65+
public Dialect buildDialect(Map configValues, DialectResolutionInfoSource resolutionInfoSource) throws HibernateException {
6266
final String dialectName = (String) configValues.get( AvailableSettings.DIALECT );
6367
if ( !StringHelper.isEmpty( dialectName ) ) {
6468
return constructDialect( dialectName );
6569
}
6670
else {
67-
return determineDialect( connection );
71+
return determineDialect( resolutionInfoSource );
6872
}
6973
}
7074

@@ -88,36 +92,29 @@ private Dialect constructDialect(String dialectName) {
8892
/**
8993
* Determine the appropriate Dialect to use given the connection.
9094
*
91-
* @param connection The configured connection.
95+
* @param resolutionInfoSource Access to DialectResolutionInfo used to resolve the Dialect.
96+
*
9297
* @return The appropriate dialect instance.
9398
*
9499
* @throws HibernateException No connection given or no resolver could make
95100
* the determination from the given connection.
96101
*/
97-
private Dialect determineDialect(Connection connection) {
98-
if ( connection == null ) {
99-
throw new HibernateException( "Connection cannot be null when 'hibernate.dialect' not set" );
102+
private Dialect determineDialect(DialectResolutionInfoSource resolutionInfoSource) {
103+
if ( resolutionInfoSource == null ) {
104+
throw new HibernateException( "Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set" );
100105
}
101106

102-
try {
103-
final DatabaseMetaData databaseMetaData = connection.getMetaData();
104-
final Dialect dialect = dialectResolver.resolveDialect( databaseMetaData );
105-
106-
if ( dialect == null ) {
107-
throw new HibernateException(
108-
"Unable to determine Dialect to use [name=" + databaseMetaData.getDatabaseProductName() +
109-
", majorVersion=" + databaseMetaData.getDatabaseMajorVersion() +
110-
"]; user must register resolver or explicitly set 'hibernate.dialect'"
111-
);
112-
}
107+
final DialectResolutionInfo info = resolutionInfoSource.getDialectResolutionInfo();
108+
final Dialect dialect = dialectResolver.resolveDialect( info );
113109

114-
return dialect;
115-
}
116-
catch ( SQLException sqlException ) {
110+
if ( dialect == null ) {
117111
throw new HibernateException(
118-
"Unable to access java.sql.DatabaseMetaData to determine appropriate Dialect to use",
119-
sqlException
112+
"Unable to determine Dialect to use [name=" + info.getDatabaseName() +
113+
", majorVersion=" + info.getDatabaseMajorVersion() +
114+
"]; user must register resolver or explicitly set 'hibernate.dialect'"
120115
);
121116
}
117+
118+
return dialect;
122119
}
123120
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/dialect/internal/DialectResolverInitiator.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.hibernate.boot.registry.StandardServiceInitiator;
3030
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
3131
import org.hibernate.cfg.AvailableSettings;
32-
import org.hibernate.engine.jdbc.dialect.spi.DatabaseInfoDialectResolver;
3332
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
3433
import org.hibernate.internal.util.StringHelper;
3534
import org.hibernate.service.spi.ServiceException;
@@ -55,12 +54,10 @@ public Class<DialectResolver> getServiceInitiated() {
5554
@Override
5655
public DialectResolver initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
5756
final DialectResolverSet resolver = new DialectResolverSet();
57+
5858
applyCustomerResolvers( resolver, registry, configurationValues );
59-
resolver.addResolver(
60-
new StandardDatabaseMetaDataDialectResolver(
61-
registry.getService( DatabaseInfoDialectResolver.class )
62-
)
63-
);
59+
resolver.addResolver(StandardDialectResolver.INSTANCE );
60+
6461
return resolver;
6562
}
6663

0 commit comments

Comments
 (0)