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 d60fe37c2..33b82a675 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 @@ -124,30 +124,34 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { String insertSql = sqlGenerator.getInsert(new HashSet<>(parameterSource.getIdentifiers())); if (idValue == null) { + return executeInsertAndReturnGeneratedId(domainType, persistentEntity, parameterSource, insertSql); + } else { - KeyHolder holder = new GeneratedKeyHolder(); + operations.update(insertSql, parameterSource); + return null; + } + } - IdGeneration idGeneration = sqlGeneratorSource.getDialect().getIdGeneration(); + @Nullable + private Object executeInsertAndReturnGeneratedId(Class domainType, RelationalPersistentEntity persistentEntity, SqlIdentifierParameterSource parameterSource, String insertSql) { - if (idGeneration.driverRequiresKeyColumnNames()) { + KeyHolder holder = new GeneratedKeyHolder(); - String[] keyColumnNames = getKeyColumnNames(domainType); - if (keyColumnNames.length == 0) { - operations.update(insertSql, parameterSource, holder); - } else { - operations.update(insertSql, parameterSource, holder, keyColumnNames); - } - } else { + IdGeneration idGeneration = sqlGeneratorSource.getDialect().getIdGeneration(); + + if (idGeneration.driverRequiresKeyColumnNames()) { + + String[] keyColumnNames = getKeyColumnNames(domainType); + if (keyColumnNames.length == 0) { operations.update(insertSql, parameterSource, holder); + } else { + operations.update(insertSql, parameterSource, holder, keyColumnNames); } - - return getIdFromHolder(holder, persistentEntity); + } else { + operations.update(insertSql, parameterSource, holder); } - else { - operations.update(insertSql, parameterSource); - return null; - } + return getIdFromHolder(holder, persistentEntity); } /* @@ -462,6 +466,10 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { return parameters; } + /** + * Returns the id value if its not a primitive zero. Returns {@literal null} if the id value is null or a primitive + * zero. + */ @Nullable @SuppressWarnings("unchecked") private ID getIdValueOrNull(S instance, RelationalPersistentEntity persistentEntity) { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java index 51e3043bc..97a10836d 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java @@ -193,7 +193,7 @@ public class DefaultDataAccessStrategyUnitTests { assertThat(paramSourceCaptor.getValue().getValue("DUMMYENTITYROOT")).isEqualTo(rawId); } - @Test // gh-933 + @Test // #933 public void insertWithDefinedIdDoesNotRetrieveGeneratedKeys() { Object generatedId = accessStrategy.insert(new DummyEntity(ORIGINAL_ID), DummyEntity.class, Identifier.from(additionalParameters)); @@ -204,7 +204,7 @@ public class DefaultDataAccessStrategyUnitTests { paramSourceCaptor.capture()); } - @Test // gh-933 + @Test // #933 public void insertWithUndefinedIdRetrievesGeneratedKeys() { when(namedJdbcOperations.update(any(), any(), any())) diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/ConditionsUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/ConditionsUnitTests.java index 48296d813..20f39eb02 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/ConditionsUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/ConditionsUnitTests.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test; */ class ConditionsUnitTests { - @Test // gh-916 + @Test // #916 void notInOfColumnAndExpression() { Table table = Table.create("t");