Skip to content

Commit f057c80

Browse files
committed
work on the new session builder infrastructure
some stuff was not quite complete
1 parent dfe0db7 commit f057c80

11 files changed

+114
-43
lines changed

hibernate-core/src/main/java/org/hibernate/Session.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,14 +1415,6 @@ public interface Session extends SharedSessionContract, EntityManager {
14151415
@Incubating
14161416
<E> Collection<E> getManagedEntities(EntityType<E> entityType);
14171417

1418-
/**
1419-
* Obtain a {@link Session} builder with the ability to copy certain
1420-
* information from this session.
1421-
*
1422-
* @return the session builder
1423-
*/
1424-
SharedSessionBuilder sessionWithOptions();
1425-
14261418
/**
14271419
* Add one or more listeners to the Session
14281420
*

hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ public interface SharedSessionContract extends QueryProducer, AutoCloseable, Ser
3838
@Incubating
3939
SharedStatelessSessionBuilder statelessWithOptions();
4040

41+
/**
42+
* Obtain a {@link Session} builder with the ability to copy certain
43+
* information from this session.
44+
*
45+
* @return the session builder
46+
*/
47+
SharedSessionBuilder sessionWithOptions();
48+
4149
/**
4250
* Obtain the tenant identifier associated with this session, as a string.
4351
*

hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SharedSessionBuilderImpl.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.hibernate.engine.creation.spi.SharedSessionBuilderImplementor;
1616
import org.hibernate.engine.internal.TransactionCompletionCallbacksImpl;
1717
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
18+
import org.hibernate.engine.spi.SessionImplementor;
19+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1820
import org.hibernate.internal.SessionFactoryImpl;
1921
import org.hibernate.internal.SessionImpl;
2022
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
@@ -31,13 +33,13 @@
3133
public class SharedSessionBuilderImpl
3234
extends SessionBuilderImpl
3335
implements SharedSessionBuilderImplementor, SharedSessionCreationOptions {
34-
private final SessionImpl session;
36+
private final SharedSessionContractImplementor session;
3537

3638
private boolean shareTransactionContext;
3739
private boolean tenantIdChanged;
3840
private boolean readOnlyChanged;
3941

40-
public SharedSessionBuilderImpl(SessionImpl session) {
42+
public SharedSessionBuilderImpl(SharedSessionContractImplementor session) {
4143
super( (SessionFactoryImpl) session.getFactory() );
4244
this.session = session;
4345
super.tenantIdentifier( session.getTenantIdentifierValue() );
@@ -151,7 +153,8 @@ public SharedSessionBuilderImplementor flushMode() {
151153

152154
@Override
153155
public SharedSessionBuilderImplementor autoClose() {
154-
autoClose( session.isAutoCloseSessionEnabled() );
156+
autoClose( session instanceof SessionImplementor statefulSession
157+
&& statefulSession.isAutoCloseSessionEnabled() );
155158
return this;
156159
}
157160

@@ -259,23 +262,30 @@ public boolean isTransactionCoordinatorShared() {
259262

260263
@Override
261264
public TransactionCoordinator getTransactionCoordinator() {
262-
return shareTransactionContext ? session.getTransactionCoordinator() : null;
265+
return shareTransactionContext
266+
? session.getTransactionCoordinator()
267+
: null;
263268
}
264269

265270
@Override
266271
public JdbcCoordinator getJdbcCoordinator() {
267-
return shareTransactionContext ? session.getJdbcCoordinator() : null;
272+
return shareTransactionContext
273+
? session.getJdbcCoordinator()
274+
: null;
268275
}
269276

270277
@Override
271278
public Transaction getTransaction() {
272-
return shareTransactionContext ? session.getCurrentTransaction() : null;
279+
return shareTransactionContext
280+
? session.getCurrentTransaction()
281+
: null;
273282
}
274283

275284
@Override
276285
public TransactionCompletionCallbacksImpl getTransactionCompletionCallbacks() {
277286
return shareTransactionContext
278-
? session.getActionQueue().getTransactionCompletionCallbacks()
287+
&& session instanceof SessionImplementor statefulSession
288+
? statefulSession.getActionQueue().getTransactionCompletionCallbacks()
279289
: null;
280290
}
281291
}

hibernate-core/src/main/java/org/hibernate/engine/creation/internal/SharedStatelessSessionBuilderImpl.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.hibernate.Interceptor;
99
import org.hibernate.SessionException;
1010
import org.hibernate.SharedStatelessSessionBuilder;
11+
import org.hibernate.Transaction;
1112
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1213
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1314
import org.hibernate.engine.spi.StatelessSessionImplementor;
@@ -36,10 +37,10 @@ public class SharedStatelessSessionBuilderImpl
3637
public SharedStatelessSessionBuilderImpl(SharedSessionContractImplementor original) {
3738
super( (SessionFactoryImpl) original.getSessionFactory() );
3839
this.original = original;
39-
40-
this.tenantIdentifier = original.getTenantIdentifierValue();
41-
this.interceptor = original.getSessionFactory().getSessionFactoryOptions().getInterceptor();
42-
this.statementInspector = original.getSessionFactory().getSessionFactoryOptions().getStatementInspector();
40+
tenantIdentifier = original.getTenantIdentifierValue();
41+
final var options = original.getSessionFactory().getSessionFactoryOptions();
42+
interceptor = options.getInterceptor();
43+
statementInspector = options.getStatementInspector();
4344
}
4445

4546
@Override
@@ -54,8 +55,9 @@ protected SharedStatelessSessionBuilder getThis() {
5455
public StatelessSessionImplementor open() {
5556
if ( original.getSessionFactory().getSessionFactoryOptions().isMultiTenancyEnabled() ) {
5657
if ( shareTransactionContext ) {
57-
assert original.getTenantIdentifierValue() != null;
58-
if ( Objects.equals( original.getTenantIdentifierValue(), tenantIdentifier ) ) {
58+
final var tenantId = original.getTenantIdentifierValue();
59+
assert tenantId != null;
60+
if ( Objects.equals( tenantId, tenantIdentifier ) ) {
5961
throw new SessionException( "Cannot redefine the tenant identifier on a child session if the connection is reused" );
6062
}
6163
}
@@ -117,15 +119,22 @@ public boolean isTransactionCoordinatorShared() {
117119

118120
@Override
119121
public TransactionCoordinator getTransactionCoordinator() {
120-
return isTransactionCoordinatorShared()
122+
return shareTransactionContext
121123
? original.getTransactionCoordinator()
122124
: null;
123125
}
124126

125127
@Override
126128
public JdbcCoordinator getJdbcCoordinator() {
127-
return isTransactionCoordinatorShared()
129+
return shareTransactionContext
128130
? original.getJdbcCoordinator()
129131
: null;
130132
}
133+
134+
@Override
135+
public Transaction getTransaction() {
136+
return shareTransactionContext
137+
? original.getTransaction()
138+
: null;
139+
}
131140
}

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,11 @@ public boolean shouldAutoJoinTransaction() {
386386
return delegate.shouldAutoJoinTransaction();
387387
}
388388

389+
@Override
390+
public boolean isAutoCloseSessionEnabled() {
391+
return delegate.isAutoCloseSessionEnabled();
392+
}
393+
389394
@Override
390395
public LoadQueryInfluencers getLoadQueryInfluencers() {
391396
return delegate.getLoadQueryInfluencers();
@@ -432,6 +437,11 @@ public Transaction accessTransaction() {
432437
return delegate.accessTransaction();
433438
}
434439

440+
@Override
441+
public Transaction getCurrentTransaction() {
442+
return delegate.getCurrentTransaction();
443+
}
444+
435445
@Override
436446
public Transaction beginTransaction() {
437447
return delegate.beginTransaction();

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionImplementor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ default TransactionCompletionCallbacks getTransactionCompletionCallbacks() {
7878
return getActionQueue();
7979
}
8080

81+
/**
82+
* Should this session be automatically closed after the current
83+
* transaction completes?
84+
*/
85+
boolean isAutoCloseSessionEnabled();
86+
8187
@Override
8288
Object instantiate(EntityPersister persister, Object id) throws HibernateException;
8389

hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionContractImplementor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,15 @@ default void checkTransactionNeededForUpdateOperation(String exceptionMessage) {
246246
*/
247247
Transaction accessTransaction();
248248

249+
/**
250+
* The current {@link Transaction} object associated with this session,
251+
* if it has already been created, or {@code null} otherwise.
252+
*
253+
* @since 7.2
254+
*/
255+
@Incubating
256+
Transaction getCurrentTransaction();
257+
249258
/**
250259
* Access to register callbacks for transaction completion processing.
251260
*

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.Interceptor;
2020
import org.hibernate.LockMode;
2121
import org.hibernate.SessionException;
22+
import org.hibernate.SharedSessionBuilder;
2223
import org.hibernate.SharedStatelessSessionBuilder;
2324
import org.hibernate.Transaction;
2425
import org.hibernate.UnknownEntityTypeException;
@@ -28,6 +29,7 @@
2829
import org.hibernate.cache.spi.CacheTransactionSynchronization;
2930
import org.hibernate.dialect.Dialect;
3031
import org.hibernate.engine.creation.internal.SessionCreationOptions;
32+
import org.hibernate.engine.creation.internal.SharedSessionBuilderImpl;
3133
import org.hibernate.engine.creation.internal.SharedSessionCreationOptions;
3234
import org.hibernate.engine.creation.internal.SharedStatelessSessionBuilderImpl;
3335
import org.hibernate.engine.internal.SessionEventListenerManagerImpl;
@@ -205,9 +207,9 @@ public AbstractSharedSessionContract(SessionFactoryImpl factory, SessionCreation
205207

206208
final var statementInspector = interpret( options.getStatementInspector() );
207209

208-
isTransactionCoordinatorShared = isTransactionCoordinatorShared( options );
209-
if ( isTransactionCoordinatorShared ) {
210-
final var sharedOptions = (SharedSessionCreationOptions) options;
210+
if ( options instanceof SharedSessionCreationOptions sharedOptions
211+
&& sharedOptions.isTransactionCoordinatorShared() ) {
212+
isTransactionCoordinatorShared = true;
211213
if ( options.getConnection() != null ) {
212214
throw new SessionException( "Cannot simultaneously share transaction context and specify connection" );
213215
}
@@ -222,6 +224,7 @@ public AbstractSharedSessionContract(SessionFactoryImpl factory, SessionCreation
222224
addSharedSessionTransactionObserver( transactionCoordinator );
223225
}
224226
else {
227+
isTransactionCoordinatorShared = false;
225228
autoJoinTransactions = options.shouldAutoJoinTransactions();
226229
connectionHandlingMode = options.getPhysicalConnectionHandlingMode();
227230
jdbcSessionContext = createJdbcSessionContext( statementInspector );
@@ -242,9 +245,9 @@ public SharedStatelessSessionBuilder statelessWithOptions() {
242245
return new SharedStatelessSessionBuilderImpl( this );
243246
}
244247

245-
private static boolean isTransactionCoordinatorShared(SessionCreationOptions options) {
246-
return options instanceof SharedSessionCreationOptions sharedSessionCreationOptions
247-
&& sharedSessionCreationOptions.isTransactionCoordinatorShared();
248+
@Override
249+
public SharedSessionBuilder sessionWithOptions() {
250+
return new SharedSessionBuilderImpl( this );
248251
}
249252

250253
protected final void setUpMultitenancy(SessionFactoryImplementor factory, LoadQueryInfluencers loadQueryInfluencers) {
@@ -686,6 +689,7 @@ protected void delayedAfterCompletion() {
686689
}
687690
}
688691

692+
@Override
689693
public Transaction getCurrentTransaction() {
690694
return currentHibernateTransaction;
691695
}

hibernate-core/src/main/java/org/hibernate/internal/CommonSharedSessionCreationOptions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.hibernate.CacheMode;
88
import org.hibernate.Interceptor;
9+
import org.hibernate.Transaction;
910
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1011
import org.hibernate.resource.jdbc.spi.StatementInspector;
1112
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
@@ -36,4 +37,5 @@ public interface CommonSharedSessionCreationOptions {
3637
boolean isTransactionCoordinatorShared();
3738
TransactionCoordinator getTransactionCoordinator();
3839
JdbcCoordinator getJdbcCoordinator();
40+
Transaction getTransaction();
3941
}

hibernate-core/src/main/java/org/hibernate/internal/SessionCreationOptionsAdaptor.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,23 @@
44
import org.hibernate.FlushMode;
55
import org.hibernate.Interceptor;
66
import org.hibernate.SessionEventListener;
7+
import org.hibernate.Transaction;
78
import org.hibernate.engine.creation.internal.SessionCreationOptions;
9+
import org.hibernate.engine.creation.internal.SharedSessionCreationOptions;
10+
import org.hibernate.engine.internal.TransactionCompletionCallbacksImpl;
11+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
812
import org.hibernate.engine.spi.SessionFactoryImplementor;
913
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
1014
import org.hibernate.resource.jdbc.spi.StatementInspector;
15+
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
1116

1217
import java.sql.Connection;
1318
import java.util.List;
1419
import java.util.TimeZone;
1520

1621
/**
1722
* Wraps a {@link CommonSharedSessionCreationOptions} as a
18-
* {@link SessionCreationOptions} to pass to
23+
* {@link SharedSessionCreationOptions} to pass to
1924
* {@link org.hibernate.internal.AbstractSharedSessionContract}
2025
* during construction.
2126
*
@@ -25,7 +30,7 @@
2530
public record SessionCreationOptionsAdaptor(
2631
SessionFactoryImplementor factory,
2732
CommonSharedSessionCreationOptions options)
28-
implements SessionCreationOptions {
33+
implements SharedSessionCreationOptions {
2934

3035
@Override
3136
public Interceptor getInterceptor() {
@@ -115,4 +120,29 @@ public TimeZone getJdbcTimeZone() {
115120
public List<SessionEventListener> getCustomSessionEventListener() {
116121
return null;
117122
}
123+
124+
@Override
125+
public boolean isTransactionCoordinatorShared() {
126+
return options.isTransactionCoordinatorShared();
127+
}
128+
129+
@Override
130+
public TransactionCoordinator getTransactionCoordinator() {
131+
return options.getTransactionCoordinator();
132+
}
133+
134+
@Override
135+
public JdbcCoordinator getJdbcCoordinator() {
136+
return options.getJdbcCoordinator();
137+
}
138+
139+
@Override
140+
public Transaction getTransaction() {
141+
return options.getTransaction();
142+
}
143+
144+
@Override
145+
public TransactionCompletionCallbacksImpl getTransactionCompletionCallbacks() {
146+
return null;
147+
}
118148
}

0 commit comments

Comments
 (0)