Skip to content

Commit 38b4b69

Browse files
committed
[hibernate#2155] Upgrade Hibernate ORM to 7.0.0.Beta5
Some of the changes: * NullabilityCheck has changed * Remove ReactiveQueryImplementor#setOptional* * Replace inline calls to BatchFetchQueueHelper (removed)
1 parent 08e06d1 commit 38b4b69

14 files changed

+218
-100
lines changed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ org.gradle.java.installations.auto-download=false
3535
#enableMavenLocalRepo = true
3636

3737
# The default Hibernate ORM version (override using `-PhibernateOrmVersion=the.version.you.want`)
38-
hibernateOrmVersion = 7.0.0.Beta4
38+
hibernateOrmVersion = 7.0.0.Beta5
3939

4040
# Override default Hibernate ORM Gradle plugin version
4141
# Using the stable version because I don't know how to configure the build to download the snapshot version from

hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveDeleteEventListener.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,8 @@ protected CompletionStage<Void> deleteEntity(
436436
persister
437437
).nullifyTransientReferences( entityEntry.getDeletedState() )
438438
.thenAccept( vv -> {
439-
new Nullability( session ).checkNullability(
440-
entityEntry.getDeletedState(),
441-
persister,
442-
Nullability.NullabilityCheckType.DELETE
443-
);
439+
new Nullability( session, Nullability.NullabilityCheckType.DELETE )
440+
.checkNullability( entityEntry.getDeletedState(), persister );
444441
persistenceContext.registerNullifiableEntityKey( key );
445442

446443
final ReactiveActionQueue actionQueue = actionQueue( session );

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.concurrent.CompletionStage;
1111

1212
import org.hibernate.LockOptions;
13-
import org.hibernate.engine.internal.BatchFetchQueueHelper;
1413
import org.hibernate.engine.spi.EntityKey;
1514
import org.hibernate.engine.spi.LoadQueryInfluencers;
1615
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -160,7 +159,8 @@ private CompletionStage<Void> initializeEntities(
160159
continue;
161160
}
162161
// found or not, remove the key from the batch-fetch queue
163-
BatchFetchQueueHelper.removeBatchLoadableEntityKey( id, getLoadable(), session );
162+
session.getPersistenceContextInternal().getBatchFetchQueue()
163+
.removeBatchLoadableEntityKey( session.generateEntityKey( id, getLoadable().getEntityPersister() ) );
164164
}
165165
} );
166166
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import org.hibernate.LockMode;
1515
import org.hibernate.LockOptions;
16-
import org.hibernate.engine.internal.BatchFetchQueueHelper;
1716
import org.hibernate.engine.spi.BatchFetchQueue;
1817
import org.hibernate.engine.spi.EntityEntry;
1918
import org.hibernate.engine.spi.EntityKey;
@@ -206,7 +205,7 @@ protected <K> CompletionStage<List<E>> performOrderedMultiLoad(
206205
// the element value at this position in the result List should be
207206
// the EntityKey for that entity - reuse it
208207
final EntityKey entityKey = (EntityKey) result.get( resultIndex );
209-
BatchFetchQueueHelper.removeBatchLoadableEntityKey( entityKey, session );
208+
session.getPersistenceContextInternal().getBatchFetchQueue().removeBatchLoadableEntityKey( entityKey );
210209
Object entity = persistenceContext.getEntity( entityKey );
211210
if ( entity != null && !loadOptions.isReturnOfDeletedEntitiesEnabled() ) {
212211
// make sure it is not DELETED
@@ -293,7 +292,8 @@ protected <K> CompletionStage<List<E>> performUnorderedMultiLoad(
293292
continue;
294293
}
295294
// found or not, remove the key from the batch-fetch queue
296-
BatchFetchQueueHelper.removeBatchLoadableEntityKey( id, getLoadable(), session );
295+
session.getPersistenceContextInternal().getBatchFetchQueue()
296+
.removeBatchLoadableEntityKey( session.generateEntityKey( id, getLoadable().getEntityPersister() ) );
297297
}
298298

299299
return result;

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public <R> MutationQuery createQuery(CriteriaDelete<R> criteriaDelete) {
173173

174174
@Override
175175
public <R> Query<R> createNamedQuery(String queryName) {
176-
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName, null ), factory );
176+
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName ), factory );
177177
}
178178

