17
17
18
18
import java .util .ArrayList ;
19
19
import java .util .Iterator ;
20
+ import java .util .LinkedHashMap ;
20
21
import java .util .List ;
22
+ import java .util .Map ;
21
23
import java .util .function .Function ;
22
24
import java .util .stream .Collectors ;
23
25
import java .util .stream .StreamSupport ;
33
35
import org .springframework .data .mapping .callback .EntityCallbacks ;
34
36
import org .springframework .data .relational .core .conversion .AggregateChange ;
35
37
import org .springframework .data .relational .core .conversion .BatchingAggregateChange ;
38
+ import org .springframework .data .relational .core .conversion .DeleteAggregateChange ;
36
39
import org .springframework .data .relational .core .conversion .MutableAggregateChange ;
37
40
import org .springframework .data .relational .core .conversion .RelationalEntityDeleteWriter ;
38
41
import org .springframework .data .relational .core .conversion .RelationalEntityInsertWriter ;
@@ -275,6 +278,25 @@ public <S> void deleteById(Object id, Class<S> domainType) {
275
278
deleteTree (id , null , domainType );
276
279
}
277
280
281
+ @ Override
282
+ public <T > void deleteAllById (Iterable <?> ids , Class <T > domainType ) {
283
+
284
+ Assert .isTrue (ids .iterator ().hasNext (), "Ids must not be empty!" );
285
+
286
+ BatchingAggregateChange <T , DeleteAggregateChange <T >> batchingAggregateChange = BatchingAggregateChange
287
+ .forDelete (domainType );
288
+
289
+ ids .forEach (id -> {
290
+ DeleteAggregateChange <T > change = createDeletingChange (id , null , domainType );
291
+ triggerBeforeDelete (null , id , change );
292
+ batchingAggregateChange .add (change );
293
+ });
294
+
295
+ executor .executeDelete (batchingAggregateChange );
296
+
297
+ ids .forEach (id -> triggerAfterDelete (null , id , batchingAggregateChange ));
298
+ }
299
+
278
300
@ Override
279
301
public void deleteAll (Class <?> domainType ) {
280
302
@@ -284,6 +306,28 @@ public void deleteAll(Class<?> domainType) {
284
306
executor .executeDelete (change );
285
307
}
286
308
309
+ @ Override
310
+ public <T > void deleteAll (Iterable <? extends T > instances , Class <T > domainType ) {
311
+
312
+ Assert .isTrue (instances .iterator ().hasNext (), "Aggregate instances must not be empty!" );
313
+
314
+ BatchingAggregateChange <T , DeleteAggregateChange <T >> batchingAggregateChange = BatchingAggregateChange
315
+ .forDelete (domainType );
316
+ Map <Object , T > instancesBeforeExecute = new LinkedHashMap <>();
317
+
318
+ instances .forEach (instance -> {
319
+ Object id = context .getRequiredPersistentEntity (domainType ).getIdentifierAccessor (instance )
320
+ .getRequiredIdentifier ();
321
+ DeleteAggregateChange <T > change = createDeletingChange (id , instance , domainType );
322
+ instancesBeforeExecute .put (id , triggerBeforeDelete (instance , id , change ));
323
+ batchingAggregateChange .add (change );
324
+ });
325
+
326
+ executor .executeDelete (batchingAggregateChange );
327
+
328
+ instancesBeforeExecute .forEach ((id , instance ) -> triggerAfterDelete (instance , id , batchingAggregateChange ));
329
+ }
330
+
287
331
private <T > T afterExecute (AggregateChange <T > change , T entityAfterExecution ) {
288
332
289
333
Object identifier = context .getRequiredPersistentEntity (change .getEntityType ())
@@ -416,7 +460,7 @@ private <T> RelationalPersistentEntity<T> getRequiredPersistentEntity(T instance
416
460
return (RelationalPersistentEntity <T >) context .getRequiredPersistentEntity (instance .getClass ());
417
461
}
418
462
419
- private <T > MutableAggregateChange <T > createDeletingChange (Object id , @ Nullable T entity , Class <T > domainType ) {
463
+ private <T > DeleteAggregateChange <T > createDeletingChange (Object id , @ Nullable T entity , Class <T > domainType ) {
420
464
421
465
Number previousVersion = null ;
422
466
if (entity != null ) {
@@ -425,7 +469,7 @@ private <T> MutableAggregateChange<T> createDeletingChange(Object id, @Nullable
425
469
previousVersion = RelationalEntityVersionUtils .getVersionNumberFromEntity (entity , persistentEntity , converter );
426
470
}
427
471
}
428
- MutableAggregateChange <T > aggregateChange = MutableAggregateChange .forDelete (domainType , previousVersion );
472
+ DeleteAggregateChange <T > aggregateChange = MutableAggregateChange .forDelete (domainType , previousVersion );
429
473
jdbcEntityDeleteWriter .write (id , aggregateChange );
430
474
return aggregateChange ;
431
475
}
@@ -475,7 +519,7 @@ private <T> T triggerAfterSave(T aggregateRoot, AggregateChange<T> change) {
475
519
return entityCallbacks .callback (AfterSaveCallback .class , aggregateRoot );
476
520
}
477
521
478
- private <T > void triggerAfterDelete (@ Nullable T aggregateRoot , Object id , MutableAggregateChange <T > change ) {
522
+ private <T > void triggerAfterDelete (@ Nullable T aggregateRoot , Object id , AggregateChange <T > change ) {
479
523
480
524
publisher .publishEvent (new AfterDeleteEvent <>(Identifier .of (id ), aggregateRoot , change ));
481
525
0 commit comments