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 8b1e729f75..b70eb5f19e 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 @@ -66,6 +66,7 @@ * @author Tyler Van Gorder * @author Milan Milanov * @author Myeonghyeon Lee + * @author Myat Min * @since 1.1 */ public class DefaultDataAccessStrategy implements DataAccessStrategy { @@ -227,7 +228,7 @@ public void delete(Object rootId, PersistentPropertyPath addConvertedPropertyValue(parameterSource, + sqlIdentifier, value, value.getClass())); return parameterSource; } 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 42cdf12822..1da8dae8c2 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 @@ -24,8 +24,10 @@ import lombok.Data; import lombok.RequiredArgsConstructor; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import lombok.Value; import org.junit.Before; @@ -37,11 +39,14 @@ import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; +import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.dialect.HsqlDbDialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; +import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.KeyHolder; @@ -52,6 +57,7 @@ * @author Jens Schauder * @author Mark Paluch * @author Myeonghyeon Lee + * @author Myat Min */ public class DefaultDataAccessStrategyUnitTests { @@ -181,12 +187,64 @@ public void considersConfiguredWriteConverterForIdValueObjects() { assertThat(paramSourceCaptor.getValue().getValue("id")).isEqualTo(rawId); } + @Test // DATAJDBC-587 + public void considersConfiguredWriteConverterForIdValueObjectsWhichReferencedInOneToManyRelationship() { + + DelegatingDataAccessStrategy relationResolver = new DelegatingDataAccessStrategy(); + + Dialect dialect = HsqlDbDialect.INSTANCE; + + JdbcConverter converter = new BasicJdbcConverter(context, relationResolver, + new JdbcCustomConversions(Arrays.asList(IdValueToStringConverter.INSTANCE)), + new DefaultJdbcTypeFactory(jdbcOperations), dialect.getIdentifierProcessing()); + + DefaultDataAccessStrategy accessStrategy = new DefaultDataAccessStrategy( // + new SqlGeneratorSource(context, converter, dialect), // + context, // + converter, // + namedJdbcOperations); + + relationResolver.setDelegate(accessStrategy); + + String rawId = "batman"; + IdValue rootIdValue = new IdValue(rawId); + + DummyEntityRoot root = new DummyEntityRoot(rootIdValue); + DummyEntity child = new DummyEntity(ORIGINAL_ID); + root.dummyEntities.add(child); + + additionalParameters.put(SqlIdentifier.quoted("DUMMYENTITYROOT"), rootIdValue); + accessStrategy.insert(root, DummyEntityRoot.class, Identifier.from(additionalParameters)); + + verify(namedJdbcOperations).update(anyString(), paramSourceCaptor.capture(), + any(KeyHolder.class)); + + assertThat(paramSourceCaptor.getValue().getValue("id")).isEqualTo(rawId); + + PersistentPropertyPath path = + context.getPersistentPropertyPath("dummyEntities", DummyEntityRoot.class); + + accessStrategy.findAllByPath(Identifier.from(additionalParameters), path); + + verify(namedJdbcOperations).query(anyString(), paramSourceCaptor.capture(), + any(RowMapper.class)); + + assertThat(paramSourceCaptor.getValue().getValue("DUMMYENTITYROOT")).isEqualTo(rawId); + } + @RequiredArgsConstructor private static class DummyEntity { @Id private final Long id; } + @RequiredArgsConstructor // DATAJDBC-587 + private static class DummyEntityRoot { + + @Id private final IdValue id; + List dummyEntities = new ArrayList<>(); + } + @AllArgsConstructor private static class EntityWithBoolean {