179179
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public Mutiny.MutationQuery createMutationQuery(String queryString) {
9393

9494
@Override
9595
public <R> Query<R> createNamedQuery(String queryName) {
96-
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName, null ), factory );
96+
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName ), factory );
9797
}
9898

9999
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/ReactiveQueryImplementor.java

-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.hibernate.reactive.query;
77

8-
import java.io.Serializable;
98
import java.time.Instant;
109
import java.util.Calendar;
1110
import java.util.Collection;
@@ -23,12 +22,6 @@
2322

2423
public interface ReactiveQueryImplementor<R> extends ReactiveQuery<R> {
2524

26-
void setOptionalId(Serializable id);
27-
28-
void setOptionalEntityName(String entityName);
29-
30-
void setOptionalObject(Object optionalObject);
31-
3225
QueryParameterBindings getParameterBindings();
3326

3427
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/sql/internal/ReactiveNativeQueryImpl.java

+12-11
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.hibernate.graph.GraphSemantic;
2727
import org.hibernate.graph.RootGraph;
2828
import org.hibernate.graph.spi.RootGraphImplementor;
29-
import org.hibernate.internal.AbstractSharedSessionContract;
3029
import org.hibernate.metamodel.model.domain.BasicDomainType;
3130
import org.hibernate.query.BindableType;
3231
import org.hibernate.query.Order;
@@ -65,8 +64,18 @@ public class ReactiveNativeQueryImpl<R> extends NativeQueryImpl<R>
6564

6665
private final ReactiveAbstractSelectionQuery<R> selectionQueryDelegate;
6766

68-
public ReactiveNativeQueryImpl(String memento, SharedSessionContractImplementor session) {
69-
super( memento, session );
67+
public ReactiveNativeQueryImpl(String sql, SharedSessionContractImplementor session) {
68+
super( sql, null, session );
69+
this.selectionQueryDelegate = createSelectionQueryDelegate( session );
70+
}
71+
72+
public ReactiveNativeQueryImpl(String sql, Class<R> resultClass, SharedSessionContractImplementor session) {
73+
super( sql, resultClass, session );
74+
this.selectionQueryDelegate = createSelectionQueryDelegate( session );
75+
}
76+
77+
public ReactiveNativeQueryImpl(String sql, NamedResultSetMappingMemento resultSetMappingMemento, Class<R> resultClass, SharedSessionContractImplementor session) {
78+
super( sql, resultSetMappingMemento, resultClass, session);
7079
this.selectionQueryDelegate = createSelectionQueryDelegate( session );
7180
}
7281

@@ -91,14 +100,6 @@ public ReactiveNativeQueryImpl(
91100
this.selectionQueryDelegate = createSelectionQueryDelegate( session );
92101
}
93102

94-
public ReactiveNativeQueryImpl(
95-
String sqlString,
96-
NamedResultSetMappingMemento resultSetMappingMemento,
97-
AbstractSharedSessionContract session) {
98-
super( sqlString, resultSetMappingMemento, session );
99-
this.selectionQueryDelegate = createSelectionQueryDelegate( session );
100-
}
101-
102103
// Convenient for passing parameters to ReactiveAbstractSelectionQuery using method reference
103104
private <T> T getNull() {
104105
return null;

hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/sqm/internal/ReactiveSimpleDeleteQueryPlan.java

+18-21
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@
3737
import org.hibernate.sql.ast.SqlAstTranslator;
3838
import org.hibernate.sql.ast.tree.AbstractUpdateOrDeleteStatement;
3939
import org.hibernate.sql.ast.tree.MutationStatement;
40-
import org.hibernate.sql.ast.tree.expression.ColumnReference;
4140
import org.hibernate.sql.ast.tree.expression.Expression;
42-
import org.hibernate.sql.ast.tree.expression.JdbcLiteral;
4341
import org.hibernate.sql.ast.tree.from.MutatingTableReferenceGroupWrapper;
4442
import org.hibernate.sql.ast.tree.from.NamedTableReference;
4543
import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
@@ -95,29 +93,28 @@ protected SqlAstTranslator<? extends JdbcOperationQueryMutation> createTranslato
9593
return factory.getJdbcServices()
9694
.getJdbcEnvironment()
9795
.getSqlAstTranslatorFactory()
98-
.buildMutationTranslator( factory, mutationStatement() );
96+
.buildMutationTranslator( factory, createDeleteAst() );
9997
}
10098

101-
private MutationStatement mutationStatement() {
99+
// Copy and paste from superclass
100+
private MutationStatement createDeleteAst() {
101+
final MutationStatement ast;
102102
if ( entityDescriptor.getSoftDeleteMapping() == null ) {
103-
return sqmInterpretation.getSqlAst();
103+
ast = sqmInterpretation.getSqlAst();
104104
}
105-
final AbstractUpdateOrDeleteStatement sqlDeleteAst = sqmInterpretation.getSqlAst();
106-
final NamedTableReference targetTable = sqlDeleteAst.getTargetTable();
107-
final SoftDeleteMapping columnMapping = getEntityDescriptor().getSoftDeleteMapping();
108-
final ColumnReference columnReference = new ColumnReference( targetTable, columnMapping );
109-
//noinspection rawtypes,unchecked
110-
final JdbcLiteral jdbcLiteral = new JdbcLiteral(
111-
columnMapping.getDeletedLiteralValue(),
112-
columnMapping.getJdbcMapping()
113-
);
114-
final Assignment assignment = new Assignment( columnReference, jdbcLiteral );
115-
116-
return new UpdateStatement(
117-
targetTable,
118-
Collections.singletonList( assignment ),
119-
sqlDeleteAst.getRestriction()
120-
);
105+
else {
106+
final AbstractUpdateOrDeleteStatement sqlDeleteAst = sqmInterpretation.getSqlAst();
107+
final NamedTableReference targetTable = sqlDeleteAst.getTargetTable();
108+
final SoftDeleteMapping columnMapping = getEntityDescriptor().getSoftDeleteMapping();
109+
final Assignment assignment = columnMapping.createSoftDeleteAssignment( targetTable );
110+
111+
ast = new UpdateStatement(
112+
targetTable,
113+
Collections.singletonList( assignment ),
114+
sqlDeleteAst.getRestriction()
115+
);
116+
}
117+
return ast;
121118
}
122119

123120
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQueryProducer.java

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public interface ReactiveQueryProducer extends ReactiveConnectionSupplier {
5757

5858
<R> ReactiveQuery<R> createReactiveQuery(String queryString, Class<R> resultType);
5959

60+
<R> ReactiveQueryImplementor<R> createReactiveNamedQuery(String queryString);
61+
6062
<R> ReactiveQueryImplementor<R> createReactiveNamedQuery(String queryString, Class<R> resultType);
6163

6264
<R> ReactiveNativeQuery<R> createReactiveNativeQuery(String sqlString);

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java

+83-18
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,16 @@
7272
import org.hibernate.proxy.HibernateProxy;
7373
import org.hibernate.proxy.LazyInitializer;
7474
import org.hibernate.query.IllegalMutationQueryException;
75+
import org.hibernate.query.UnknownNamedQueryException;
7576
import org.hibernate.query.criteria.JpaCriteriaInsert;
7677
import org.hibernate.query.hql.spi.SqmQueryImplementor;
7778
import org.hibernate.query.named.NamedResultSetMappingMemento;
7879
import org.hibernate.query.spi.HqlInterpretation;
7980
import org.hibernate.query.spi.QueryImplementor;
81+
import org.hibernate.query.sql.spi.NamedNativeQueryMemento;
8082
import org.hibernate.query.sql.spi.NativeQueryImplementor;
8183
import org.hibernate.query.sqm.internal.SqmUtil;
84+
import org.hibernate.query.sqm.spi.NamedSqmQueryMemento;
8285
import org.hibernate.query.sqm.tree.SqmStatement;
8386
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
8487
import org.hibernate.query.sqm.tree.insert.SqmInsertStatement;
@@ -131,7 +134,6 @@
131134
import static org.hibernate.engine.spi.NaturalIdResolutions.INVALID_NATURAL_ID_REFERENCE;
132135
import static org.hibernate.event.spi.LoadEventListener.IMMEDIATE_LOAD;
133136
import static org.hibernate.internal.util.StringHelper.isEmpty;
134-
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
135137
import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer;
136138
import static org.hibernate.reactive.common.InternalStateAssertions.assertUseOnEventLoop;
137139
import static org.hibernate.reactive.persister.entity.impl.ReactiveEntityPersister.forceInitialize;
@@ -443,14 +445,16 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(String sqlString, Cl
443445

444446
@Override @Deprecated(forRemoval = true)
445447
public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(String sqlString, String resultSetMappingName) {
448+
if ( isEmpty( resultSetMappingName ) ) {
449+
throw new IllegalArgumentException( "Result set mapping name was not specified" );
450+
}
451+
446452
checkOpen();
447453
pulseTransactionCoordinator();
448454
delayedAfterCompletion();
449455

450456
try {
451-
return isNotEmpty( resultSetMappingName )
452-
? new ReactiveNativeQueryImpl<>( sqlString, getResultSetMappingMemento( resultSetMappingName ), this )
453-
: new ReactiveNativeQueryImpl<>( sqlString, this );
457+
return new ReactiveNativeQueryImpl<>( sqlString, getResultSetMappingMemento( resultSetMappingName ), null, this );
454458
//TODO: why no applyQuerySettingsAndHints( query ); ???
455459
}
456460
catch (RuntimeException he) {
@@ -497,9 +501,78 @@ private <R> ReactiveSelectionQuery<R> createSelectionQuery(String hql, Class<R>
497501
return query;
498502
}
499503

504+
@Override
505+
public <R> ReactiveQueryImplementor<R> createReactiveNamedQuery(String name) {
506+
checksBeforeQueryCreation();
507+
try {
508+
return (ReactiveQueryImplementor<R>) buildNamedQuery(
509+
name,
510+
this::createSqmQueryImplementor,
511+
this::createNativeQueryImplementor
512+
);
513+
}
514+
catch (RuntimeException e) {
515+
throw convertNamedQueryException( e );
516+
}
517+
}
518+
500519
@Override
501520
public <R> ReactiveQueryImplementor<R> createReactiveNamedQuery(String name, Class<R> resultType) {
502-
return (ReactiveQueryImplementor<R>) buildNamedQuery( name, resultType );
521+
checksBeforeQueryCreation();
522+
if ( resultType == null ) {
523+
throw new IllegalArgumentException( "Result class is null" );
524+
}
525+
try {
526+
return buildNamedQuery(
527+
name,
528+
memento -> createReactiveSqmQueryImplementor( resultType, memento ),
529+
memento -> createReactiveNativeQueryImplementor( resultType, memento )
530+
);
531+
}
532+
catch (RuntimeException e) {
533+
throw convertNamedQueryException( e );
534+
}
535+
}
536+
537+
private void checksBeforeQueryCreation() {
538+
checkOpen();
539+
checkTransactionSynchStatus();
540+
}
541+
542+
protected <T> ReactiveNativeQueryImpl<T> createReactiveNativeQueryImplementor(Class<T> resultType, NamedNativeQueryMemento<?> memento) {
543+
final NativeQueryImplementor<T> query = memento.toQuery(this, resultType );
544+
if ( isEmpty( query.getComment() ) ) {
545+
query.setComment( "dynamic native SQL query" );
546+
}
547+
applyQuerySettingsAndHints( query );
548+
return (ReactiveNativeQueryImpl<T>) query;
549+
}
550+
551+
protected <T> ReactiveQuerySqmImpl<T> createReactiveSqmQueryImplementor(Class<T> resultType, NamedSqmQueryMemento<?> memento) {
552+
final SqmQueryImplementor<T> query = memento.toQuery( this, resultType );
553+
if ( isEmpty( query.getComment() ) ) {
554+
query.setComment( "dynamic query" );
555+
}
556+
applyQuerySettingsAndHints( query );
557+
if ( memento.getLockOptions() != null ) {
558+
query.setLockOptions( memento.getLockOptions() );
559+
}
560+
return (ReactiveQuerySqmImpl<T>) query;
561+
}
562+
563+
private RuntimeException convertNamedQueryException(RuntimeException e) {
564+
if ( e instanceof UnknownNamedQueryException ) {
565+
// JPA expects this to mark the transaction for rollback only
566+
getTransactionCoordinator().getTransactionDriverControl().markRollbackOnly();
567+
// it also expects an IllegalArgumentException, so wrap UnknownNamedQueryException
568+
return new IllegalArgumentException( e.getMessage(), e );
569+
}
570+
else if ( e instanceof IllegalArgumentException ) {
571+
return e;
572+
}
573+
else {
574+
return getExceptionConverter().convert( e );
575+
}
503576
}
504577

505578
@Override
@@ -584,7 +657,7 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(String queryString,
584657
delayedAfterCompletion();
585658

586659
try {
587-
final ReactiveNativeQueryImpl<R> query = new ReactiveNativeQueryImpl<>( queryString, this );
660+
final ReactiveNativeQueryImpl<R> query = new ReactiveNativeQueryImpl<>( queryString, null, this );
588661
addAffectedEntities( affectedEntities, query );
589662
if ( isEmpty( query.getComment() ) ) {
590663
query.setComment( "dynamic native SQL query" );
@@ -622,12 +695,11 @@ public <R> ReactiveNativeQueryImpl<R> createReactiveNativeQuery(String queryStri
622695
checkOpen();
623696
pulseTransactionCoordinator();
624697
delayedAfterCompletion();
625-
698+
// Should we throw an exception?
699+
NamedResultSetMappingMemento memento = resultSetMapping == null ? null : getResultSetMappingMemento( resultSetMapping.getName() );
626700
try {
627701
// Same approach as AbstractSharedSessionContract#createNativeQuery(String, String)
628-
final ReactiveNativeQueryImpl<R> nativeQuery = resultSetMapping != null
629-
? new ReactiveNativeQueryImpl<>( queryString, getResultSetMappingMemento( resultSetMapping.getName() ), this )
630-
: new ReactiveNativeQueryImpl<>( queryString, this );
702+
final ReactiveNativeQueryImpl<R> nativeQuery = new ReactiveNativeQueryImpl<>( queryString, memento, null, this );
631703
applyQuerySettingsAndHints( nativeQuery );
632704
return nativeQuery;
633705
}
@@ -652,20 +724,13 @@ public <T> ResultSetMapping<T> getResultSetMapping(Class<T> resultType, String m
652724
if ( mapping == null ) {
653725
throw new IllegalArgumentException( "result set mapping does not exist: " + mappingName );
654726
}
655-
//
656-
// ResultSetMappingImpl resultSetMapping = new ResultSetMappingImpl( "impl" );
657-
// if ( resultType != null ) {
658-
// Class<?> mappedResultType = resultSetMapping.;
659-
// if ( !resultType.equals( mappedResultType ) ) {
660-
// throw new IllegalArgumentException( "incorrect result type for result set mapping: " + mappingName + " has type " + mappedResultType.getName() );
661-
// }
662-
// }
663727

664728
return new ResultSetMapping<>() {
665729
@Override
666730
public String getName() {
667731
return mappingName;
668732
}
733+
669734
@Override
670735
public Class<T> getResultType() {
671736
return resultType;

0 commit comments

Comments
 (0)