Spring Boot Mongo:在所有数据库中复制所有集合

问题描述 投票:0回答:0

我有一个按域划分的多模块 Maven 项目(如在域驱动设计中)。要求是每个域都有自己的数据库。为了降低成本,现阶段决定让每个数据库在单个 Mongo 服务器上运行,但有自己的配置。

我在下面包含了两个示例配置,但还有更多。

我面临的问题是所有集合都在每个数据库中创建。例如域 A 的数据库也将具有域 B、C 和 D 的集合。域 B 将具有 A、C 和 D 的集合,依此类推。

数据正在持久化到正确的集合中,所有“冗余”的集合都是空的。我想弄清楚如何解决这个问题,以便每个数据库只有它关联实体的集合。

域A配置

@Configuration
@EnableMongoRepositories(
        basePackageClasses = {DomainAMongoRepository.class},
        mongoTemplateRef = "domainAMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainADbMongoConfiguration.class)
public class DomainADbConfig extends AbstractMongoClientConfiguration {
    private final DomainADbMongoConfiguration mongoConfiguration;

    @Autowired
    public DomainADbConfig(DomainADbMongoConfiguration mongoConfiguration) {
        this.mongoConfiguration = mongoConfiguration;
    }

    @Primary
    @Bean(name = "domainAMongoTemplate")
    public MongoTemplate domainAMongoTemplate(
            @Qualifier("domainAMongoDbFactory") MongoDatabaseFactory mongoDbFactory,
            @Qualifier("domainAMongoConverter") MappingMongoConverter mongoConverter
    ) {
        return new MongoTemplate(mongoDbFactory, mongoConverter);
    }

    @Primary
    @Bean(name = "domainAMongoDbFactory")
    public MongoDatabaseFactory mongoDbFactory(
            @Qualifier("domainAMongoClient") MongoClient mongoClient
    ) {
        return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
    }

    @Primary
    @Bean(name = "domainAMongoConverter")
    public MappingMongoConverter mongoConverter() throws Exception {
        MongoMappingContext mongoMappingContext =
                mongoMappingContext(customConversions(), mongoManagedTypes());
        mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
        mongoMappingContext.afterPropertiesSet();

        MappingMongoConverter converter =
                new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), mongoMappingContext);
        converter.setCustomConversions(customConversions());
        converter.afterPropertiesSet();

        return converter;
    }

    @Override
    @Bean(name = "domainAMongoClient")
    @Primary
    public MongoClient mongoClient() {
        return MongoClients.create(
                MongoClientSettings.builder()
                        .uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
                        .applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
                        .build());
    }

    @Override
    protected String getDatabaseName() {
        return mongoConfiguration.getDatabase();
    }
}

@ConfigurationProperties("domain-a.mongo")
class DomainADbMongoConfiguration {
    private String database;
    private String uri;

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}
}

B域配置

@Configuration
@EnableMongoRepositories(
        basePackageClasses = {DomainBTypeMongoRepository.class, DomainBMongoRepository.class},
        mongoTemplateRef = "domainBMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainBDbMongoConfiguration.class)
public class DomainBDbConfig extends AbstractMongoClientConfiguration {
    private final DomainBDbMongoConfiguration mongoConfiguration;

    @Autowired
    public DomainBDbConfig(DomainBDbMongoConfiguration mongoConfiguration) {
        this.mongoConfiguration = mongoConfiguration;
    }

    @Bean(name = "domainBMongoTemplate")
    public MongoTemplate topicMongoTemplate(
            @Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory,
            @Qualifier("domainBMongoConverter") MappingMongoConverter domainBMongoConverter) {
        log.info("Connecting to Mongo DomainBs db");
        return new MongoTemplate(domainBMongoDbFactory, domainBMongoConverter);
    }

    @Bean(name = "domainBMongoDbFactory")
    public MongoDatabaseFactory mongoDbFactory(
            @Qualifier("domainBMongoClient") MongoClient mongoClient) {
        return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
    }

    @Bean(name = "domainBMongoConverter")
    public MappingMongoConverter mongoConverter(
            @Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory) throws Exception {
        MongoMappingContext mongoMappingContext =
                mongoMappingContext(customConversions(), mongoManagedTypes());
        mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
        mongoMappingContext.afterPropertiesSet();

        MappingMongoConverter converter =
                new MappingMongoConverter(
                        new DefaultDbRefResolver(domainBMongoDbFactory), mongoMappingContext);
        converter.setCustomConversions(customConversions());
        converter.afterPropertiesSet();

        return converter;
    }

    @Override
    @Bean(name = "domainBMongoClient")
    public MongoClient mongoClient() {
        return MongoClients.create(
                MongoClientSettings.builder()
                        .uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
                        .applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
                        .build());
    }

    @Override
    protected boolean autoIndexCreation() {
        return true;
    }

    @Override
    protected String getDatabaseName() {
        return mongoConfiguration.getDatabase();
    }
}

@ConfigurationProperties("domainBs.mongo")
class DomainBDbMongoConfiguration {
    private String uri;
    private String database;

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}
mongodb spring-boot spring-data-mongodb
© www.soinside.com 2019 - 2024. All rights reserved.