2014-03-29 54 views
1

在Spring数据项目中,如果我使用多种类型的存储库,即JPA存储库和Mongo存储库,并且如果我绑定到CRUD存储库,那么Spring数据如何知道要选择哪个存储库?它可以使用JPA或Mongo。是否基于每个持久实体上的注释@Document@EntitySpring数据存储库

回答

4

存储为Spring数据存储库接口创建的代理的决定仅由于您的配置设置而产生。假设你有以下配置:

@Configuration 
@EnableJpaRepositories("com.acme.foo") 
@EnableMongoRepositories("com.acme.foo") 
class Config { } 

这会在某些时候要炸毁在包com.acme.foo的接口由MongoDB的和JPA基础设施都进行检测。为了解决这个问题,无论是JavaConfig和XML支持允许您定义包括和排除过滤器,这样你既可以使用命名约定,附加注释或类似:

@Configuration 
@EnableJpaRepositories(basePackages = "com.acme.foo", 
         includeFilters = @Filter(JpaRepo.class)) 
@EnableMongoRepositories(base Packages = "com.acme.foo", 
         includeFilters = @Filter(MongoRepo.class)) 
class Config { } 

在这种情况下,两个注解@JpaRepo@MongoRepo (由你创建)将被用于通过注释与它们相关的存储库接口来选择性地触发检测。

真正的自动检测是不可能的,因为很难从存储库接口声明中知道您要将哪个存储区作为目标,并且在创建bean定义的时间点,我们甚至不知道任何存储区进一步的基础设施(EntityManager等)。

+0

这是否意味着我需要在应用程序config xml中提到使用包含过滤器的特定存储库的类?假设答案为假的问题是 - 如果同一实体用于在mongo和JPA存储库中存储,那么是否需要编写不同的存储库? (这对于跨店支持来说可能是个不错的选择,但这仅限于Mongo,我猜) – Milind