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。需要注意的另一点是,不能将这两个职责都放在同一个包中。它必须在不同的包装中。要不然整个事情就要折腾了:)谢谢你的努力!干杯!:)