From 82b795dc0aa4498f452796a678a953941f014b22 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Tue, 5 Dec 2023 14:36:01 +0100 Subject: [PATCH 1/2] 1684-converter-not-found - Prepare branch --- pom.xml | 2 +- spring-data-jdbc-distribution/pom.xml | 2 +- spring-data-jdbc/pom.xml | 4 ++-- spring-data-r2dbc/pom.xml | 4 ++-- spring-data-relational/pom.xml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 02461b8e40..d56c5d3837 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index 8d987fb028..13e0b0de7c 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index fddbaab696..7bb803e8e1 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT diff --git a/spring-data-r2dbc/pom.xml b/spring-data-r2dbc/pom.xml index c834dc4cab..e318efd91d 100644 --- a/spring-data-r2dbc/pom.xml +++ b/spring-data-r2dbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-r2dbc - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT Spring Data R2DBC Spring Data module for R2DBC @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 671e71d242..fe74d061bf 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 3.3.0-SNAPSHOT + 3.3.0-1684-converter-not-found-SNAPSHOT From ea86ec7ba279a252b44444f94f1b035df24daf9a Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Tue, 5 Dec 2023 16:03:51 +0100 Subject: [PATCH 2/2] Fix access of root property instead of child property. When the child of a one-to-one relationship has an id, the value for that id gets read in the wrong way. We get the column name for that id use that to access the value in the RowDocument. This results in either no value at all being found or even worse, the value of a root entity with a property of same name being accessed. This is fixed by using the full AggregatePath instead of just the property for accessing that value. Closes #1684 --- .../core/convert/MappingJdbcConverter.java | 2 +- ...JdbcAggregateTemplateIntegrationTests.java | 14 +++++++++++++ .../MappingJdbcConverterUnitTests.java | 20 +++++++++++++++++++ ...cAggregateTemplateIntegrationTests-db2.sql | 17 +++++++++++++++- ...bcAggregateTemplateIntegrationTests-h2.sql | 13 +++++++++++- ...AggregateTemplateIntegrationTests-hsql.sql | 12 +++++++++++ ...regateTemplateIntegrationTests-mariadb.sql | 13 +++++++++++- ...ggregateTemplateIntegrationTests-mssql.sql | 17 +++++++++++++++- ...ggregateTemplateIntegrationTests-mysql.sql | 14 ++++++++++++- ...gregateTemplateIntegrationTests-oracle.sql | 16 ++++++++++++++- ...egateTemplateIntegrationTests-postgres.sql | 16 ++++++++++++++- 11 files changed, 146 insertions(+), 8 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverter.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverter.java index 746fd3664e..75c5d4c9af 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverter.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverter.java @@ -327,7 +327,7 @@ private ResolvingRelationalPropertyValueProvider(AggregatePathValueProvider dele this.accessor = accessor; this.context = context; this.identifier = path.isEntity() - ? potentiallyAppendIdentifier(identifier, path.getRequiredLeafEntity(), delegate::getPropertyValue) + ? potentiallyAppendIdentifier(identifier, path.getRequiredLeafEntity(), property -> delegate.getValue(path.append(property))) : identifier; } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/AbstractJdbcAggregateTemplateIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/AbstractJdbcAggregateTemplateIntegrationTests.java index 7ccf063687..c7ac9275ab 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/AbstractJdbcAggregateTemplateIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/AbstractJdbcAggregateTemplateIntegrationTests.java @@ -1265,6 +1265,16 @@ void mapWithEnumKey() { assertThat(enumMapOwners).containsExactly(enumMapOwner); } + @Test // GH-1684 + void oneToOneWithIdenticalIdColumnName(){ + + WithOneToOne saved = template.insert(new WithOneToOne("one", new Referenced(23L))); + + WithOneToOne reloaded = template.findById(saved.id, WithOneToOne.class); + + assertThat(reloaded).isEqualTo(saved); + } + private void saveAndUpdateAggregateWithVersion(VersionedAggregate aggregate, Function toConcreteNumber) { saveAndUpdateAggregateWithVersion(aggregate, toConcreteNumber, 0); @@ -2086,6 +2096,10 @@ record Book(String name) { record EnumMapOwner(@Id Long id, String name, Map map) { } + record WithOneToOne(@Id String id,@MappedCollection(idColumn = "renamed") Referenced referenced){} + + record Referenced(@Id Long id) { + } @Configuration @Import(TestConfiguration.class) diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverterUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverterUnitTests.java index 69ef266a78..c56f6d41ab 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverterUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/MappingJdbcConverterUnitTests.java @@ -30,6 +30,7 @@ import java.time.ZonedDateTime; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.UUID; import org.assertj.core.api.SoftAssertions; @@ -39,8 +40,10 @@ import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; import org.springframework.data.jdbc.core.mapping.JdbcValue; import org.springframework.data.jdbc.support.JdbcUtil; +import org.springframework.data.relational.core.mapping.MappedCollection; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; +import org.springframework.data.relational.domain.RowDocument; import org.springframework.data.util.TypeInformation; /** @@ -139,6 +142,17 @@ void conversionOfPrimitiveArrays() { assertThat(typeFactory.arraySource).containsExactly(1, 2, 3, 4, 5); } + @Test // GH-1684 + void accessesCorrectValuesForOneToOneRelationshipWithIdenticallyNamedIdProperties() { + + RowDocument rowdocument = new RowDocument(Map.of("ID", "one", "REFERENCED_ID", 23)); + + WithOneToOne result = converter.readAndResolve(WithOneToOne.class, rowdocument); + + assertThat(result).isEqualTo(new WithOneToOne("one", new Referenced(23L))); + } + + private void checkConversionToTimestampAndBack(SoftAssertions softly, RelationalPersistentEntity persistentEntity, String propertyName, Object value) { @@ -284,4 +298,10 @@ public Array createArray(Object[] value) { return mock(Array.class); } } + + record WithOneToOne(@Id String id,@MappedCollection(idColumn = "renamed") Referenced referenced){} + + record Referenced(@Id Long id) { + } + } diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql index f548340523..52e70b178e 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql @@ -52,6 +52,10 @@ DROP TABLE AUTHOR; DROP TABLE ENUM_MAP_OWNER; +DROP TABLE REFERENCED; +DROP TABLE WITH_ONE_TO_ONE; + + CREATE TABLE LEGO_SET ( "id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, @@ -428,4 +432,15 @@ CREATE TABLE ENUM_MAP_OWNER ( ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql index 982b9e3163..7a87c5df23 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql @@ -385,4 +385,15 @@ CREATE TABLE ENUM_MAP_OWNER ( ID SERIAL PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql index 3ae51989a5..054f8a171c 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql @@ -387,3 +387,15 @@ CREATE TABLE ENUM_MAP_OWNER ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, NAME VARCHAR(100) ); + + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql index 5e318e222f..52f57d5472 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql @@ -359,4 +359,15 @@ CREATE TABLE ENUM_MAP_OWNER ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + `renamed` VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql index 8323608b80..c623581f82 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql @@ -401,4 +401,19 @@ CREATE TABLE ENUM_MAP_OWNER ( ID BIGINT IDENTITY PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + + +DROP TABLE REFERENCED; +DROP TABLE WITH_ONE_TO_ONE; + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql index a6989938c5..a2cb9a4eac 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql @@ -364,4 +364,16 @@ CREATE TABLE ENUM_MAP_OWNER ( ID BIGINT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + `renamed` VARCHAR(100), + ID BIGINT +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql index 6f1700dff4..8cc59fdb5e 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql @@ -42,6 +42,9 @@ DROP TABLE AUTHOR CASCADE CONSTRAINTS PURGE; DROP TABLE ENUM_MAP_OWNER CASCADE CONSTRAINTS PURGE; +DROP TABLE REFERENCED CASCADE CONSTRAINTS PURGE; +DROP TABLE WITH_ONE_TO_ONE CASCADE CONSTRAINTS PURGE; + CREATE TABLE LEGO_SET ( "id1" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY, @@ -409,4 +412,15 @@ CREATE TABLE ENUM_MAP_OWNER ( ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID NUMBER +); diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql index 72b88cddfd..bc7df72a41 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql @@ -45,6 +45,9 @@ DROP TABLE AUTHOR; DROP TABLE ENUM_MAP_OWNER; +DROP TABLE REFERENCED; +DROP TABLE WITH_ONE_TO_ONE; + CREATE TABLE LEGO_SET ( "id1" SERIAL PRIMARY KEY, @@ -431,4 +434,15 @@ CREATE TABLE ENUM_MAP_OWNER ( ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, NAME VARCHAR(100) -); \ No newline at end of file +); + +CREATE TABLE WITH_ONE_TO_ONE +( + ID VARCHAR(100) +); + +CREATE TABLE REFERENCED +( + "renamed" VARCHAR(100), + ID BIGINT +);