Skip to content

Commit 879dca2

Browse files
committed
properly validate transaction isolation level
1 parent baa98e9 commit 879dca2

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import org.hibernate.boot.registry.StandardServiceInitiator;
1818
import org.hibernate.boot.registry.selector.spi.StrategySelector;
1919
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
20+
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
2021
import org.hibernate.internal.CoreLogging;
2122
import org.hibernate.internal.CoreMessageLogger;
22-
import org.hibernate.internal.util.StringHelper;
2323
import org.hibernate.resource.beans.container.spi.BeanContainer;
2424
import org.hibernate.resource.beans.internal.Helper;
2525
import org.hibernate.service.spi.ServiceRegistryImplementor;
@@ -43,6 +43,7 @@
4343
import static org.hibernate.cfg.JdbcSettings.USER;
4444
import static org.hibernate.cfg.SchemaToolingSettings.ENABLE_SYNONYMS;
4545
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.isMultiTenancyEnabled;
46+
import static org.hibernate.internal.util.StringHelper.isBlank;
4647
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
4748

4849
/**
@@ -325,29 +326,38 @@ public static Integer interpretIsolation(Object setting) {
325326
return null;
326327
}
327328
else if ( setting instanceof Number number ) {
328-
return number.intValue();
329+
final int isolationLevel = number.intValue();
330+
checkIsolationLevel( isolationLevel );
331+
return isolationLevel;
329332
}
330333
else {
331334
final String string = setting.toString();
332-
if ( StringHelper.isEmpty( string ) ) {
335+
if ( isBlank( string ) ) {
333336
return null;
334337
}
335338
else if ( ISOLATION_VALUE_MAP.containsKey( string ) ) {
336339
return ISOLATION_VALUE_MAP.get( string );
337340
}
338341
else {
339-
// it could be a String representation of the isolation numeric value...
342+
// it could be a String representation of the isolation numeric value
340343
try {
341-
return Integer.valueOf( string );
344+
final int isolationLevel = Integer.parseInt( string );
345+
checkIsolationLevel( isolationLevel );
346+
return isolationLevel;
342347
}
343348
catch (NumberFormatException ignore) {
349+
throw new ConnectionProviderConfigurationException( "Unknown transaction isolation level: '" + string + "'" );
344350
}
345-
346-
throw new HibernateException("Could not interpret transaction isolation setting [" + setting + "]");
347351
}
348352
}
349353
}
350354

355+
private static void checkIsolationLevel(int isolationLevel) {
356+
if ( !ISOLATION_VALUE_CONSTANT_NAME_MAP.containsKey( isolationLevel ) ) {
357+
throw new ConnectionProviderConfigurationException( "Unknown transaction isolation level: " + isolationLevel );
358+
}
359+
}
360+
351361
/**
352362
* Gets the {@link Connection} constant name corresponding to the given isolation.
353363
*

0 commit comments

Comments
 (0)