From d95b5592a789360093f06889438650f8600652ba Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 25 Aug 2022 14:18:32 +0200 Subject: [PATCH] Avoid noop update for Id only aggregates. Closes #1309 --- .../jdbc/core/convert/DefaultDataAccessStrategy.java | 7 ++++++- .../core/convert/SqlIdentifierParameterSource.java | 4 ++++ .../core/JdbcAggregateTemplateIntegrationTests.java | 10 ++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java index 48759606..640fe869 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java @@ -139,7 +139,12 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { */ @Override public boolean update(S instance, Class domainType) { - return operations.update(sql(domainType).getUpdate(), sqlParametersFactory.forUpdate(instance, domainType)) != 0; + + SqlIdentifierParameterSource parameterSource = sqlParametersFactory.forUpdate(instance, domainType); + if (parameterSource.size() <= 1) { + return true; // returning true, because conceptually the one row was correctly updated + } + return operations.update(sql(domainType).getUpdate(), parameterSource) != 0; } /* diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java index aaa677a8..b9e06405 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java @@ -81,4 +81,8 @@ class SqlIdentifierParameterSource extends AbstractSqlParameterSource { addValue(identifier, others.getValue(name), others.getSqlType(name)); } } + + int size() { + return namesToValues.size(); + } } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java index 497ecca7..c57a66c9 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java @@ -983,6 +983,16 @@ class JdbcAggregateTemplateIntegrationTests { assertThat(template.save(entity).id).isNotNull(); } + @Test // GH-1309 + void updateIdOnlyAggregate() { + + WithIdOnly entity = new WithIdOnly(); + + assertThat(template.save(entity).id).isNotNull(); + + template.save(entity); + } + @Test // GH-1232 @EnabledOnFeature(IS_HSQL) void beforeSaveCallbackEffectsAreVisibleForInsert() {