Skip to content

Commit 164cbf0

Browse files
committed
HHH-18313 NullPointerException because JdbcIsolationDelegate.sqlExceptionHelper() returns null
1 parent 63171d3 commit 164cbf0

File tree

9 files changed

+52
-21
lines changed

9 files changed

+52
-21
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl;
2929
import org.hibernate.engine.jdbc.internal.JdbcServicesImpl;
3030
import org.hibernate.engine.jdbc.spi.JdbcServices;
31+
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
3132
import org.hibernate.engine.spi.SessionFactoryImplementor;
3233
import org.hibernate.event.internal.EmptyEventManager;
3334
import org.hibernate.event.spi.EventManager;
@@ -278,6 +279,7 @@ private JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata(
278279
final TemporaryJdbcSessionOwner temporaryJdbcSessionOwner = new TemporaryJdbcSessionOwner(
279280
jdbcConnectionAccess,
280281
jdbcServices,
282+
new SqlExceptionHelper( false ),
281283
registry
282284
);
283285
temporaryJdbcSessionOwner.transactionCoordinator = registry.requireService( TransactionCoordinatorBuilder.class )
@@ -586,16 +588,19 @@ private static class TemporaryJdbcSessionOwner implements JdbcSessionOwner, Jdbc
586588
private final boolean connectionProviderDisablesAutoCommit;
587589
private final PhysicalConnectionHandlingMode connectionHandlingMode;
588590
private final JpaCompliance jpaCompliance;
591+
private final SqlExceptionHelper sqlExceptionHelper;
589592
private static final EmptyJdbcObserver EMPTY_JDBC_OBSERVER = EmptyJdbcObserver.INSTANCE;
590593
TransactionCoordinator transactionCoordinator;
591594
private final EmptyEventManager eventManager;
592595

593596
public TemporaryJdbcSessionOwner(
594597
JdbcConnectionAccess jdbcConnectionAccess,
595598
JdbcServices jdbcServices,
599+
SqlExceptionHelper sqlExceptionHelper,
596600
ServiceRegistryImplementor serviceRegistry) {
597601
this.jdbcConnectionAccess = jdbcConnectionAccess;
598602
this.jdbcServices = jdbcServices;
603+
this.sqlExceptionHelper = sqlExceptionHelper;
599604
this.serviceRegistry = serviceRegistry;
600605
final ConfigurationService configuration = serviceRegistry.requireService( ConfigurationService.class );
601606
this.jtaTrackByThread = configuration.getSetting( JTA_TRACK_BY_THREAD, BOOLEAN, true );
@@ -749,6 +754,11 @@ public boolean isActive() {
749754
return true;
750755
}
751756

757+
@Override
758+
public SqlExceptionHelper getSqlExceptionHelper() {
759+
return sqlExceptionHelper;
760+
}
761+
752762
private static class EmptyJdbcObserver implements JdbcObserver{
753763

754764
public static final EmptyJdbcObserver INSTANCE = new EmptyJdbcObserver();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public JdbcCoordinatorImpl(
9292
this.logicalConnection = new LogicalConnectionManagedImpl(
9393
owner.getJdbcConnectionAccess(),
9494
owner.getJdbcSessionContext(),
95-
resourceRegistry,
96-
jdbcServices
95+
owner.getSqlExceptionHelper(),
96+
resourceRegistry
9797
);
9898
}
9999
this.owner = owner;

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,20 @@ public ParameterMarkerStrategy getParameterMarkerStrategy() {
8484

8585
@Override
8686
public SqlExceptionHelper getSqlExceptionHelper() {
87-
if ( jdbcEnvironment != null ) {
88-
return jdbcEnvironment.getSqlExceptionHelper();
89-
}
90-
return null;
87+
assert jdbcEnvironment != null : "JdbcEnvironment was not found";
88+
return jdbcEnvironment.getSqlExceptionHelper();
9189
}
9290

9391
@Override
9492
public ExtractedDatabaseMetaData getExtractedMetaDataSupport() {
95-
if ( jdbcEnvironment != null ) {
96-
return jdbcEnvironment.getExtractedDatabaseMetaData();
97-
}
98-
return null;
93+
assert jdbcEnvironment != null : "JdbcEnvironment was not found";
94+
return jdbcEnvironment.getExtractedDatabaseMetaData();
9995
}
10096

10197
@Override
10298
public LobCreator getLobCreator(LobCreationContext lobCreationContext) {
103-
if ( jdbcEnvironment != null ) {
104-
return jdbcEnvironment.getLobCreatorBuilder().buildLobCreator( lobCreationContext );
105-
}
106-
return null;
99+
assert jdbcEnvironment != null : "JdbcEnvironment was not found";
100+
return jdbcEnvironment.getLobCreatorBuilder().buildLobCreator( lobCreationContext );
107101
}
108102

109103
}

hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public class LogicalConnectionManagedImpl extends AbstractLogicalConnectionImple
5454
public LogicalConnectionManagedImpl(
5555
JdbcConnectionAccess jdbcConnectionAccess,
5656
JdbcSessionContext jdbcSessionContext,
57-
ResourceRegistry resourceRegistry,
58-
JdbcServices jdbcServices) {
57+
SqlExceptionHelper sqlExceptionHelper,
58+
ResourceRegistry resourceRegistry) {
5959
this.jdbcConnectionAccess = jdbcConnectionAccess;
6060
this.observer = jdbcSessionContext.getObserver();
6161
this.resourceRegistry = resourceRegistry;
@@ -64,7 +64,7 @@ public LogicalConnectionManagedImpl(
6464
jdbcSessionContext.getPhysicalConnectionHandlingMode(),
6565
jdbcConnectionAccess );
6666

67-
this.sqlExceptionHelper = jdbcServices.getSqlExceptionHelper();
67+
this.sqlExceptionHelper = sqlExceptionHelper;
6868

6969
if ( connectionHandlingMode.getAcquisitionMode() == IMMEDIATELY ) {
7070
acquireConnectionIfNeeded();
@@ -82,6 +82,19 @@ public LogicalConnectionManagedImpl(
8282
}
8383
}
8484

85+
public LogicalConnectionManagedImpl(
86+
JdbcConnectionAccess jdbcConnectionAccess,
87+
JdbcSessionContext jdbcSessionContext,
88+
ResourceRegistry resourceRegistry,
89+
JdbcServices jdbcServices) {
90+
this(
91+
jdbcConnectionAccess,
92+
jdbcSessionContext,
93+
jdbcServices.getSqlExceptionHelper(),
94+
resourceRegistry
95+
);
96+
}
97+
8598
private PhysicalConnectionHandlingMode determineConnectionHandlingMode(
8699
PhysicalConnectionHandlingMode connectionHandlingMode,
87100
JdbcConnectionAccess jdbcConnectionAccess) {

hibernate-core/src/main/java/org/hibernate/resource/jdbc/spi/JdbcSessionOwner.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.hibernate.resource.jdbc.spi;
88

99
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
10+
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
1011
import org.hibernate.event.spi.EventManager;
1112
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
1213

@@ -72,4 +73,8 @@ public interface JdbcSessionOwner {
7273
Integer getJdbcBatchSize();
7374

7475
EventManager getEventManager();
76+
77+
default SqlExceptionHelper getSqlExceptionHelper() {
78+
return getJdbcSessionContext().getJdbcServices().getSqlExceptionHelper();
79+
}
7580
}

hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcIsolationDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public JdbcIsolationDelegate(TransactionCoordinatorOwner transactionCoordinatorO
3737
public JdbcIsolationDelegate(JdbcSessionOwner jdbcSessionOwner) {
3838
this(
3939
jdbcSessionOwner.getJdbcConnectionAccess(),
40-
jdbcSessionOwner.getJdbcSessionContext().getJdbcServices().getSqlExceptionHelper()
40+
jdbcSessionOwner.getSqlExceptionHelper()
4141
);
4242
}
4343

hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaIsolationDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public JtaIsolationDelegate(TransactionCoordinatorOwner transactionCoordinatorOw
5050
public JtaIsolationDelegate(JdbcSessionOwner jdbcSessionOwner, TransactionManager transactionManager) {
5151
this(
5252
jdbcSessionOwner.getJdbcConnectionAccess(),
53-
jdbcSessionOwner.getJdbcSessionContext().getJdbcServices().getSqlExceptionHelper(),
53+
jdbcSessionOwner.getSqlExceptionHelper(),
5454
transactionManager
5555
);
5656
}

hibernate-core/src/test/java/org/hibernate/orm/test/connection/ConnectionCreatorTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.sql.Connection;
1010
import java.sql.Driver;
1111
import java.util.Collections;
12+
import java.util.HashMap;
1213
import java.util.List;
1314
import java.util.Map;
1415
import java.util.Properties;
@@ -17,7 +18,10 @@
1718
import org.hibernate.boot.registry.StandardServiceInitiator;
1819
import org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl;
1920
import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
21+
import org.hibernate.dialect.H2Dialect;
2022
import org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator;
23+
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl;
24+
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
2125
import org.hibernate.engine.jdbc.internal.JdbcServicesImpl;
2226
import org.hibernate.engine.jdbc.spi.JdbcServices;
2327
import org.hibernate.exception.JDBCConnectionException;
@@ -75,7 +79,12 @@ private CCTStandardServiceRegistryImpl(
7579
public <R extends Service> R getService(Class<R> serviceRole) {
7680
if ( JdbcServices.class.equals( serviceRole ) ) {
7781
// return a new, not fully initialized JdbcServicesImpl
78-
return (R) new JdbcServicesImpl();
82+
JdbcServicesImpl jdbcServices = new JdbcServicesImpl(this);
83+
jdbcServices.configure( new HashMap<>() );
84+
return (R) jdbcServices;
85+
}
86+
if( JdbcEnvironment.class.equals( serviceRole ) ){
87+
return (R) new JdbcEnvironmentImpl( this, new H2Dialect() );
7988
}
8089
return super.getService( serviceRole );
8190
}

hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/JdbcCoordinatorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void testConnectionClose()
7979
SqlExceptionHelper sqlExceptionHelper = Mockito.mock( SqlExceptionHelper.class );
8080
when( jdbcServices.getSqlExceptionHelper() ).thenReturn(
8181
sqlExceptionHelper );
82-
82+
when(sessionOwner.getSqlExceptionHelper()).thenReturn( sqlExceptionHelper );
8383
JdbcCoordinatorImpl jdbcCoordinator = new JdbcCoordinatorImpl(
8484
null,
8585
sessionOwner,

0 commit comments

Comments
 (0)