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 e21a2af4e..e6b905cb8 100644 --- a/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java +++ b/src/main/java/org/springframework/data/mapping/model/BasicPersistentEntity.java @@ -34,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.data.annotation.TypeAlias; +import org.springframework.data.domain.Persistable; import org.springframework.data.mapping.Association; import org.springframework.data.mapping.AssociationHandler; import org.springframework.data.mapping.IdentifierAccessor; @@ -435,6 +436,10 @@ public class BasicPersistentEntity> implement Assert.notNull(bean, "Target bean must not be null!"); assertBeanType(bean); + if (Persistable.class.isAssignableFrom(getType())) { + return new PersistableIdentifierAccessor((Persistable) bean); + } + return hasIdProperty() ? new IdPropertyIdentifierAccessor(this, bean) : NullReturningIdentifierAccessor.INSTANCE; } diff --git a/src/main/java/org/springframework/data/mapping/model/PersistableIdentifierAccessor.java b/src/main/java/org/springframework/data/mapping/model/PersistableIdentifierAccessor.java new file mode 100644 index 000000000..b7a3a9ec0 --- /dev/null +++ b/src/main/java/org/springframework/data/mapping/model/PersistableIdentifierAccessor.java @@ -0,0 +1,32 @@ +package org.springframework.data.mapping.model; + +import org.springframework.data.domain.Persistable; +import org.springframework.data.mapping.IdentifierAccessor; + +/** + * {@link IdentifierAccessor} that invokes {@link Persistable#getId()}. + * + * @author Oliver Gierke + */ +class PersistableIdentifierAccessor implements IdentifierAccessor { + + private final Persistable target; + + /** + * Creates a new {@link PersistableIdentifierAccessor} for the given target. + * + * @param target must not be {@literal null}. + */ + public PersistableIdentifierAccessor(Persistable target) { + this.target = target; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.mapping.IdentifierAccessor#getIdentifier() + */ + @Override + public Object getIdentifier() { + return target.getId(); + } +} diff --git a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java index f06bf9e66..948a02708 100644 --- a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java @@ -40,6 +40,7 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.TypeAlias; +import org.springframework.data.domain.Persistable; import org.springframework.data.mapping.Association; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentEntitySpec; @@ -260,6 +261,14 @@ public class BasicPersistentEntityUnitTests> { }); } + @Test // DATACMNS-1325 + public void supportsPersistableViaIdentifierAccessor() { + + PersistentEntity entity = createEntity(PersistableEntity.class); + + assertThat(entity.getIdentifierAccessor(new PersistableEntity()).getIdentifier(), is((Object) 4711L)); + } + private BasicPersistentEntity createEntity(Class type) { return createEntity(type, null); } @@ -299,4 +308,29 @@ public class BasicPersistentEntityUnitTests> { static class AliasEntityUsingComposedAnnotation {} static class Subtype extends Entity {} + + // DATACMNS-1325 + + static class PersistableEntity implements Persistable { + + private final Long id = 42L; + + /* + * (non-Javadoc) + * @see org.springframework.data.domain.Persistable#getId() + */ + @Override + public Long getId() { + return 4711L; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.domain.Persistable#isNew() + */ + @Override + public boolean isNew() { + return false; + } + } }