Skip to content

Commit f7870db

Browse files
committed
HHH-19399 introduce hibernate.jdbc.log.errors
- and clean up the terrible previous impl of logExceptions() - also slightly tidy up JdbcEnvironmentImpl
1 parent 4896997 commit f7870db

File tree

4 files changed

+161
-128
lines changed

4 files changed

+161
-128
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/JdbcSettings.java

+10
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,16 @@ public interface JdbcSettings extends C3p0Settings, AgroalSettings, HikariCPSett
461461
*/
462462
String LOG_JDBC_WARNINGS = "hibernate.jdbc.log.warnings";
463463

464+
/**
465+
* When enabled, specifies that JDBC errors should be logged before being rethrown.
466+
*
467+
* @settingDefault {@code true}
468+
*
469+
* @since 7
470+
*/
471+
@Incubating // this was added for symmetry with LOG_JDBC_WARNINGS
472+
String LOG_JDBC_ERRORS = "hibernate.jdbc.log.errors";
473+
464474
/**
465475
* Specifies the {@linkplain java.util.TimeZone time zone} to use in the JDBC driver,
466476
* which is supposed to match the database timezone.

hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableHelper.java

+14-13
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,22 @@ public static void cleanTemporaryTableRows(
173173
}
174174

175175

176-
private static final SqlExceptionHelper.WarningHandler WARNING_HANDLER = new SqlExceptionHelper.WarningHandlerLoggingSupport() {
177-
public boolean doProcess() {
178-
return log.isDebugEnabled();
179-
}
176+
private static final SqlExceptionHelper.WarningHandler WARNING_HANDLER =
177+
new SqlExceptionHelper.WarningHandlerLoggingSupport() {
178+
public boolean doProcess() {
179+
return log.isDebugEnabled();
180+
}
180181

181-
public void prepare(SQLWarning warning) {
182-
log.warningsCreatingTempTable( warning );
183-
}
182+
public void prepare(SQLWarning warning) {
183+
log.warningsCreatingTempTable( warning );
184+
}
184185

185-
@Override
186-
protected void logWarning(String description, String message) {
187-
log.debug( description );
188-
log.debug( message );
189-
}
190-
};
186+
@Override
187+
protected void logWarning(String description, String message) {
188+
log.debug( description );
189+
log.debug( message );
190+
}
191+
};
191192

192193

193194
private static void logStatement(String sql, JdbcServices jdbcServices) {

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

+70-67
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535

3636
import org.jboss.logging.Logger;
3737

38+
import static org.hibernate.cfg.MappingSettings.DEFAULT_CATALOG;
39+
import static org.hibernate.cfg.MappingSettings.DEFAULT_SCHEMA;
40+
import static org.hibernate.engine.config.spi.StandardConverters.STRING;
3841
import static org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl.makeLobCreatorBuilder;
3942

4043
/**
@@ -70,75 +73,74 @@ public static boolean isMultiTenancyEnabled(ServiceRegistry serviceRegistry) {
7073
public JdbcEnvironmentImpl(final ServiceRegistryImplementor serviceRegistry, final Dialect dialect) {
7174
this.dialect = dialect;
7275

73-
this.sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
76+
sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
7477

75-
final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class );
78+
final ConfigurationService cfgService = configurationService( serviceRegistry );
7679

77-
NameQualifierSupport nameQualifierSupport = dialect.getNameQualifierSupport();
78-
if ( nameQualifierSupport == null ) {
79-
// assume both catalogs and schemas are supported
80-
nameQualifierSupport = NameQualifierSupport.BOTH;
81-
}
82-
this.nameQualifierSupport = nameQualifierSupport;
80+
final NameQualifierSupport dialectNameQualifierSupport = dialect.getNameQualifierSupport();
81+
nameQualifierSupport =
82+
dialectNameQualifierSupport == null
83+
? NameQualifierSupport.BOTH // assume both catalogs and schemas are supported
84+
: dialectNameQualifierSupport;
8385

84-
this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, logWarnings( cfgService, dialect ) );
86+
sqlExceptionHelper =
87+
buildSqlExceptionHelper( dialect,
88+
logWarnings( cfgService, dialect ),
89+
logErrors( cfgService ) );
8590

8691
final IdentifierHelperBuilder identifierHelperBuilder =
8792
identifierHelperBuilder( cfgService, nameQualifierSupport );
8893

8994
final ExtractedDatabaseMetaDataImpl.Builder metaDataBuilder =
9095
new ExtractedDatabaseMetaDataImpl.Builder( this, false, null );
9196

92-
this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, metaDataBuilder );
97+
identifierHelper = identifierHelper( dialect, identifierHelperBuilder, metaDataBuilder );
9398

94-
this.extractedMetaDataSupport = metaDataBuilder.build();
99+
extractedMetaDataSupport = metaDataBuilder.build();
95100

96-
this.currentCatalog = identifierHelper.toIdentifier(
97-
cfgService.getSetting( AvailableSettings.DEFAULT_CATALOG, StandardConverters.STRING )
98-
);
99-
this.currentSchema = Identifier.toIdentifier(
100-
cfgService.getSetting( AvailableSettings.DEFAULT_SCHEMA, StandardConverters.STRING )
101-
);
101+
currentCatalog = identifierHelper.toIdentifier( cfgService.getSetting( DEFAULT_CATALOG, STRING ) );
102+
currentSchema = Identifier.toIdentifier( cfgService.getSetting( DEFAULT_SCHEMA, STRING ) );
102103

103-
this.qualifiedObjectNameFormatter = new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport );
104+
qualifiedObjectNameFormatter = new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport );
105+
106+
lobCreatorBuilder = makeLobCreatorBuilder( dialect );
107+
}
104108

105-
this.lobCreatorBuilder = makeLobCreatorBuilder( dialect );
109+
private static ConfigurationService configurationService(ServiceRegistryImplementor serviceRegistry) {
110+
return serviceRegistry.requireService( ConfigurationService.class );
106111
}
107112

108113
private IdentifierHelperBuilder identifierHelperBuilder(
109114
ConfigurationService cfgService, NameQualifierSupport nameQualifierSupport) {
110-
final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this );
111-
identifierHelperBuilder.setGloballyQuoteIdentifiers( globalQuoting( cfgService ) );
112-
identifierHelperBuilder.setSkipGlobalQuotingForColumnDefinitions( globalQuotingSkippedForColumnDefinitions(
113-
cfgService ) );
114-
identifierHelperBuilder.setAutoQuoteKeywords( autoKeywordQuoting( cfgService ) );
115-
identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport );
116-
return identifierHelperBuilder;
115+
final IdentifierHelperBuilder builder = IdentifierHelperBuilder.from( this );
116+
builder.setGloballyQuoteIdentifiers( globalQuoting( cfgService ) );
117+
builder.setSkipGlobalQuotingForColumnDefinitions( globalQuotingSkippedForColumnDefinitions( cfgService ) );
118+
builder.setAutoQuoteKeywords( autoKeywordQuoting( cfgService ) );
119+
builder.setNameQualifierSupport( nameQualifierSupport );
120+
return builder;
117121
}
118122

119123
private static IdentifierHelper identifierHelper(
120124
Dialect dialect,
121-
IdentifierHelperBuilder identifierHelperBuilder,
125+
IdentifierHelperBuilder builder,
122126
ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder) {
123127
try {
124-
final IdentifierHelper identifierHelper = dialect.buildIdentifierHelper( identifierHelperBuilder, null );
128+
final IdentifierHelper helper = dialect.buildIdentifierHelper( builder, null );
125129
dbMetaDataBuilder.setSupportsNamedParameters( dialect.supportsNamedParameters( null ) );
126-
if ( identifierHelper != null ) {
127-
return identifierHelper;
130+
if ( helper != null ) {
131+
return helper;
128132
}
129133
}
130134
catch (SQLException sqle) {
131135
// should never ever happen
132136
log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle );
133137
}
134-
return identifierHelperBuilder.build();
138+
return builder.build();
135139
}
136140

137141
private static SqlAstTranslatorFactory resolveSqlAstTranslatorFactory(Dialect dialect) {
138142
final SqlAstTranslatorFactory sqlAstTranslatorFactory = dialect.getSqlAstTranslatorFactory();
139-
return sqlAstTranslatorFactory != null
140-
? sqlAstTranslatorFactory
141-
: new StandardSqlAstTranslatorFactory();
143+
return sqlAstTranslatorFactory == null ? new StandardSqlAstTranslatorFactory() : sqlAstTranslatorFactory;
142144
}
143145

144146
private static boolean logWarnings(ConfigurationService cfgService, Dialect dialect) {
@@ -149,6 +151,14 @@ private static boolean logWarnings(ConfigurationService cfgService, Dialect dial
149151
);
150152
}
151153

154+
private static boolean logErrors(ConfigurationService cfgService) {
155+
return cfgService.getSetting(
156+
AvailableSettings.LOG_JDBC_ERRORS,
157+
StandardConverters.BOOLEAN,
158+
true
159+
);
160+
}
161+
152162
private static boolean globalQuoting(ConfigurationService cfgService) {
153163
return cfgService.getSetting(
154164
AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS,
@@ -182,29 +192,27 @@ public JdbcEnvironmentImpl(
182192
JdbcConnectionAccess jdbcConnectionAccess) throws SQLException {
183193
this.dialect = dialect;
184194

185-
this.sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
195+
sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
186196

187-
this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, false );
197+
sqlExceptionHelper = buildSqlExceptionHelper( dialect, false, true );
188198

189-
this.nameQualifierSupport = nameQualifierSupport( databaseMetaData, dialect );
199+
nameQualifierSupport = nameQualifierSupport( databaseMetaData, dialect );
190200

191-
this.identifierHelper = identifierHelper( databaseMetaData, dialect );
201+
identifierHelper = identifierHelper( databaseMetaData, dialect );
192202

193-
this.extractedMetaDataSupport =
203+
extractedMetaDataSupport =
194204
new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess )
195205
.apply( databaseMetaData )
196206
.setSupportsNamedParameters( databaseMetaData.supportsNamedParameters() )
197207
.build();
198208

199-
this.currentCatalog = null;
200-
this.currentSchema = null;
209+
currentCatalog = null;
210+
currentSchema = null;
201211

202-
this.qualifiedObjectNameFormatter = new QualifiedObjectNameFormatterStandardImpl(
203-
nameQualifierSupport,
204-
databaseMetaData
205-
);
212+
qualifiedObjectNameFormatter =
213+
new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport, databaseMetaData );
206214

207-
this.lobCreatorBuilder = makeLobCreatorBuilder( dialect );
215+
lobCreatorBuilder = makeLobCreatorBuilder( dialect );
208216
}
209217

210218
private IdentifierHelper identifierHelper(DatabaseMetaData databaseMetaData, Dialect dialect) {
@@ -278,41 +286,36 @@ public JdbcEnvironmentImpl(
278286
JdbcConnectionAccess jdbcConnectionAccess) throws SQLException {
279287
this.dialect = dialect;
280288

281-
this.sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
289+
sqlAstTranslatorFactory = resolveSqlAstTranslatorFactory( dialect );
282290

283-
final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class );
291+
final ConfigurationService cfgService = configurationService( serviceRegistry );
284292

285-
this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, logWarnings( cfgService, dialect ) );
293+
sqlExceptionHelper =
294+
buildSqlExceptionHelper( dialect,
295+
logWarnings( cfgService, dialect ),
296+
logErrors( cfgService ) );
286297

287-
NameQualifierSupport nameQualifierSupport = nameQualifierSupport( databaseMetaData,
288-
dialect );
289-
this.nameQualifierSupport = nameQualifierSupport;
298+
nameQualifierSupport = nameQualifierSupport( databaseMetaData, dialect );
290299

291300
final IdentifierHelperBuilder identifierHelperBuilder =
292301
identifierHelperBuilder( cfgService, nameQualifierSupport );
293-
this.identifierHelper = identifierHelper( dialect, databaseMetaData, identifierHelperBuilder );
302+
identifierHelper = identifierHelper( dialect, databaseMetaData, identifierHelperBuilder );
294303

295-
this.extractedMetaDataSupport =
304+
extractedMetaDataSupport =
296305
new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess )
297306
.apply( databaseMetaData )
298307
.setConnectionSchemaName( determineCurrentSchemaName( databaseMetaData, serviceRegistry, dialect ) )
299308
.setSupportsNamedParameters( dialect.supportsNamedParameters( databaseMetaData ) )
300309
.build();
301310

302311
// and that current-catalog and current-schema happen after it
303-
this.currentCatalog = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionCatalogName() );
304-
this.currentSchema = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionSchemaName() );
312+
currentCatalog = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionCatalogName() );
313+
currentSchema = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionSchemaName() );
305314

306-
this.qualifiedObjectNameFormatter = new QualifiedObjectNameFormatterStandardImpl(
307-
nameQualifierSupport,
308-
databaseMetaData
309-
);
315+
qualifiedObjectNameFormatter =
316+
new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport, databaseMetaData );
310317

311-
this.lobCreatorBuilder = LobCreatorBuilderImpl.makeLobCreatorBuilder(
312-
dialect,
313-
cfgService.getSettings(),
314-
databaseMetaData.getConnection()
315-
);
318+
lobCreatorBuilder = makeLobCreatorBuilder( dialect, cfgService.getSettings(), databaseMetaData.getConnection() );
316319
}
317320

318321
private static IdentifierHelper identifierHelper(
@@ -358,12 +361,12 @@ private static SchemaNameResolver getSchemaNameResolver(ServiceRegistry serviceR
358361
dialect.getSchemaNameResolver() );
359362
}
360363

361-
private static SqlExceptionHelper buildSqlExceptionHelper(Dialect dialect, boolean logWarnings) {
364+
private static SqlExceptionHelper buildSqlExceptionHelper(Dialect dialect, boolean logWarnings, boolean logErrors) {
362365
final SQLExceptionConversionDelegate dialectDelegate = dialect.buildSQLExceptionConversionDelegate();
363366
final SQLExceptionConversionDelegate[] delegates = dialectDelegate == null
364367
? new SQLExceptionConversionDelegate[] { new SQLExceptionTypeDelegate( dialect ), new SQLStateConversionDelegate( dialect ) }
365368
: new SQLExceptionConversionDelegate[] { dialectDelegate, new SQLExceptionTypeDelegate( dialect ), new SQLStateConversionDelegate( dialect ) };
366-
return new SqlExceptionHelper( new StandardSQLExceptionConverter( delegates ), logWarnings );
369+
return new SqlExceptionHelper( new StandardSQLExceptionConverter( delegates ), logWarnings, logErrors );
367370
}
368371

369372
@Override

0 commit comments

Comments
 (0)