11
11
12
12
import org .hibernate .engine .jdbc .mutation .JdbcValueBindings ;
13
13
import org .hibernate .engine .jdbc .mutation .MutationExecutor ;
14
+ import org .hibernate .engine .jdbc .mutation .ParameterUsage ;
14
15
import org .hibernate .engine .jdbc .mutation .group .PreparedStatementDetails ;
15
16
import org .hibernate .engine .jdbc .mutation .spi .MutationExecutorService ;
16
17
import org .hibernate .engine .spi .SessionFactoryImplementor ;
17
18
import org .hibernate .engine .spi .SharedSessionContractImplementor ;
19
+ import org .hibernate .metamodel .mapping .EntityRowIdMapping ;
18
20
import org .hibernate .persister .entity .AbstractEntityPersister ;
19
21
import org .hibernate .persister .entity .mutation .DeleteCoordinator ;
20
22
import org .hibernate .persister .entity .mutation .EntityTableMapping ;
23
25
import org .hibernate .reactive .engine .jdbc .env .internal .ReactiveMutationExecutor ;
24
26
import org .hibernate .reactive .logging .impl .Log ;
25
27
import org .hibernate .reactive .logging .impl .LoggerFactory ;
26
- import org .hibernate .sql .model .MutationOperation ;
27
28
import org .hibernate .sql .model .MutationOperationGroup ;
28
29
29
30
import static org .hibernate .engine .jdbc .mutation .internal .ModelMutationHelper .identifiedResultsCheck ;
@@ -50,7 +51,7 @@ public CompletionStage<Void> coordinateReactiveDelete(Object entity, Object id,
50
51
super .coordinateDelete ( entity , id , version , session );
51
52
return stage != null ? stage : voidFuture ();
52
53
}
53
- catch (RuntimeException t ) {
54
+ catch (Throwable t ) {
54
55
if ( stage == null ) {
55
56
return failedFuture ( t );
56
57
}
@@ -60,18 +61,17 @@ public CompletionStage<Void> coordinateReactiveDelete(Object entity, Object id,
60
61
}
61
62
62
63
@ Override
63
- protected void doDynamicDelete (Object entity , Object id , Object [] loadedState , SharedSessionContractImplementor session ) {
64
+ protected void doDynamicDelete (Object entity , Object id , Object rowId , Object [] loadedState , SharedSessionContractImplementor session ) {
64
65
stage = new CompletableFuture <>();
65
- final MutationOperationGroup operationGroup = generateOperationGroup ( null , loadedState , true , session );
66
+ final MutationOperationGroup operationGroup = generateOperationGroup ( loadedState , true , session );
66
67
final ReactiveMutationExecutor mutationExecutor = mutationExecutor ( session , operationGroup );
67
68
68
- for ( int i = 0 ; i < operationGroup .getNumberOfOperations (); i ++ ) {
69
- final MutationOperation mutation = operationGroup .getOperation ( i );
69
+ operationGroup .forEachOperation ( (position , mutation ) -> {
70
70
if ( mutation != null ) {
71
71
final String tableName = mutation .getTableDetails ().getTableName ();
72
72
mutationExecutor .getPreparedStatementDetails ( tableName );
73
73
}
74
- }
74
+ } );
75
75
76
76
applyLocking ( null , loadedState , mutationExecutor , session );
77
77
applyId ( id , null , mutationExecutor , getStaticDeleteGroup (), session );
@@ -102,49 +102,44 @@ protected void applyId(
102
102
MutationOperationGroup operationGroup ,
103
103
SharedSessionContractImplementor session ) {
104
104
final JdbcValueBindings jdbcValueBindings = mutationExecutor .getJdbcValueBindings ();
105
+ final EntityRowIdMapping rowIdMapping = entityPersister ().getRowIdMapping ();
105
106
106
- for ( int position = 0 ; position < operationGroup .getNumberOfOperations (); position ++ ) {
107
- final MutationOperation jdbcMutation = operationGroup .getOperation ( position );
107
+ operationGroup .forEachOperation ( (position , jdbcMutation ) -> {
108
108
final EntityTableMapping tableDetails = (EntityTableMapping ) jdbcMutation .getTableDetails ();
109
- breakDownKeyJdbcValues ( id , rowId , session , jdbcValueBindings , tableDetails );
109
+ breakDownIdJdbcValues ( id , rowId , session , jdbcValueBindings , rowIdMapping , tableDetails );
110
110
final PreparedStatementDetails statementDetails = mutationExecutor .getPreparedStatementDetails ( tableDetails .getTableName () );
111
111
if ( statementDetails != null ) {
112
112
PreparedStatementAdaptor .bind ( statement -> {
113
- PrepareStatementDetailsAdaptor detailsAdaptor = new PrepareStatementDetailsAdaptor (
114
- statementDetails ,
115
- statement ,
116
- session .getJdbcServices ()
117
- );
113
+ PrepareStatementDetailsAdaptor detailsAdaptor = new PrepareStatementDetailsAdaptor ( statementDetails , statement , session .getJdbcServices () );
118
114
// force creation of the PreparedStatement
119
115
//noinspection resource
120
116
detailsAdaptor .resolveStatement ();
121
117
} );
122
118
}
123
- }
119
+ } );
124
120
}
125
121
126
122
@ Override
127
- protected void doStaticDelete (Object entity , Object id , Object rowId , Object [] loadedState , Object version , SharedSessionContractImplementor session ) {
123
+ protected void doStaticDelete (Object entity , Object id , Object [] loadedState , Object version , SharedSessionContractImplementor session ) {
128
124
stage = new CompletableFuture <>();
129
125
final boolean applyVersion = entity != null ;
130
126
final MutationOperationGroup operationGroupToUse = entity == null
131
127
? resolveNoVersionDeleteGroup ( session )
132
128
: getStaticDeleteGroup ();
133
129
134
130
final ReactiveMutationExecutor mutationExecutor = mutationExecutor ( session , operationGroupToUse );
135
- for ( int position = 0 ; position < getStaticDeleteGroup ().getNumberOfOperations (); position ++ ) {
136
- final MutationOperation mutation = getStaticDeleteGroup ().getOperation ( position );
131
+ getStaticDeleteGroup ().forEachOperation ( (position , mutation ) -> {
137
132
if ( mutation != null ) {
138
133
mutationExecutor .getPreparedStatementDetails ( mutation .getTableDetails ().getTableName () );
139
134
}
140
- }
135
+ } );
141
136
142
137
if ( applyVersion ) {
143
138
applyLocking ( version , null , mutationExecutor , session );
144
139
}
145
140
final JdbcValueBindings jdbcValueBindings = mutationExecutor .getJdbcValueBindings ();
146
141
bindPartitionColumnValueBindings ( loadedState , session , jdbcValueBindings );
147
- applyId ( id , rowId , mutationExecutor , getStaticDeleteGroup (), session );
142
+ applyId ( id , null , mutationExecutor , getStaticDeleteGroup (), session );
148
143
mutationExecutor .executeReactive (
149
144
entity ,
150
145
null ,
@@ -163,6 +158,38 @@ protected void doStaticDelete(Object entity, Object id, Object rowId, Object[] l
163
158
.whenComplete ( this ::complete );
164
159
}
165
160
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
+
166
193
private void complete (Object o , Throwable throwable ) {
167
194
if ( throwable != null ) {
168
195
stage .toCompletableFuture ().completeExceptionally ( throwable );
0 commit comments