Skip to content

Commit 370df64

Browse files
committed
[#1756] Fix ignored RowId for delete query
1 parent 0d4b8b9 commit 370df64

File tree

3 files changed

+42
-55
lines changed

3 files changed

+42
-55
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/engine/impl/ReactiveEntityDeleteAction.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,14 @@ public CompletionStage<Void> reactiveExecute() throws HibernateException {
6464
final boolean veto = isInstanceLoaded() && preDelete();
6565

6666
final Object ck = lockCacheItem();
67-
68-
final CompletionStage<Void> deleteStep = !isCascadeDeleteEnabled() && !veto
69-
? ( (ReactiveEntityPersister) persister ).deleteReactive( id, version, instance, session )
70-
: voidFuture();
71-
72-
return deleteStep.thenAccept( v -> {
67+
return deleteStep(
68+
veto,
69+
(ReactiveEntityPersister) persister,
70+
id,
71+
version,
72+
instance,
73+
session
74+
).thenAccept( v -> {
7375
if ( isInstanceLoaded() ) {
7476
postDeleteLoaded( id, persister, session, instance, ck );
7577
}
@@ -84,4 +86,16 @@ public CompletionStage<Void> reactiveExecute() throws HibernateException {
8486
}
8587
} );
8688
}
89+
90+
private CompletionStage<Void> deleteStep(
91+
boolean veto,
92+
ReactiveEntityPersister persister,
93+
Object id,
94+
Object version,
95+
Object instance,
96+
SharedSessionContractImplementor session) {
97+
return !isCascadeDeleteEnabled() && !veto
98+
? persister.deleteReactive( id, version, instance, session )
99+
: voidFuture();
100+
}
87101
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/mutation/ReactiveDeleteCoordinator.java

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@
1111

1212
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1313
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
14-
import org.hibernate.engine.jdbc.mutation.ParameterUsage;
1514
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails;
1615
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1716
import org.hibernate.engine.spi.SessionFactoryImplementor;
1817
import org.hibernate.engine.spi.SharedSessionContractImplementor;
19-
import org.hibernate.metamodel.mapping.EntityRowIdMapping;
2018
import org.hibernate.persister.entity.AbstractEntityPersister;
2119
import org.hibernate.persister.entity.mutation.DeleteCoordinator;
2220
import org.hibernate.persister.entity.mutation.EntityTableMapping;
@@ -25,6 +23,7 @@
2523
import org.hibernate.reactive.engine.jdbc.env.internal.ReactiveMutationExecutor;
2624
import org.hibernate.reactive.logging.impl.Log;
2725
import org.hibernate.reactive.logging.impl.LoggerFactory;
26+
import org.hibernate.sql.model.MutationOperation;
2827
import org.hibernate.sql.model.MutationOperationGroup;
2928

3029
import static org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.identifiedResultsCheck;
@@ -51,7 +50,7 @@ public CompletionStage<Void> coordinateReactiveDelete(Object entity, Object id,
5150
super.coordinateDelete( entity, id, version, session );
5251
return stage != null ? stage : voidFuture();
5352
}
54-
catch (Throwable t) {
53+
catch (RuntimeException t) {
5554
if ( stage == null ) {
5655
return failedFuture( t );
5756
}
@@ -61,17 +60,18 @@ public CompletionStage<Void> coordinateReactiveDelete(Object entity, Object id,
6160
}
6261

6362
@Override
64-
protected void doDynamicDelete(Object entity, Object id, Object rowId, Object[] loadedState, SharedSessionContractImplementor session) {
63+
protected void doDynamicDelete(Object entity, Object id, Object[] loadedState, SharedSessionContractImplementor session) {
6564
stage = new CompletableFuture<>();
66-
final MutationOperationGroup operationGroup = generateOperationGroup( loadedState, true, session );
65+
final MutationOperationGroup operationGroup = generateOperationGroup( null, loadedState, true, session );
6766
final ReactiveMutationExecutor mutationExecutor = mutationExecutor( session, operationGroup );
6867

69-
operationGroup.forEachOperation( (position, mutation) -> {
68+
for ( int i = 0; i < operationGroup.getNumberOfOperations(); i++ ) {
69+
final MutationOperation mutation = operationGroup.getOperation( i );
7070
if ( mutation != null ) {
7171
final String tableName = mutation.getTableDetails().getTableName();
7272
mutationExecutor.getPreparedStatementDetails( tableName );
7373
}
74-
} );
74+
}
7575

7676
applyLocking( null, loadedState, mutationExecutor, session );
7777
applyId( id, null, mutationExecutor, getStaticDeleteGroup(), session );
@@ -102,44 +102,49 @@ protected void applyId(
102102
MutationOperationGroup operationGroup,
103103
SharedSessionContractImplementor session) {
104104
final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings();
105-
final EntityRowIdMapping rowIdMapping = entityPersister().getRowIdMapping();
106105

107-
operationGroup.forEachOperation( (position, jdbcMutation) -> {
106+
for ( int position = 0; position < operationGroup.getNumberOfOperations(); position++ ) {
107+
final MutationOperation jdbcMutation = operationGroup.getOperation( position );
108108
final EntityTableMapping tableDetails = (EntityTableMapping) jdbcMutation.getTableDetails();
109-
breakDownIdJdbcValues( id, rowId, session, jdbcValueBindings, rowIdMapping, tableDetails );
109+
breakDownKeyJdbcValues( id, rowId, session, jdbcValueBindings, tableDetails );
110110
final PreparedStatementDetails statementDetails = mutationExecutor.getPreparedStatementDetails( tableDetails.getTableName() );
111111
if ( statementDetails != null ) {
112112
PreparedStatementAdaptor.bind( statement -> {
113-
PrepareStatementDetailsAdaptor detailsAdaptor = new PrepareStatementDetailsAdaptor( statementDetails, statement, session.getJdbcServices() );
113+
PrepareStatementDetailsAdaptor detailsAdaptor = new PrepareStatementDetailsAdaptor(
114+
statementDetails,
115+
statement,
116+
session.getJdbcServices()
117+
);
114118
// force creation of the PreparedStatement
115119
//noinspection resource
116120
detailsAdaptor.resolveStatement();
117121
} );
118122
}
119-
} );
123+
}
120124
}
121125

122126
@Override
123-
protected void doStaticDelete(Object entity, Object id, Object[] loadedState, Object version, SharedSessionContractImplementor session) {
127+
protected void doStaticDelete(Object entity, Object id, Object rowId, Object[] loadedState, Object version, SharedSessionContractImplementor session) {
124128
stage = new CompletableFuture<>();
125129
final boolean applyVersion = entity != null;
126130
final MutationOperationGroup operationGroupToUse = entity == null
127131
? resolveNoVersionDeleteGroup( session )
128132
: getStaticDeleteGroup();
129133

130134
final ReactiveMutationExecutor mutationExecutor = mutationExecutor( session, operationGroupToUse );
131-
getStaticDeleteGroup().forEachOperation( (position, mutation) -> {
135+
for ( int position = 0; position < getStaticDeleteGroup().getNumberOfOperations(); position++ ) {
136+
final MutationOperation mutation = getStaticDeleteGroup().getOperation( position );
132137
if ( mutation != null ) {
133138
mutationExecutor.getPreparedStatementDetails( mutation.getTableDetails().getTableName() );
134139
}
135-
} );
140+
}
136141

137142
if ( applyVersion ) {
138143
applyLocking( version, null, mutationExecutor, session );
139144
}
140145
final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings();
141146
bindPartitionColumnValueBindings( loadedState, session, jdbcValueBindings );
142-
applyId( id, null, mutationExecutor, getStaticDeleteGroup(), session );
147+
applyId( id, rowId, mutationExecutor, getStaticDeleteGroup(), session );
143148
mutationExecutor.executeReactive(
144149
entity,
145150
null,
@@ -158,38 +163,6 @@ protected void doStaticDelete(Object entity, Object id, Object[] loadedState, Ob
158163
.whenComplete( this::complete );
159164
}
160165

161-
/**
162-
* Copy and paste of the on in ORM
163-
*/
164-
private static void breakDownIdJdbcValues(
165-
Object id,
166-
Object rowId,
167-
SharedSessionContractImplementor session,
168-
JdbcValueBindings jdbcValueBindings,
169-
EntityRowIdMapping rowIdMapping,
170-
EntityTableMapping tableDetails) {
171-
if ( rowId != null && rowIdMapping != null && tableDetails.isIdentifierTable() ) {
172-
jdbcValueBindings.bindValue(
173-
rowId,
174-
tableDetails.getTableName(),
175-
rowIdMapping.getRowIdName(),
176-
ParameterUsage.RESTRICT
177-
);
178-
}
179-
else {
180-
tableDetails.getKeyMapping().breakDownKeyJdbcValues(
181-
id,
182-
(jdbcValue, columnMapping) -> jdbcValueBindings.bindValue(
183-
jdbcValue,
184-
tableDetails.getTableName(),
185-
columnMapping.getColumnName(),
186-
ParameterUsage.RESTRICT
187-
),
188-
session
189-
);
190-
}
191-
}
192-
193166
private void complete(Object o, Throwable throwable) {
194167
if ( throwable != null ) {
195168
stage.toCompletableFuture().completeExceptionally( throwable );

hibernate-reactive-core/src/main/java/org/hibernate/reactive/pool/impl/SqlClientConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public CompletionStage<int[]> updateBatch(String sql, List<Tuple> parametersBatc
184184

185185
int i = 0;
186186
RowSet<Row> resultNext = result;
187-
if ( parametersBatch.size() > 0 ) {
187+
if ( !parametersBatch.isEmpty() ) {
188188
final RowIterator<Row> iterator = resultNext.iterator();
189189
if ( iterator.hasNext() ) {
190190
while ( iterator.hasNext() ) {

0 commit comments

Comments
 (0)