【发布时间】:2016-02-03 20:18:48
【问题描述】:
由于我没有得到my previous question 的答复,我试图调整Spring documentation 中给出的示例以自定义存储库。有一个方法getRepository(Class repositoryInterface) 看起来像它是映射我的存储库覆盖的正确位置:
public class MyRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable>
extends JpaRepositoryFactoryBean<R, T, I> {
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MyRepositoryFactory<>(entityManager);
}
private static class MyRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {
private EntityManager entityManager;
@Resource
private Map<Class<?>, Class<?>> overrideRepositories;
public MyRepositoryFactory(EntityManager entityManager) {
super(entityManager);
this.entityManager = entityManager;
//Test
overrideRepositories = new HashMap<>();
overrideRepositories.put(CustomerRepository.class, Customer2Repository.class);
}
protected Object getTargetRepository(RepositoryMetadata metadata) {
return super.getTargetRepository(metadata);
// return new MyRepositoryImpl<T, I>((Class<T>)
// metadata.getDomainClass(), entityManager);
}
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
// The RepositoryMetadata can be safely ignored, it is used by the
// JpaRepositoryFactory
// to check for QueryDslJpaRepository's which is out of scope.
return JpaRepository.class;
}
@SuppressWarnings("unchecked")
@Override
public <E> E getRepository(Class<E> repositoryInterface, Object customImplementation) {
if (overrideRepositories != null) {
Class<?> override = overrideRepositories.get(repositoryInterface);
if (override != null) {
repositoryInterface = (Class<E>) override;
}
}
return super.getRepository(repositoryInterface, customImplementation);
}
}
}
我是这样配置的:@EnableJpaRepositories(repositoryFactoryBeanClass=MyRepositoryFactoryBean.class)
通常您会自动装配存储库本身,这不起作用,因为有两个具有相同类型和 I don't know how to tell Spring which one to use 的接口。
如果我改为自动装配工厂,我可以在每次需要特定工厂时致电getRepository。但是我如何获得这个工厂呢? Spring Data JPA 是否以某种方式将其公开为 bean?我在谷歌上找不到任何关于此的内容。还是这种方法完全错误?
【问题讨论】:
标签: java spring spring-data spring-data-jpa