diff --git a/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java b/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java index 0b58e50a4..daa135785 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java @@ -35,6 +35,7 @@ import javax.persistence.metamodel.Type.PersistenceType; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.data.jpa.provider.PersistenceProvider; import org.springframework.data.jpa.util.JpaMetamodel; import org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper; import org.springframework.data.util.ProxyUtils; @@ -147,6 +148,14 @@ public class JpaMetamodelEntityInformation extends JpaEntityInformationSu @SuppressWarnings("unchecked") public ID getId(T entity) { + // check if this is a proxy. If so use Proxy mechanics to access the id. + PersistenceProvider persistenceProvider = PersistenceProvider.fromMetamodel(metamodel); + + if (persistenceProvider.shouldUseAccessorFor(entity)) { + return (ID) persistenceProvider.getIdentifierFrom(entity); + } + + // if not a proxy use Spring mechanics to access the id. BeanWrapper entityWrapper = new DirectFieldAccessFallbackBeanWrapper(entity); if (idMetadata.hasSimpleId()) { diff --git a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java index c01476667..ea99b4b52 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java @@ -301,6 +301,22 @@ public class JpaMetamodelEntityInformationIntegrationTests { assertThat(pk.getSecond()).isEqualTo(42L); } + @Test // DATAJPA-1576 + @Ignore + public void prefersPrivateGetterOverFieldAccess() { + + EntityManagerFactory emf = Persistence.createEntityManagerFactory(getMetadadataPersitenceUnitName()); + EntityManager em = emf.createEntityManager(); + + JpaEntityInformation information = getEntityInformation(EntityWithPrivateIdGetter.class, em); + + EntityWithPrivateIdGetter entity = new EntityWithPrivateIdGetter(); + + Object id = information.getId(entity); + + assertThat(id).isEqualTo(42L); + } + protected String getMetadadataPersitenceUnitName() { return "metadata"; } @@ -358,4 +374,19 @@ public class JpaMetamodelEntityInformationIntegrationTests { Long id; EntityWithIdClassPK reference; } + + @Entity + public static class EntityWithPrivateIdGetter implements Serializable{ + + private long id = 0; + + @Id + private long getId() { + return 42; + } + + public void setId(long id) { + this.id = id; + } + } } diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml index d631f5c35..bf512e274 100644 --- a/src/test/resources/META-INF/persistence.xml +++ b/src/test/resources/META-INF/persistence.xml @@ -100,6 +100,7 @@ org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$Sample org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$EntityWithNestedIdClass org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$EntityWithIdClass + org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$EntityWithPrivateIdGetter true