Spring:一个实体中有两个存储库

Spring:一个实体中有两个存储库,spring,spring-data,Spring,Spring Data,我需要的是用一个实体创建两个存储库: interface TopicRepository implements ReactiveCrudRepository<Topic, String> interface BackupTopicRepository implements ReactiveCrudRepository<Topic, String> 接口TopicRepository实现reactivecrudepository 接口backupPicRepositor

我需要的是用一个实体创建两个存储库:

interface TopicRepository implements ReactiveCrudRepository<Topic, String>

interface BackupTopicRepository implements ReactiveCrudRepository<Topic, String>
接口TopicRepository实现reactivecrudepository
接口backupPicRepository实现了reactiveCrudepository

这怎么可能?现在只创建了一个。

这就是您要做的

@Configuration
@ConfigurationProperties(prefix = "mongodb.topic")
@EnableMongoRepositories(basePackages = "abc.def.repository.topic", mongoTemplateRef = "topicMongoTemplate")
@Setter
class TopicMongoConfig {

    private String host;
    private int port;
    private String database;

    @Primary
    @Bean(name = "topicMongoTemplate")
    public MongoTemplate topicMongoTemplate() throws Exception {
        final Mongo mongoClient = createMongoClient(new ServerAddress(host, port));
        return new MongoTemplate(mongoClient, database);
    }

     private Mongo createMongoClient(ServerAddress serverAddress) {
        return new MongoClient(serverAddress);
    }
}
另一种配置

@Configuration
@ConfigurationProperties(prefix = "mongodb.backuptopic")
@EnableMongoRepositories(basePackages = "abc.def.repository.backuptopic", mongoTemplateRef = "backupTopicMongoTemplate")
@Setter
class BackupTopicMongoConfig {

    private String host;
    private int port;
    private String database;

    @Primary
    @Bean(name = "backupTopicMongoTemplate")
    public MongoTemplate backupTopicMongoTemplate() throws Exception {
        final Mongo mongoClient = createMongoClient(new ServerAddress(host, port));
        return new MongoTemplate(mongoClient, database);
    }

     private Mongo createMongoClient(ServerAddress serverAddress) {
        return new MongoClient(serverAddress);
    }
}
TopicRepository和BackuTopicRepository应分别位于abc.def.repository.topic和abc.def.repository.backuptopic中

此外,还需要在属性或yml文件中定义这些属性

mongodb: 
   topic:
     host:
     database:
     port:
   backuptopic:
     host:
     database:
     port:
最后,禁用mongo的springboot自动配置

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

但是为什么需要两个存储库呢?使用案例是什么?备份包含一个副本,原始副本可以更新,但也可以还原为备份副本。我相信您可以做到这一点。但是使用MongoDB和Spring Boot 2.0时,底层数据源需要有所不同。如果您使用多个mongo,那么Spring Boot自动配置并没有真正的帮助,您需要自己创建多个MongoTemplate,然后将这些MongoTemplate与您想要使用的存储库绑定。没有简单的方法可以做到这一点,非常感谢您的帮助@pvpkiran。还有一个问题:通过上述配置,我的初始帖子
TopicRepository实现了reactivecrudepository
中是否仍然可以有2个接口存储库,或者我是否必须手动创建我需要的所有语句当然,您可以像以前一样拥有存储库。此配置所做的唯一一件事是通知spring数据在您使用特定respository时要使用哪个mongoTemplate(这是通过使用此行
@EnableMongoRepositories(basePackages=“abc.def.repository.backuptopic”,mongoTemplateRef=“backupTopicMongoTemplate”)
)。因此,我们告诉spring,如果我使用
abc.def.repository.backuptopic
包中的任何存储库,那么就使用backupTopicMongoTemplate。需要注意的另一点是,不能将这两个职责都放在同一个包中。它必须在不同的包装中。要不然整个事情就要折腾了:)谢谢你的努力!干杯!:)