diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositories.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositories.java index 1f17eaef..c2ee8694 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositories.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositories.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Import; import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean; +import org.springframework.data.repository.config.DefaultRepositoryBaseClass; /** * Annotation to enable JDBC repositories. Will scan the package of the annotated configuration class for Spring Data @@ -112,4 +113,13 @@ public @interface EnableJdbcRepositories { * be used to create repositories discovered through this annotation. Defaults to {@code defaultDataAccessStrategy}. */ String dataAccessStrategyRef() default ""; + + /** + * Configure the repository base class to be used to create repository proxies for this particular configuration. + * + * @return + * @since 2.1 + */ + Class repositoryBaseClass() default DefaultRepositoryBaseClass.class; + } diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index ce8786ba..82b765af 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -15,6 +15,7 @@ */ package org.springframework.data.jdbc.repository.support; +import java.io.Serializable; import java.util.Optional; import org.springframework.context.ApplicationEventPublisher; @@ -26,6 +27,7 @@ import org.springframework.data.mapping.callback.EntityCallbacks; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; +import org.springframework.data.relational.repository.query.RelationalEntityInformation; import org.springframework.data.repository.core.EntityInformation; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; @@ -115,14 +117,13 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { JdbcAggregateTemplate template = new JdbcAggregateTemplate(publisher, context, converter, accessStrategy); - SimpleJdbcRepository repository = new SimpleJdbcRepository<>(template, - context.getRequiredPersistentEntity(repositoryInformation.getDomainType())); - if (entityCallbacks != null) { template.setEntityCallbacks(entityCallbacks); } - return repository; + RelationalPersistentEntity persistentEntity = context.getRequiredPersistentEntity(repositoryInformation.getDomainType()); + + return getTargetRepositoryViaReflection(repositoryInformation.getRepositoryBaseClass(), template, persistentEntity); } /* diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositoriesIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositoriesIntegrationTests.java index 87d2ec74..ffb04b0d 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositoriesIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositoriesIntegrationTests.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.*; import lombok.Data; import java.lang.reflect.Field; +import java.util.Optional; import javax.sql.DataSource; @@ -33,6 +34,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.data.annotation.Id; +import org.springframework.data.jdbc.core.JdbcAggregateTemplate; import org.springframework.data.jdbc.core.convert.DataAccessStrategy; import org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy; import org.springframework.data.jdbc.core.convert.JdbcConverter; @@ -40,6 +42,7 @@ import org.springframework.data.jdbc.core.convert.SqlGeneratorSource; import org.springframework.data.jdbc.repository.QueryMappingConfiguration; import org.springframework.data.jdbc.repository.config.EnableJdbcRepositoriesIntegrationTests.TestConfiguration; import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean; +import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.repository.CrudRepository; @@ -90,9 +93,10 @@ public class EnableJdbcRepositoriesIntegrationTests { assertThat(repository).isNotNull(); - Iterable all = repository.findAll(); + long count = repository.count(); - assertThat(all).isNotNull(); + // the custom base class has a result of 23 hard wired. + assertThat(count).isEqualTo(23L); } @Test // DATAJDBC-166 @@ -128,7 +132,8 @@ public class EnableJdbcRepositoriesIntegrationTests { @ComponentScan("org.springframework.data.jdbc.testing") @EnableJdbcRepositories(considerNestedRepositories = true, includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = DummyRepository.class), - jdbcOperationsRef = "qualifierJdbcOperations", dataAccessStrategyRef = "qualifierDataAccessStrategy") + jdbcOperationsRef = "qualifierJdbcOperations", dataAccessStrategyRef = "qualifierDataAccessStrategy", + repositoryBaseClass = DummyRepositoryBaseClass.class) static class TestConfiguration { @Bean @@ -162,4 +167,55 @@ public class EnableJdbcRepositoriesIntegrationTests { return DialectResolver.getDialect(operations.getJdbcOperations()); } } + + private static class DummyRepositoryBaseClass{ + + DummyRepositoryBaseClass(JdbcAggregateTemplate template, PersistentEntity persistentEntity) { + + } + + public Object save(Object o) { + return null; + } + + public Iterable saveAll(Iterable iterable) { + return null; + } + + public Optional findById(Object o) { + return Optional.empty(); + } + + public boolean existsById(Object o) { + return false; + } + + public Iterable findAll() { + return null; + } + + public Iterable findAllById(Iterable iterable) { + return null; + } + + public long count() { + return 23L; + } + + public void deleteById(Object o) { + + } + + public void delete(Object o) { + + } + + public void deleteAll(Iterable iterable) { + + } + + public void deleteAll() { + + } + } }