@@ -150,8 +150,9 @@ public <T> T save(T instance) {
150
150
151
151
RelationalPersistentEntity <?> persistentEntity = context .getRequiredPersistentEntity (instance .getClass ());
152
152
153
- Function <T , MutableAggregateChange <T >> changeCreator = persistentEntity .isNew (instance ) ? this ::createInsertChange
154
- : this ::createUpdateChange ;
153
+ Function <T , MutableAggregateChange <T >> changeCreator = persistentEntity .isNew (instance )
154
+ ? entity -> createInsertChange (prepareVersionForInsert (entity ))
155
+ : entity -> createUpdateChange (prepareVersionForUpdate (entity ));
155
156
156
157
return store (instance , changeCreator , persistentEntity );
157
158
}
@@ -170,7 +171,7 @@ public <T> T insert(T instance) {
170
171
171
172
RelationalPersistentEntity <?> persistentEntity = context .getRequiredPersistentEntity (instance .getClass ());
172
173
173
- return store (instance , this :: createInsertChange , persistentEntity );
174
+ return store (instance , entity -> createInsertChange ( prepareVersionForInsert ( entity )) , persistentEntity );
174
175
}
175
176
176
177
/**
@@ -187,7 +188,7 @@ public <T> T update(T instance) {
187
188
188
189
RelationalPersistentEntity <?> persistentEntity = context .getRequiredPersistentEntity (instance .getClass ());
189
190
190
- return store (instance , this :: createUpdateChange , persistentEntity );
191
+ return store (instance , entity -> createUpdateChange ( prepareVersionForUpdate ( entity )) , persistentEntity );
191
192
}
192
193
193
194
/*
@@ -365,6 +366,21 @@ private <T> void deleteTree(Object id, @Nullable T entity, Class<T> domainType)
365
366
366
367
private <T > MutableAggregateChange <T > createInsertChange (T instance ) {
367
368
369
+ MutableAggregateChange <T > aggregateChange = MutableAggregateChange .forSave (instance );
370
+ jdbcEntityInsertWriter .write (instance , aggregateChange );
371
+ return aggregateChange ;
372
+ }
373
+
374
+ private <T > MutableAggregateChange <T > createUpdateChange (EntityAndPreviousVersion <T > entityAndVersion ) {
375
+
376
+ MutableAggregateChange <T > aggregateChange = MutableAggregateChange .forSave (entityAndVersion .entity ,
377
+ entityAndVersion .version );
378
+ jdbcEntityUpdateWriter .write (entityAndVersion .entity , aggregateChange );
379
+ return aggregateChange ;
380
+ }
381
+
382
+ private <T > T prepareVersionForInsert (T instance ) {
383
+
368
384
RelationalPersistentEntity <T > persistentEntity = getRequiredPersistentEntity (instance );
369
385
T preparedInstance = instance ;
370
386
if (persistentEntity .hasVersionProperty ()) {
@@ -375,31 +391,26 @@ private <T> MutableAggregateChange<T> createInsertChange(T instance) {
375
391
preparedInstance = RelationalEntityVersionUtils .setVersionNumberOnEntity ( //
376
392
instance , initialVersion , persistentEntity , converter );
377
393
}
378
- MutableAggregateChange <T > aggregateChange = MutableAggregateChange .forSave (preparedInstance );
379
- jdbcEntityInsertWriter .write (preparedInstance , aggregateChange );
380
- return aggregateChange ;
394
+ return preparedInstance ;
381
395
}
382
396
383
- private <T > MutableAggregateChange <T > createUpdateChange (T instance ) {
397
+ private <T > EntityAndPreviousVersion <T > prepareVersionForUpdate (T instance ) {
384
398
385
399
RelationalPersistentEntity <T > persistentEntity = getRequiredPersistentEntity (instance );
386
400
T preparedInstance = instance ;
387
401
Number previousVersion = null ;
388
402
if (persistentEntity .hasVersionProperty ()) {
389
403
// If the root aggregate has a version property, increment it.
390
- previousVersion = RelationalEntityVersionUtils .getVersionNumberFromEntity (instance ,
391
- persistentEntity , converter );
404
+ previousVersion = RelationalEntityVersionUtils .getVersionNumberFromEntity (instance , persistentEntity , converter );
392
405
393
406
Assert .notNull (previousVersion , "The root aggregate cannot be updated because the version property is null." );
394
407
395
408
long newVersion = previousVersion .longValue () + 1 ;
396
409
397
- preparedInstance = RelationalEntityVersionUtils .setVersionNumberOnEntity (instance , newVersion ,
398
- persistentEntity , converter );
410
+ preparedInstance = RelationalEntityVersionUtils .setVersionNumberOnEntity (instance , newVersion , persistentEntity ,
411
+ converter );
399
412
}
400
- MutableAggregateChange <T > aggregateChange = MutableAggregateChange .forSave (preparedInstance , previousVersion );
401
- jdbcEntityUpdateWriter .write (preparedInstance , aggregateChange );
402
- return aggregateChange ;
413
+ return new EntityAndPreviousVersion <>(preparedInstance , previousVersion );
403
414
}
404
415
405
416
@ SuppressWarnings ("unchecked" )
@@ -489,4 +500,16 @@ private <T> T triggerBeforeDelete(@Nullable T aggregateRoot, Object id, MutableA
489
500
490
501
return null ;
491
502
}
503
+
504
+ private static class EntityAndPreviousVersion <T > {
505
+
506
+ private final T entity ;
507
+ private final Number version ;
508
+
509
+ EntityAndPreviousVersion (T entity , @ Nullable Number version ) {
510
+
511
+ this .entity = entity ;
512
+ this .version = version ;
513
+ }
514
+ }
492
515
}
0 commit comments