From 8e630841624e93b9261557430540b5fe7dd8c529 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 15 May 2020 16:52:17 +0200 Subject: [PATCH] DATAJDBC-412 - Polishing. Added an integration test because you never can tell with databases. --- .../jdbc/core/convert/BasicJdbcConverter.java | 1 + ...itoryCustomConversionIntegrationTests.java | 81 +++++++++++++++++-- ...ryCustomConversionIntegrationTests-db2.sql | 2 + ...oryCustomConversionIntegrationTests-h2.sql | 3 +- ...yCustomConversionIntegrationTests-hsql.sql | 4 +- ...stomConversionIntegrationTests-mariadb.sql | 3 +- ...CustomConversionIntegrationTests-mssql.sql | 1 + ...CustomConversionIntegrationTests-mysql.sql | 3 +- ...tomConversionIntegrationTests-postgres.sql | 3 +- 9 files changed, 88 insertions(+), 13 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java index 0c5921179..508e77081 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java @@ -311,6 +311,7 @@ public class BasicJdbcConverter extends BasicRelationalConverter implements Jdbc private JdbcValue tryToConvertToJdbcValue(@Nullable Object value) { if (canWriteAsJdbcValue(value)) { + Object converted = writeValue(value, ClassTypeInformation.from(JdbcValue.class)); if(converted instanceof JdbcValue) { return (JdbcValue) converted; diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCustomConversionIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCustomConversionIntegrationTests.java index 737d85526..ef9d339aa 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCustomConversionIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCustomConversionIntegrationTests.java @@ -20,12 +20,12 @@ import static org.assertj.core.api.Assertions.*; import java.math.BigDecimal; import java.sql.JDBCType; -import java.util.Optional; +import java.util.Date; +import org.assertj.core.api.SoftAssertions; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -72,7 +72,8 @@ public class JdbcRepositoryCustomConversionIntegrationTests { @Bean JdbcCustomConversions jdbcCustomConversions() { - return new JdbcCustomConversions(asList(BigDecimalToString.INSTANCE, StringToBigDecimalConverter.INSTANCE)); + return new JdbcCustomConversions(asList(StringToBigDecimalConverter.INSTANCE, BigDecimalToString.INSTANCE, + CustomIdReadingConverter.INSTANCE, CustomIdWritingConverter.INSTANCE)); } } @@ -108,20 +109,62 @@ public class JdbcRepositoryCustomConversionIntegrationTests { repository.save(entity); - Optional reloaded = repository.findById(entity.id); + EntityWithStringyBigDecimal reloaded = repository.findById(entity.id).get(); // loading the number from the database might result in additional zeros at the end. - String stringyNumber = reloaded.get().stringyNumber; + String stringyNumber = reloaded.stringyNumber; assertThat(stringyNumber).startsWith(entity.stringyNumber); assertThat(stringyNumber.substring(entity.stringyNumber.length())).matches("0*"); } - interface EntityWithBooleanRepository extends CrudRepository {} + @Test // DATAJDBC-412 + public void saveAndLoadAnEntityWithReference() { + + EntityWithStringyBigDecimal entity = new EntityWithStringyBigDecimal(); + entity.stringyNumber = "123456.78910"; + entity.reference = new OtherEntity(); + entity.reference.created = new Date(); + + repository.save(entity); + + EntityWithStringyBigDecimal reloaded = repository.findById(entity.id).get(); + + // loading the number from the database might result in additional zeros at the end. + SoftAssertions.assertSoftly(softly -> { + String stringyNumber = reloaded.stringyNumber; + softly.assertThat(stringyNumber).startsWith(entity.stringyNumber); + softly.assertThat(stringyNumber.substring(entity.stringyNumber.length())).matches("0*"); + + softly.assertThat(entity.id.value).isNotNull(); + softly.assertThat(reloaded.id.value).isEqualTo(entity.id.value); + + softly.assertThat(entity.reference.id.value).isNotNull(); + softly.assertThat(reloaded.reference.id.value).isEqualTo(entity.reference.id.value); + }); + } + + interface EntityWithBooleanRepository extends CrudRepository {} private static class EntityWithStringyBigDecimal { - @Id Long id; + @Id CustomId id; String stringyNumber; + OtherEntity reference; + } + + private static class CustomId { + + private final Long value; + + CustomId(Long value) { + this.value = value; + } + } + + private static class OtherEntity { + + @Id CustomId id; + Date created; } @WritingConverter @@ -135,7 +178,6 @@ public class JdbcRepositoryCustomConversionIntegrationTests { Object value = new BigDecimal(source); return JdbcValue.of(value, JDBCType.DECIMAL); } - } @ReadingConverter @@ -149,4 +191,27 @@ public class JdbcRepositoryCustomConversionIntegrationTests { return source.toString(); } } + + @WritingConverter + enum CustomIdWritingConverter implements Converter { + + INSTANCE; + + @Override + public Number convert(CustomId source) { + return source.value.intValue(); + } + } + + @ReadingConverter + enum CustomIdReadingConverter implements Converter { + + INSTANCE; + + @Override + public CustomId convert(Number source) { + return new CustomId(source.longValue()); + } + } + } diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-db2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-db2.sql index 5707b888a..e75592d0b 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-db2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-db2.sql @@ -1,3 +1,5 @@ DROP TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL; +DROP TABLE OTHER_ENTITY; CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-h2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-h2.sql index dd3175f7e..d38354569 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-h2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-h2.sql @@ -1 +1,2 @@ -CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id IDENTITY PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id IDENTITY PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID IDENTITY PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-hsql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-hsql.sql index dd3175f7e..78d9c930b 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-hsql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-hsql.sql @@ -1 +1,3 @@ -CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id IDENTITY PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id IDENTITY PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID IDENTITY PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); + diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mariadb.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mariadb.sql index bbf3cfb96..e89bb0d95 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mariadb.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mariadb.sql @@ -1 +1,2 @@ -CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id BIGINT AUTO_INCREMENT PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id BIGINT AUTO_INCREMENT PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mssql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mssql.sql index a9e632f60..533d6e0f4 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mssql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mssql.sql @@ -1 +1,2 @@ CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id BIGINT IDENTITY PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE OTHER_ENTITY ( ID BIGINT IDENTITY PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mysql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mysql.sql index bbf3cfb96..34776fc5a 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mysql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-mysql.sql @@ -1 +1,2 @@ -CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id BIGINT AUTO_INCREMENT PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-postgres.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-postgres.sql index 0852a7512..c376dcf03 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-postgres.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryCustomConversionIntegrationTests-postgres.sql @@ -1 +1,2 @@ -CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id SERIAL PRIMARY KEY, Stringy_number DECIMAL(20,10)) +CREATE TABLE ENTITY_WITH_STRINGY_BIG_DECIMAL ( id SERIAL PRIMARY KEY, Stringy_number DECIMAL(20,10)); +CREATE TABLE OTHER_ENTITY ( ID SERIAL PRIMARY KEY, CREATED DATE, ENTITY_WITH_STRINGY_BIG_DECIMAL INTEGER);