Skip to content

Commit 3c500c7

Browse files
committed
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
HHH-19782 - Oracle support for locking across joins
1 parent 6a145b0 commit 3c500c7

File tree

6 files changed

+173
-91
lines changed

6 files changed

+173
-91
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
3535
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
3636
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
37-
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
3837
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
38+
import org.hibernate.sql.exec.spi.JdbcSelect;
3939
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
4040
import org.hibernate.sql.results.graph.basic.BasicResult;
4141
import org.hibernate.sql.results.graph.internal.ImmutableFetchList;
@@ -157,7 +157,7 @@ public void lock(
157157
}
158158

159159
final SelectStatement selectStatement = new SelectStatement( rootQuerySpec, List.of( idResult ) );
160-
final JdbcOperationQuerySelect selectOperation = session
160+
final JdbcSelect selectOperation = session
161161
.getDialect()
162162
.getSqlAstTranslatorFactory()
163163
.buildSelectTranslator( factory, selectStatement )

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
7373
import org.hibernate.sql.ast.SqlAstTranslator;
7474
import org.hibernate.sql.ast.SqlTreeCreationException;
75-
import org.hibernate.sql.ast.internal.LockTimeoutHandler;
75+
import org.hibernate.sql.exec.internal.LockTimeoutHandler;
7676
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
7777
import org.hibernate.sql.ast.internal.TableGroupHelper;
7878
import org.hibernate.sql.ast.tree.AbstractUpdateOrDeleteStatement;
@@ -888,21 +888,15 @@ protected JdbcSelect translateSelect(SelectStatement selectStatement) {
888888
getLimitParameter()
889889
);
890890

891-
final boolean needsLockingActions = determineIfLockingActionsNeeded(
892-
lockOptions,
893-
lockingTarget,
894-
getDialect()
895-
);
896-
897-
if ( !needsLockingActions ) {
891+
if ( lockOptions == null || !lockOptions.getLockMode().isPessimistic() ) {
898892
return jdbcSelect;
899893
}
900894

901-
final JdbcSelectWithActions.Builder builder = new JdbcSelectWithActions.Builder( jdbcSelect );
902-
903895
final LockingSupport lockingSupport = getDialect().getLockingSupport();
904896
final LockingSupport.Metadata lockingSupportMetadata = lockingSupport.getMetadata();
905897

898+
final JdbcSelectWithActions.Builder builder = new JdbcSelectWithActions.Builder( jdbcSelect );
899+
906900
final LockTimeoutType lockTimeoutType = lockingSupportMetadata.getLockTimeoutType( lockOptions.getTimeout() );
907901
if ( lockTimeoutType == LockTimeoutType.CONNECTION ) {
908902
builder.addSecondaryActionPair( new LockTimeoutHandler(
@@ -911,38 +905,12 @@ protected JdbcSelect translateSelect(SelectStatement selectStatement) {
911905
) );
912906
}
913907

914-
applyFollowOnLockingActions(
915-
lockOptions,
916-
lockingTarget,
917-
lockingClauseStrategy,
918-
builder
919-
);
920-
921-
return builder.build();
922-
}
923-
924-
public boolean determineIfLockingActionsNeeded(
925-
LockOptions lockOptions,
926-
QuerySpec lockingTarget,
927-
Dialect dialect) {
928-
if ( lockOptions == null || !lockOptions.getLockMode().isPessimistic() ) {
929-
return false;
930-
}
931-
932-
final LockingSupport lockingSupport = dialect.getLockingSupport();
933-
final LockingSupport.Metadata lockingSupportMetadata = lockingSupport.getMetadata();
934-
935-
final LockTimeoutType lockTimeoutType = lockingSupportMetadata.getLockTimeoutType( lockOptions.getTimeout() );
936-
if ( lockTimeoutType == LockTimeoutType.CONNECTION ) {
937-
return true;
938-
}
939-
940908
final LockStrategy lockStrategy = determineLockingStrategy( lockingTarget, lockOptions.getFollowOnStrategy() );
941909
if ( lockStrategy == LockStrategy.FOLLOW_ON ) {
942-
return true;
910+
applyFollowOnLockingActions( lockOptions, lockingTarget, lockingClauseStrategy, builder );
943911
}
944912

945-
return false;
913+
return builder.build();
946914
}
947915

948916
private void applyFollowOnLockingActions(

hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectWithActions.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ public void performPostAction(boolean succeeded, StatementAccess jdbcStatementAc
111111
}
112112
}
113113
}
114-
loadedValuesCollector.clear();
114+
if ( loadedValuesCollector != null ) {
115+
loadedValuesCollector.clear();
116+
}
115117
}
116118

