Add conversion capabilities to the entity instantiator.

Closes #1646
This commit is contained in:
Jens Schauder
2023-10-17 15:27:57 +02:00
parent 778d368725
commit 6736d8334e
10 changed files with 118 additions and 1 deletions

View File

@@ -1268,6 +1268,16 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
assertThat(reloaded.mapElements.get("delta")).isEqualTo(new MapElement("four"));
}
@Test // GH-1646
void recordOfSet() {
Author tolkien = template.save(new Author(null, Set.of(new Book("Lord of the Rings"))));
Iterable<Author> authors = template.findAll(Author.class);
assertThat(authors).containsExactly(tolkien);
}
private <T extends Number> void saveAndUpdateAggregateWithVersion(VersionedAggregate aggregate,
Function<Number, T> toConcreteNumber) {
saveAndUpdateAggregateWithVersion(aggregate, toConcreteNumber, 0);
@@ -2079,6 +2089,13 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
record MapElement(String name) {
}
record Author(@Id Long id, Set<Book> books) {
}
record Book(String name) {
}
@Configuration
@Import(TestConfiguration.class)
static class Config {

View File

@@ -47,6 +47,9 @@ DROP TABLE MAP_ELEMENT;
DROP TABLE LIST_ELEMENT;
DROP TABLE SET_ELEMENT;
DROP TABLE BOOK;
DROP TABLE AUTHOR;
CREATE TABLE LEGO_SET
(
"id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
@@ -405,3 +408,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -367,3 +367,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID SERIAL PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -368,3 +368,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -341,3 +341,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -379,3 +379,17 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
DROP TABLE BOOK;
DROP TABLE AUTHOR;
CREATE TABLE AUTHOR
(
ID BIGINT IDENTITY PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -346,3 +346,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -37,6 +37,9 @@ DROP TABLE MAP_ELEMENT CASCADE CONSTRAINTS PURGE;
DROP TABLE LIST_ELEMENT CASCADE CONSTRAINTS PURGE;
DROP TABLE SET_ELEMENT CASCADE CONSTRAINTS PURGE;
DROP TABLE BOOK CASCADE CONSTRAINTS PURGE;
DROP TABLE AUTHOR CASCADE CONSTRAINTS PURGE;
CREATE TABLE LEGO_SET
(
"id1" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
@@ -386,3 +389,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR NUMBER,
NAME VARCHAR(100)
);

View File

@@ -40,6 +40,9 @@ DROP TABLE MAP_ELEMENT;
DROP TABLE LIST_ELEMENT;
DROP TABLE SET_ELEMENT;
DROP TABLE BOOK;
DROP TABLE AUTHOR;
CREATE TABLE LEGO_SET
(
"id1" SERIAL PRIMARY KEY,
@@ -408,3 +411,14 @@ CREATE TABLE MAP_ELEMENT
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
NAME VARCHAR(100)
);
CREATE TABLE AUTHOR
(
ID SERIAL PRIMARY KEY
);
CREATE TABLE BOOK
(
AUTHOR BIGINT,
NAME VARCHAR(100)
);

View File

@@ -504,7 +504,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl
entity, contextualizing, context.getPath().getCurrentObject());
return new ConverterAwareSpELExpressionParameterValueProvider(context, evaluator, getConversionService(),
parameterProvider);
new ConvertingParameterValueProvider<>( parameterProvider::getParameterValue));
}
private <S> S populateProperties(ConversionContext context, RelationalPersistentEntity<S> entity,