对弹簧的多键空间支持
Spring Data Cassandra是否支持同一应用程序上下文中的多个keyspace存储库? 我正在使用以下JavaConfig类设置cassandra spring数据配置
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace1";
}
在将存储库类移到不同的包后,我尝试创建第二个配置类。
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace2";
}
但是,在这种情况下,如果存储库第一组失败,因为在键空间中找不到实体的配置列族。 我认为它可能是在第二个键空间寻找列家族。
spring-data-cassandra是否支持多个keyspace存储库? 唯一的地方,我找到了多个密钥空间的参考资料。 但是它不能解释这是否可以通过存储库完成?
工作APP示例:http://valchkou.com/spring-boot-cassandra.html#multikeyspace
您需要的想法将覆盖默认的bean:sessionfactory和模板
样品:
1)application.yml
 spring:
  data:
    cassandra:
      test1:
        keyspace-name: test1_keyspace
        contact-points: localhost
      test2:
        keyspace-name: test2_keyspace
        contact-points: localhost
2)基本配置类
public abstract class CassandraBaseConfig extends AbstractCassandraConfiguration{
    protected String contactPoints;
    protected String keyspaceName;
    public String getContactPoints() {
        return contactPoints;
    }
    public void setContactPoints(String contactPoints) {
        this.contactPoints = contactPoints;
    }
    public void setKeyspaceName(String keyspaceName) {
        this.keyspaceName = keyspaceName;
    }
    @Override
    protected String getKeyspaceName() {
        return keyspaceName;
    }
}
3)配置test1的实现
package com.sample.repo.test1;
@Configuration
@ConfigurationProperties("spring.data.cassandra.test1")
@EnableCassandraRepositories(
        basePackages = "com.sample.repo.test1",
        cassandraTemplateRef = "test1Template"
)
public class Test1Config extends CassandraBaseConfig {
    @Override
    @Primary
    @Bean(name = "test1Template")
    public CassandraAdminOperations cassandraTemplate() throws Exception {
        return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
    }
    @Override
    @Bean(name = "test1Session")
    public CassandraSessionFactoryBean session() throws Exception {
        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster().getObject());
        session.setConverter(cassandraConverter());
        session.setKeyspaceName(getKeyspaceName());
        session.setSchemaAction(getSchemaAction());
        session.setStartupScripts(getStartupScripts());
        session.setShutdownScripts(getShutdownScripts());
        return session;
    }
}
4)与test2相同,只需使用不同的软件包包com.sample.repo.test2;
5)在专用包中为每个密钥空间放置回购,即
package com.sample.repo.test1;
@Repository
public interface RepositoryForTest1 extends CassandraRepository<MyEntity> {
// ....
}
package com.sample.repo.test2;
@Repository
public interface RepositoryForTest2 extends CassandraRepository<MyEntity> {
// ....
}
  尝试为每个键空间显式命名CassandraTemplate bean,并在@EnableCassandraRepositories注释的cassandraTemplateRef属性中使用这些名称(有关更改,请参阅/* CHANGED */的行)。 
在你的第一个配置中:
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository",
    /* CHANGED */ cassandraTemplateRef = "template1")
public class CassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace1";
}
/* CHANGED */
@Override
@Bean(name = "template1")
public CassandraAdminOperations cassandraTemplate() throws Exception {
    return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
}
...并在你的第二个配置中:
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository",
    /* CHANGED */ cassandraTemplateRef = "template2")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace2";
}
/* CHANGED */
@Override
@Bean(name = "template2")
public CassandraAdminOperations cassandraTemplate() throws Exception {
    return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
}
我认为这可能会诀窍。 如果没有,请回复。
  似乎建议在由一个会话管理的查询中使用完全限定的密钥空间名称,因为会话不是非常轻量级的。 
  请参阅参考 
