1717
1818import io .r2dbc .spi .Row ;
1919import io .r2dbc .spi .RowMetadata ;
20- import org .springframework .dao .OptimisticLockingFailureException ;
2120import reactor .core .publisher .Flux ;
2221import reactor .core .publisher .Mono ;
2322
3332import org .springframework .beans .factory .BeanFactoryAware ;
3433import org .springframework .core .convert .ConversionService ;
3534import org .springframework .dao .DataAccessException ;
35+ import org .springframework .dao .OptimisticLockingFailureException ;
3636import org .springframework .dao .TransientDataAccessResourceException ;
3737import org .springframework .data .mapping .IdentifierAccessor ;
3838import org .springframework .data .mapping .MappingException ;
@@ -377,7 +377,7 @@ <T> Mono<T> doInsert(T entity, SqlIdentifier tableName) {
377377
378378 RelationalPersistentEntity <T > persistentEntity = getRequiredEntity (entity );
379379
380- setVersionIfNecessary (persistentEntity , entity );
380+ setVersionIfNecessary (persistentEntity , entity );
381381
382382 return this .databaseClient .insert () //
383383 .into (persistentEntity .getType ()) //
@@ -388,6 +388,7 @@ <T> Mono<T> doInsert(T entity, SqlIdentifier tableName) {
388388 }
389389
390390 private <T > void setVersionIfNecessary (RelationalPersistentEntity <T > persistentEntity , T entity ) {
391+
391392 RelationalPersistentProperty versionProperty = persistentEntity .getVersionProperty ();
392393 if (versionProperty == null ) {
393394 return ;
@@ -418,45 +419,37 @@ public <T> Mono<T> update(T entity) throws DataAccessException {
418419
419420 DatabaseClient .UpdateSpec updateSpec = updateMatchingSpec ;
420421 if (persistentEntity .hasVersionProperty ()) {
422+
421423 updateSpec = updateMatchingSpec .matching (createMatchingVersionCriteria (entity , persistentEntity ));
422424 incrementVersion (entity , persistentEntity );
423425 }
424426
425427 return updateSpec .fetch () //
426428 .rowsUpdated () //
427- .flatMap (rowsUpdated -> rowsUpdated == 0
428- ? handleMissingUpdate (entity , persistentEntity ) : Mono .just (entity ));
429+ .flatMap (rowsUpdated -> rowsUpdated == 0 ? handleMissingUpdate (entity , persistentEntity ) : Mono .just (entity ));
429430 }
430431
431432 private <T > Mono <? extends T > handleMissingUpdate (T entity , RelationalPersistentEntity <T > persistentEntity ) {
432- if (!persistentEntity .hasVersionProperty ()) {
433- return Mono .error (new TransientDataAccessResourceException (
434- formatTransientEntityExceptionMessage (entity , persistentEntity )));
435- }
436433
437- return doCount (getByIdQuery (entity , persistentEntity ), entity .getClass (), persistentEntity .getTableName ())
438- .map (count -> {
439- if (count == 0 ) {
440- throw new TransientDataAccessResourceException (
441- formatTransientEntityExceptionMessage (entity , persistentEntity ));
442- } else {
443- throw new OptimisticLockingFailureException (
444- formatOptimisticLockingExceptionMessage (entity , persistentEntity ));
445- }
446- });
434+ return Mono .error (persistentEntity .hasVersionProperty ()
435+ ? new OptimisticLockingFailureException (formatOptimisticLockingExceptionMessage (entity , persistentEntity ))
436+ : new TransientDataAccessResourceException (formatTransientEntityExceptionMessage (entity , persistentEntity )));
447437 }
448438
449439 private <T > String formatOptimisticLockingExceptionMessage (T entity , RelationalPersistentEntity <T > persistentEntity ) {
440+
450441 return String .format ("Failed to update table [%s]. Version does not match for row with Id [%s]." ,
451442 persistentEntity .getTableName (), persistentEntity .getIdentifierAccessor (entity ).getIdentifier ());
452443 }
453444
454445 private <T > String formatTransientEntityExceptionMessage (T entity , RelationalPersistentEntity <T > persistentEntity ) {
446+
455447 return String .format ("Failed to update table [%s]. Row with Id [%s] does not exist." ,
456448 persistentEntity .getTableName (), persistentEntity .getIdentifierAccessor (entity ).getIdentifier ());
457449 }
458450
459451 private <T > void incrementVersion (T entity , RelationalPersistentEntity <T > persistentEntity ) {
452+
460453 PersistentPropertyAccessor <?> propertyAccessor = persistentEntity .getPropertyAccessor (entity );
461454 RelationalPersistentProperty versionProperty = persistentEntity .getVersionProperty ();
462455
@@ -471,6 +464,7 @@ private <T> void incrementVersion(T entity, RelationalPersistentEntity<T> persis
471464 }
472465
473466 private <T > Criteria createMatchingVersionCriteria (T entity , RelationalPersistentEntity <T > persistentEntity ) {
467+
474468 PersistentPropertyAccessor <?> propertyAccessor = persistentEntity .getPropertyAccessor (entity );
475469 RelationalPersistentProperty versionProperty = persistentEntity .getVersionProperty ();
476470
0 commit comments