diff --git a/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java b/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java index 8c9167330a..4e4a22256d 100644 --- a/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java +++ b/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java @@ -38,6 +38,7 @@ * * @author Jens Schauder * @author Greg Turnquist + * @author Florian Lüdiger */ class BasicRelationalPersistentProperty extends AnnotationBasedPersistentProperty implements RelationalPersistentProperty { @@ -52,6 +53,7 @@ class BasicRelationalPersistentProperty extends AnnotationBasedPersistentPropert private final RelationalMappingContext context; private final Lazy> columnName; + private final Lazy> keyColumnName; /** * Creates a new {@link AnnotationBasedPersistentProperty}. @@ -70,6 +72,8 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity Optional.ofNullable(findAnnotation(Column.class)).map(Column::value)); + this.keyColumnName = Lazy.of(() -> Optional.ofNullable( + findAnnotation(Column.class)).map(Column::keyColumn).filter(keyColumn -> !keyColumn.equals(""))); } /* @@ -116,7 +120,10 @@ public String getReverseColumnName() { @Override public String getKeyColumn() { - return isQualified() ? context.getNamingStrategy().getKeyColumn(this) : null; + if (isQualified()) + return keyColumnName.get().orElseGet(() -> context.getNamingStrategy().getKeyColumn(this)); + else + return null; } @Override diff --git a/src/main/java/org/springframework/data/relational/core/mapping/Column.java b/src/main/java/org/springframework/data/relational/core/mapping/Column.java index 7b91a0ec4e..7d89e27430 100644 --- a/src/main/java/org/springframework/data/relational/core/mapping/Column.java +++ b/src/main/java/org/springframework/data/relational/core/mapping/Column.java @@ -25,6 +25,7 @@ * The annotation to configure the mapping from an attribute to a database column. * * @author Kazuki Shimizu + * @author Florian Lüdiger */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE }) @@ -35,4 +36,9 @@ * The mapping column name. */ String value(); + + /** + * The column name for key columns of List or Map collections. + */ + String keyColumn() default ""; } diff --git a/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java b/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java index eb3cb1a808..95a523c257 100644 --- a/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java +++ b/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java @@ -22,6 +22,7 @@ import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.Date; +import java.util.List; import java.util.UUID; import org.assertj.core.api.SoftAssertions; @@ -33,6 +34,7 @@ * * @author Jens Schauder * @author Oliver Gierke + * @author Florian Lüdiger */ public class BasicRelationalPersistentPropertyUnitTests { @@ -84,6 +86,17 @@ public void detectsAnnotatedColumnName() { .isEqualTo("dummy_last_updated_at"); } + @Test // DATAJDBC-218 + public void detectsAnnotatedColumnAndKeyName() { + + RelationalPersistentEntity entity = context.getRequiredPersistentEntity(DummyEntity.class); + + assertThat(entity.getRequiredPersistentProperty("someList").getColumnName()) + .isEqualTo("dummy_column_name"); + assertThat(entity.getRequiredPersistentProperty("someList").getKeyColumn()) + .isEqualTo("dummy_key_column_name"); + } + private void checkTargetType(SoftAssertions softly, RelationalPersistentEntity persistentEntity, String propertyName, Class expected) { @@ -100,6 +113,9 @@ private static class DummyEntity { private final ZonedDateTime zonedDateTime; private final UUID uuid; + @Column(value="dummy_column_name", keyColumn="dummy_key_column_name") + private List someList; + // DATACMNS-106 private @Column("dummy_name") String name;