Skip to content

Commit 17ea897

Browse files
committed
HHH-18992 pass LockOptions correctly to multiple natural id loaders
1 parent 571091f commit 17ea897

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderArrayParam.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.Collections;
88
import java.util.List;
99

10-
import org.hibernate.LockMode;
1110
import org.hibernate.LockOptions;
1211
import org.hibernate.engine.spi.SessionFactoryImplementor;
1312
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -18,7 +17,7 @@
1817
import org.hibernate.metamodel.mapping.JdbcMapping;
1918
import org.hibernate.metamodel.mapping.internal.BasicAttributeMapping;
2019
import org.hibernate.metamodel.mapping.internal.SimpleNaturalIdMapping;
21-
import org.hibernate.query.spi.QueryOptions;
20+
import org.hibernate.query.spi.QueryOptionsAdapter;
2221
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2322
import org.hibernate.sql.ast.tree.select.SelectStatement;
2423
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
@@ -73,9 +72,10 @@ public <K> List<E> multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions loadOptio
7372
final SessionFactoryImplementor sessionFactory = session.getFactory();
7473
naturalIds = LoaderHelper.normalizeKeys( naturalIds, getNaturalIdAttribute(), session, sessionFactory );
7574

76-
final LockOptions lockOptions = (loadOptions.getLockOptions() == null)
77-
? new LockOptions( LockMode.NONE )
78-
: loadOptions.getLockOptions();
75+
final LockOptions lockOptions =
76+
loadOptions.getLockOptions() == null
77+
? LockOptions.NONE
78+
: loadOptions.getLockOptions();
7979

8080
final BasicTypeRegistry basicTypeRegistry = sessionFactory.getTypeConfiguration().getBasicTypeRegistry();
8181
final BasicType<?> arrayBasicType = basicTypeRegistry.getRegisteredType( keyArrayClass );
@@ -99,8 +99,12 @@ public <K> List<E> multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions loadOptio
9999
.getJdbcEnvironment()
100100
.getSqlAstTranslatorFactory()
101101
.buildSelectTranslator( sessionFactory, sqlAst )
102-
// TODO: do we need to pass the LockOptions here?
103-
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
102+
.translate( JdbcParameterBindings.NO_BINDINGS, new QueryOptionsAdapter() {
103+
@Override
104+
public LockOptions getLockOptions() {
105+
return lockOptions;
106+
}
107+
} );
104108

105109
return LoaderHelper.loadByArrayParameter(
106110
naturalIds,

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderInPredicate.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.Collections;
88
import java.util.List;
99

10-
import org.hibernate.LockMode;
1110
import org.hibernate.LockOptions;
1211
import org.hibernate.engine.spi.SessionFactoryImplementor;
1312
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -48,24 +47,27 @@ public <K> List<E> multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions options,
4847
maxBatchSize = options.getBatchSize();
4948
}
5049
else {
51-
maxBatchSize = session.getJdbcServices().getJdbcEnvironment().getDialect().getMultiKeyLoadSizingStrategy().determineOptimalBatchLoadSize(
52-
entityDescriptor.getNaturalIdMapping().getJdbcTypeCount(),
53-
naturalIds.length,
54-
sessionFactory.getSessionFactoryOptions().inClauseParameterPaddingEnabled()
55-
);
50+
maxBatchSize =
51+
session.getJdbcServices().getJdbcEnvironment().getDialect()
52+
.getMultiKeyLoadSizingStrategy().determineOptimalBatchLoadSize(
53+
entityDescriptor.getNaturalIdMapping().getJdbcTypeCount(),
54+
naturalIds.length,
55+
sessionFactory.getSessionFactoryOptions().inClauseParameterPaddingEnabled()
56+
);
5657
}
5758

5859
final int batchSize = Math.min( maxBatchSize, naturalIds.length );
5960

60-
final LockOptions lockOptions = (options.getLockOptions() == null)
61-
? new LockOptions( LockMode.NONE )
62-
: options.getLockOptions();
61+
final LockOptions lockOptions =
62+
options.getLockOptions() == null
63+
? LockOptions.NONE
64+
: options.getLockOptions();
6365

6466
final MultiNaturalIdLoadingBatcher batcher = new MultiNaturalIdLoadingBatcher(
6567
entityDescriptor,
6668
entityDescriptor.getNaturalIdMapping(),
6769
batchSize,
68-
(naturalId, session1) -> {
70+
(naturalId, s) -> {
6971
// `naturalId` here is the one passed in by the API as part of the values array
7072
// todo (6.0) : use this to help create the ordered results
7173
return entityDescriptor.getNaturalIdMapping().normalizeInput( naturalId );
@@ -75,7 +77,7 @@ public <K> List<E> multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions options,
7577
sessionFactory
7678
);
7779

78-
final List<E> results = batcher.multiLoad( naturalIds, options, session );
80+
final List<E> results = batcher.multiLoad( naturalIds, session );
7981

8082
if ( results.size() == 1 ) {
8183
return results;

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoadingBatcher.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1414
import org.hibernate.engine.spi.SubselectFetch;
1515
import org.hibernate.internal.util.collections.CollectionHelper;
16-
import org.hibernate.loader.ast.spi.MultiNaturalIdLoadOptions;
1716
import org.hibernate.metamodel.mapping.EntityMappingType;
1817
import org.hibernate.metamodel.mapping.ModelPart;
19-
import org.hibernate.query.spi.QueryOptions;
18+
import org.hibernate.query.spi.QueryOptionsAdapter;
2019
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
2120
import org.hibernate.sql.ast.tree.select.SelectStatement;
2221
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
@@ -83,11 +82,15 @@ public MultiNaturalIdLoadingBatcher(
8382
final SqlAstTranslatorFactory sqlAstTranslatorFactory =
8483
sessionFactory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory();
8584
this.jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator( sessionFactory, sqlSelect )
86-
//TODO: do we need to pass the LockOptions here?
87-
.translate( null, QueryOptions.NONE );
85+
.translate( null, new QueryOptionsAdapter() {
86+
@Override
87+
public LockOptions getLockOptions() {
88+
return lockOptions;
89+
}
90+
} );
8891
}
8992

90-
public <E> List<E> multiLoad(Object[] naturalIdValues, MultiNaturalIdLoadOptions options, SharedSessionContractImplementor session) {
93+
public <E> List<E> multiLoad(Object[] naturalIdValues, SharedSessionContractImplementor session) {
9194
final ArrayList<E> multiLoadResults = CollectionHelper.arrayList( naturalIdValues.length );
9295
final JdbcParameterBindingsImpl jdbcParamBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() );
9396

0 commit comments

Comments
 (0)