117119
@Override
@@ -164,9 +166,10 @@ public Builder setLoadedValuesCollector(LoadedValuesCollector loadedValuesCollec
164166
return this;
165167
}
166168

167-
public JdbcSelectWithActions build() {
169+
public JdbcSelect build() {
168170
if ( preActions == null && postActions == null ) {
169-
return new JdbcSelectWithActions( primaryAction, loadedValuesCollector );
171+
assert loadedValuesCollector == null;
172+
return primaryAction;
170173
}
171174
final PreAction[] preActions = toPreActionArray( this.preActions );
172175
final PostAction[] postActions = toPostActionArray( this.postActions );

hibernate-core/src/main/java/org/hibernate/sql/ast/internal/LockTimeoutHandler.java renamed to hibernate-core/src/main/java/org/hibernate/sql/exec/internal/LockTimeoutHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
* SPDX-License-Identifier: Apache-2.0
33
* Copyright Red Hat Inc. and Hibernate Authors
44
*/
5-
package org.hibernate.sql.ast.internal;
5+
package org.hibernate.sql.exec.internal;
66

77
import jakarta.persistence.Timeout;
88
import org.hibernate.dialect.lock.spi.ConnectionLockTimeoutStrategy;
99
import org.hibernate.engine.spi.SessionFactoryImplementor;
1010
import org.hibernate.sql.exec.spi.ExecutionContext;
11-
import org.hibernate.sql.exec.spi.StatementAccess;
1211
import org.hibernate.sql.exec.spi.PostAction;
1312
import org.hibernate.sql.exec.spi.PreAction;
13+
import org.hibernate.sql.exec.spi.StatementAccess;
1414

1515
import java.sql.Connection;
1616

hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/FollowOnLockingTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void testFindWithForced(SessionFactoryScope factoryScope) {
6464
if ( usesTableHints( session.getDialect() ) ) {
6565
// t-sql
6666
assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );
67-
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), true, session.getDialect(), Helper.Table.BOOKS );
67+
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), false, session.getDialect(), Helper.Table.BOOKS );
6868
}
6969
else {
7070
assertThat( sqlCollector.getSqlQueries() ).hasSize( 2 );
@@ -89,7 +89,7 @@ void testFindWithForcedAsHint(SessionFactoryScope factoryScope) {
8989
if ( usesTableHints( session.getDialect() ) ) {
9090
// t-sql
9191
assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );
92-
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), true, session.getDialect(), Helper.Table.BOOKS );
92+
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), false, session.getDialect(), Helper.Table.BOOKS );
9393
}
9494
else {
9595
assertThat( sqlCollector.getSqlQueries() ).hasSize( 2 );
@@ -110,7 +110,7 @@ void testFindWithForcedAsHintName(SessionFactoryScope factoryScope) {
110110
if ( usesTableHints( session.getDialect() ) ) {
111111
// t-sql
112112
assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );
113-
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), true, session.getDialect(), Helper.Table.BOOKS );
113+
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), false, session.getDialect(), Helper.Table.BOOKS );
114114
}
115115
else {
116116
assertThat( sqlCollector.getSqlQueries() ).hasSize( 2 );
@@ -131,7 +131,7 @@ void testFindWithForcedAsLegacyHint(SessionFactoryScope factoryScope) {
131131
if ( usesTableHints( session.getDialect() ) ) {
132132
// t-sql
133133
assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );
134-
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), true, session.getDialect(), Helper.Table.BOOKS );
134+
Helper.checkSql( sqlCollector.getSqlQueries().get( 0 ), false, session.getDialect(), Helper.Table.BOOKS );
135135
}
136136
else {
137137
assertThat( sqlCollector.getSqlQueries() ).hasSize( 2 );

0 commit comments

Comments
 (0)