1

我的数据在不同的键空间上,我在 Spring Boot 应用程序中有多个键空间,所以我希望我的 cassandra 存储库可以配置不同的键空间,而不是在应用程序级别有一个键空间。在一个春季项目中,我看起来像一个键空间应该可以在存储库级别进行配置。

Cassandra 存储库始终使用application.properties 文件中的密钥空间,如果我扩展AbstractCassandraConfiguration并配置密钥空间和端口,则无法正常工作。我创建了一个实体、CassandraConfig 和存储库,并尝试使用存储库查询和更新实体。请参阅下面的代码。

pom.xml

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-cassandra</artifactId>
        <version>2.0.7.RELEASE</version>
</dependency>

实体代码:-

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Company {
    @PrimaryKey
    private String companyid;
    private String companyName;
    private String address;
    public String getCompanyid() {
        return companyid;
    }
    public void setCompanyid(String companyid) {
        this.companyid = companyid;
    }
    public String getCompanyName() {
        return companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

}

Cassandra 配置代码:-

import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;

@Configuration
@EnableCassandraRepositories(basePackageClasses=CompanyRepository.class)
public class CassandraConfig extends AbstractCassandraConfiguration {

    public String getContactPoints() {
        return "127.0.0.1";
      }
    @Override
    protected String getKeyspaceName() {
        return "CompanyDetails";
    }

}

存储库代码:-

import java.util.List;

    import org.springframework.data.cassandra.repository.CassandraRepository;
    import org.springframework.data.cassandra.repository.Query;
    import org.springframework.stereotype.Repository;

@Repository

    public interface CompanyRepository extends CassandraRepository<Company, String> {
                    @Query(allowFiltering=true)
                    public Company findByCompanyName(String companyname);

                    public List<Company> findAll();
    }

我尝试使用扩展 AbstractCassandraConfiguration 而不是 application.properties 的类为存储库设置键空间。它不起作用 cassandraTemplate 工作正常。我只遇到了存储库的问题。即使我创建和配置 CassandraClusterFactoryBean、CassandraMappingContext、CassandraConverter 和 CassandraSessionFactoryBean bean 存储库也会抛出异常

com.datastax.driver.core.exceptions.InvalidQueryException: No keyspace has been specified. USE a keyspace, or explicitly specify keyspace.tablename
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:147) ~[cassandra-driver-core-3.4.0.jar:na]
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179) ~[cassandra-driver-core-3.4.0.jar:na]

如果我将以下条目添加到 application.properties 文件,那么它工作正常。

spring.data.cassandra.port=9042
spring.data.cassandra.keyspace-name=CompanyDetails
spring.data.cassandra.contact-points=127.0.0.1

是否可以通过扩展 AbstractCassandraConfiguration 类而不是 application.properties 的类为存储库设置键空间?

如果我错过或做错了什么,请随时指出。

4

1 回答 1

0

看起来您忘记创建键位了。getKeySpaceName()告诉 cassandra 你想使用哪个键空间,但如果它不存在,你会得到一个错误。要创建键空间,请使用以下方法:

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name("your_keyspace_name")
                    .ifNotExists()
    );
}
于 2018-08-03T13:54:53.263 回答