【问题标题】:Spring: 2 Repositories out of a single EntitySpring:单个实体中的 2 个存储库
【发布时间】:2018-07-24 00:27:05
【问题描述】:

我需要的是从单个实体创建的 2 个存储库:

interface TopicRepository implements ReactiveCrudRepository<Topic, String>

interface BackupTopicRepository implements ReactiveCrudRepository<Topic, String>

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

【问题讨论】:

  • 但是为什么需要两个存储库?用例是什么?
  • 备份包含一个副本,原始可以更新,但也可以恢复为备份。
  • 我相信你可以做到这一点。但底层数据源需要不同
  • 我正在使用 MongoDB 和 Spring Boot 2.0 有什么简单的方法吗?
  • 如果您使用多个 mongo,那么 Spring boot 自动配置并没有真正帮助,您需要自己创建多个 mongotemplates,然后将这些 mongotemplates 与您要使用的存储库绑定。这没有简单的方法

标签: spring spring-data


【解决方案1】:

你会这样做。

@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 和 BackuoTopicRepository 应分别位于 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})

【讨论】:

  • 非常感谢@pvpkiran 的帮助。
  • 还有一个问题:通过上述配置,我的初始帖子TopicRepository implements ReactiveCrudRepository&lt;Topic, String&gt; 中是否仍然可以拥有2 个接口存储库,或者我是否必须使用mongoTemplate 手动创建我需要的所有语句?
  • 当然你可以像以前一样拥有存储库。此配置唯一要做的就是通知 spring-data 在您使用特定存储库时使用哪个 mongoTemplate(这是使用此行 @EnableMongoRepositories(basePackages = "abc.def.repository.backuptopic", mongoTemplateRef = "backupTopicMongoTemplate") 完成的)。所以我们告诉spring,如果我使用abc.def.repository.backuptopic包中的任何存储库,那么使用backupTopicMongoTemplate。
  • 还有一点需要注意的是,你不能将两个存储库都放在同一个包中。它必须在不同的包装中。否则整个事情都需要折腾:)
  • 感谢您的努力!干杯! :)
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 2017-12-02
  • 2020-02-06
  • 2019-07-28
  • 2012-03-10
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多