首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-data-cassandra存储库的多键空间支持?

spring-data-cassandra存储库的多键空间支持?
EN

Stack Overflow用户
提问于 2014-09-11 00:01:59
回答 6查看 7.2K关注 0票数 10

Spring Data Cassandra是否支持同一应用程序上下文中的多个密钥空间存储库?我正在使用以下JavaConfig类设置cassandra spring数据配置

代码语言:javascript
复制
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace1";
}

在将存储库类移动到不同的包之后,我尝试创建第二个配置类。

代码语言:javascript
复制
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace2";
}

但是,在这种情况下,第一个set if存储库失败,因为在键空间中找不到为实体配置的列族。我想它可能是在第二个键空间中寻找列族。

spring-data-cassandra是否支持多个密钥空间存储库?我唯一找到多个键空间的引用的地方是here。但它没有解释这是否可以通过存储库来完成?

EN

回答 6

Stack Overflow用户

发布于 2016-07-16 07:15:25

工作应用示例:http://valchkou.com/spring-boot-cassandra.html#multikeyspace

您需要的想法覆盖默认的bean: sessionfactory和template

示例:

1) application.yml

代码语言:javascript
复制
 spring:
  data:
    cassandra:
      test1:
        keyspace-name: test1_keyspace
        contact-points: localhost
      test2:
        keyspace-name: test2_keyspace
        contact-points: localhost

2)基本配置类

代码语言:javascript
复制
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的配置实现

代码语言:javascript
复制
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)将每个密钥空间的repo放在专用包中,即

代码语言:javascript
复制
package com.sample.repo.test1;

@Repository
public interface RepositoryForTest1 extends CassandraRepository<MyEntity> {
// ....
}


package com.sample.repo.test2;

@Repository
public interface RepositoryForTest2 extends CassandraRepository<MyEntity> {
// ....
}
票数 5
EN

Stack Overflow用户

发布于 2014-09-19 21:50:07

尝试显式地为每个键空间命名CassandraTemplate bean,并在@EnableCassandraRepositories注释的cassandraTemplateRef属性中使用这些名称(有关更改,请参阅带有/* CHANGED */的行)。

在您的第一个配置中:

代码语言:javascript
复制
@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());
}

第二个配置中的...and:

代码语言:javascript
复制
@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());
}

我认为这可能会起作用。如果没有,请回帖。

票数 2
EN

Stack Overflow用户

发布于 2015-04-04 08:26:18

似乎建议在由一个会话管理的查询中使用完全限定的键空间名称,因为该会话不是非常轻量级的。

请参阅参考here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25770043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档