1616package org .springframework .data .jdbc .core ;
1717
1818import java .util .ArrayList ;
19+ import java .util .Collection ;
1920import java .util .Collections ;
2021import java .util .HashMap ;
2122import java .util .Iterator ;
2223import java .util .LinkedHashMap ;
2324import java .util .List ;
2425import java .util .Map ;
2526import java .util .Optional ;
27+ import java .util .function .Consumer ;
2628import java .util .function .Function ;
2729import java .util .stream .Collectors ;
2830import java .util .stream .StreamSupport ;
5658import org .springframework .lang .Nullable ;
5759import org .springframework .util .Assert ;
5860import org .springframework .util .ClassUtils ;
61+ import org .springframework .util .ObjectUtils ;
5962
6063/**
6164 * {@link JdbcAggregateOperations} implementation, storing aggregates in and obtaining them from a JDBC data store.
@@ -173,19 +176,8 @@ public <T> T save(T instance) {
173176
174177 @ Override
175178 public <T > List <T > saveAll (Iterable <T > instances ) {
176-
177- Assert .notNull (instances , "Aggregate instances must not be null" );
178-
179- if (!instances .iterator ().hasNext ()) {
180- return Collections .emptyList ();
181- }
182-
183- List <EntityAndChangeCreator <T >> entityAndChangeCreators = new ArrayList <>();
184- for (T instance : instances ) {
185- verifyIdProperty (instance );
186- entityAndChangeCreators .add (new EntityAndChangeCreator <>(instance , changeCreatorSelectorForSave (instance )));
187- }
188- return performSaveAll (entityAndChangeCreators );
179+ return doWithBatch (instances , entity -> changeCreatorSelectorForSave (entity ).apply (entity ), this ::verifyIdProperty ,
180+ this ::performSaveAll );
189181 }
190182
191183 /**
@@ -206,21 +198,7 @@ public <T> T insert(T instance) {
206198
207199 @ Override
208200 public <T > List <T > insertAll (Iterable <T > instances ) {
209-
210- Assert .notNull (instances , "Aggregate instances must not be null" );
211-
212- if (!instances .iterator ().hasNext ()) {
213- return Collections .emptyList ();
214- }
215-
216- List <EntityAndChangeCreator <T >> entityAndChangeCreators = new ArrayList <>();
217- for (T instance : instances ) {
218-
219- Function <T , RootAggregateChange <T >> changeCreator = entity -> createInsertChange (prepareVersionForInsert (entity ));
220- EntityAndChangeCreator <T > entityChange = new EntityAndChangeCreator <>(instance , changeCreator );
221- entityAndChangeCreators .add (entityChange );
222- }
223- return performSaveAll (entityAndChangeCreators );
201+ return doWithBatch (instances , entity -> createInsertChange (prepareVersionForInsert (entity )), this ::performSaveAll );
224202 }
225203
226204 /**
@@ -241,21 +219,35 @@ public <T> T update(T instance) {
241219
242220 @ Override
243221 public <T > List <T > updateAll (Iterable <T > instances ) {
222+ return doWithBatch (instances , entity -> createUpdateChange (prepareVersionForUpdate (entity )), this ::performSaveAll );
223+ }
224+
225+ private <T > List <T > doWithBatch (Iterable <T > iterable , Function <T , RootAggregateChange <T >> changeCreator ,
226+ Function <List <EntityAndChangeCreator <T >>, List <T >> performFunction ) {
227+ return doWithBatch (iterable , changeCreator , entity -> {}, performFunction );
228+ }
244229
245- Assert .notNull (instances , "Aggregate instances must not be null" );
230+ private <T > List <T > doWithBatch (Iterable <T > iterable , Function <T , RootAggregateChange <T >> changeCreator ,
231+ Consumer <T > beforeEntityChange , Function <List <EntityAndChangeCreator <T >>, List <T >> performFunction ) {
246232
247- if (!instances .iterator ().hasNext ()) {
233+ Assert .notNull (iterable , "Aggregate instances must not be null" );
234+
235+ if (ObjectUtils .isEmpty (iterable )) {
248236 return Collections .emptyList ();
249237 }
250238
251- List <EntityAndChangeCreator <T >> entityAndChangeCreators = new ArrayList <>();
252- for (T instance : instances ) {
239+ List <EntityAndChangeCreator <T >> entityAndChangeCreators = new ArrayList <>(
240+ iterable instanceof Collection <?> c ? c .size () : 16 );
241+
242+ for (T instance : iterable ) {
243+
244+ beforeEntityChange .accept (instance );
253245
254- Function <T , RootAggregateChange <T >> changeCreator = entity -> createUpdateChange (prepareVersionForUpdate (entity ));
255246 EntityAndChangeCreator <T > entityChange = new EntityAndChangeCreator <>(instance , changeCreator );
256247 entityAndChangeCreators .add (entityChange );
257248 }
258- return performSaveAll (entityAndChangeCreators );
249+
250+ return performFunction .apply (entityAndChangeCreators );
259251 }
260252
261253 @ Override
0 commit comments