From 24bc432d482722b0302740c9b0819751b79db1ac Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 22 May 2013 12:18:49 +0200 Subject: [PATCH] DATACMNS-332 - AbstractMappingContext now prefers most concrete property. BasicPersistentEntity now only caches the most concrete property for a by-name lookup to mimic the behavior that was implemented in getPersistentProperty(String name). This is to prevent shadowed properties of superclasses leaking into the by-name lookups. Improved AbstractPersistentProperty.toString() to rather render the concrete field it is backed by. --- .../model/AbstractPersistentProperty.java | 2 +- .../mapping/model/BasicPersistentEntity.java | 5 ++++- .../AbstractMappingContextUnitTests.java | 21 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/mapping/model/AbstractPersistentProperty.java b/src/main/java/org/springframework/data/mapping/model/AbstractPersistentProperty.java index e500cc79e..d05ab08db 100644 --- a/src/main/java/org/springframework/data/mapping/model/AbstractPersistentProperty.java +++ b/src/main/java/org/springframework/data/mapping/model/AbstractPersistentProperty.java @@ -316,6 +316,6 @@ public abstract class AbstractPersistentProperty

*/ @Override public String toString() { - return String.format("%s.%s : %s", getOwner().getType().getName(), getName(), getType().getName()); + return this.field.toString(); } } diff --git a/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java b/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java index 83f13d81a..8afd01a61 100644 --- a/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java +++ b/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java @@ -161,7 +161,10 @@ public class BasicPersistentEntity> implement Assert.notNull(property); properties.add(property); - propertyCache.put(property.getName(), property); + + if (!propertyCache.containsKey(property.getName())) { + propertyCache.put(property.getName(), property); + } if (property.isIdProperty()) { diff --git a/src/test/java/org/springframework/data/mapping/context/AbstractMappingContextUnitTests.java b/src/test/java/org/springframework/data/mapping/context/AbstractMappingContextUnitTests.java index 31d7fe255..8df1ba693 100644 --- a/src/test/java/org/springframework/data/mapping/context/AbstractMappingContextUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/context/AbstractMappingContextUnitTests.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.mockito.Mockito; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; +import org.springframework.data.annotation.Id; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PropertyPath; import org.springframework.data.mapping.model.BasicPersistentEntity; @@ -142,6 +143,17 @@ public class AbstractMappingContextUnitTests { assertThat(entity.getPersistentProperty("metaClass"), is(nullValue())); } + /** + * @see DATACMNS-??? + */ + @Test + public void usesMostConcreteProperty() { + + SampleMappingContext mappingContext = new SampleMappingContext(); + PersistentEntity entity = mappingContext.getPersistentEntity(Extension.class); + assertThat(entity.getPersistentProperty("foo").isIdProperty(), is(true)); + } + class Person { String name; } @@ -154,4 +166,13 @@ public class AbstractMappingContextUnitTests { MetaClass metaClass; } + + static class Base { + String foo; + } + + static class Extension extends Base { + @Id + String foo; + } }