#87 - Consistently use RowMetadata.

We now apply row metadata checks also for property population.
This commit is contained in:
Mark Paluch
2019-05-22 15:50:02 +02:00
parent 1c9595f221
commit d4a06a781c
2 changed files with 35 additions and 13 deletions

View File

@@ -22,6 +22,7 @@ import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -117,7 +118,7 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
private <R> R read(RelationalPersistentEntity<R> entity, Row row, @Nullable RowMetadata metadata) {
R result = createInstance(row, "", entity);
R result = createInstance(row, metadata, "", entity);
ConvertingPropertyAccessor<R> propertyAccessor = new ConvertingPropertyAccessor<>(
entity.getPropertyAccessor(result), getConversionService());
@@ -208,7 +209,7 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
return null;
}
Object instance = createInstance(row, prefix, entity);
Object instance = createInstance(row, metadata, prefix, entity);
PersistentPropertyAccessor<?> accessor = entity.getPropertyAccessor(instance);
ConvertingPropertyAccessor<?> propertyAccessor = new ConvertingPropertyAccessor<>(accessor, getConversionService());
@@ -222,9 +223,11 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
return (S) instance;
}
private <S> S createInstance(Row row, String prefix, RelationalPersistentEntity<S> entity) {
private <S> S createInstance(Row row, @Nullable RowMetadata rowMetadata, String prefix,
RelationalPersistentEntity<S> entity) {
RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider(row, entity, this, prefix);
RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider(row, rowMetadata, entity, this,
prefix);
return createInstance(entity, rowParameterValueProvider::getParameterValue);
}
@@ -393,16 +396,16 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
private boolean potentiallySetId(Row row, RowMetadata metadata, PersistentPropertyAccessor<?> propertyAccessor,
RelationalPersistentProperty idProperty) {
Map<String, ColumnMetadata> columns = createMetadataMap(metadata);
Collection<String> columns = metadata.getColumnNames();
Object generatedIdValue = null;
if (columns.containsKey(idProperty.getColumnName())) {
if (columns.contains(idProperty.getColumnName())) {
generatedIdValue = row.get(idProperty.getColumnName());
}
if (columns.size() == 1) {
String key = columns.keySet().iterator().next();
String key = columns.iterator().next();
generatedIdValue = row.get(key);
}
@@ -416,7 +419,6 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
return true;
}
@SuppressWarnings("unchecked")
private <R> RelationalPersistentEntity<R> getRequiredPersistentEntity(Class<R> type) {
return (RelationalPersistentEntity<R>) getMappingContext().getRequiredPersistentEntity(type);
}
@@ -436,6 +438,7 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
private static class RowParameterValueProvider implements ParameterValueProvider<RelationalPersistentProperty> {
private final @NonNull Row resultSet;
private final @Nullable RowMetadata metadata;
private final @NonNull RelationalPersistentEntity<?> entity;
private final @NonNull RelationalConverter converter;
private final @NonNull String prefix;
@@ -453,6 +456,10 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
try {
if (metadata != null && !metadata.getColumnNames().contains(column)) {
return null;
}
Object value = resultSet.get(column);
if (value == null) {

View File

@@ -19,8 +19,9 @@ import static org.assertj.core.api.Assertions.*;
import io.r2dbc.spi.ConnectionFactory;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
@@ -37,6 +38,7 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.r2dbc.convert.MappingR2dbcConverter;
import org.springframework.data.r2dbc.core.DefaultReactiveDataAccessStrategy;
import org.springframework.data.r2dbc.core.TransactionalDatabaseClient;
@@ -210,14 +212,27 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg
Flux<Integer> findAllIds();
}
@Data
@Getter
@Setter
@Table("legoset")
@AllArgsConstructor
@NoArgsConstructor
static class LegoSet {
@Id Integer id;
static class LegoSet extends Lego {
String name;
Integer manual;
@PersistenceConstructor
public LegoSet(Integer id, String name, Integer manual) {
super(id);
this.name = name;
this.manual = manual;
}
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
static class Lego {
@Id Integer id;
}
interface Named {