Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring数据Cassandra动态创建键空间、表和生成表_Java_Spring Boot_Cassandra_Spring Data Cassandra - Fatal编程技术网

Java 使用Spring数据Cassandra动态创建键空间、表和生成表

Java 使用Spring数据Cassandra动态创建键空间、表和生成表,java,spring-boot,cassandra,spring-data-cassandra,Java,Spring Boot,Cassandra,Spring Data Cassandra,使用Cassandra,我想使用SpringBoot应用程序动态创建键空间和表。我正在使用基于Java的配置 我有一个用@Table注释的实体,我想在应用程序启动之前创建它的模式,因为它有预先知道的固定字段 但是,根据登录用户的不同,我还希望为这些用户动态创建其他表,并能够向这些表插入条目 有没有人能告诉我一些我可以利用的资源,或者告诉我如何着手解决这些问题的正确方向。非常感谢你的帮助 最简单的方法是将依赖项添加到Spring Boot应用程序中,如下所示 <dependency>

使用Cassandra,我想使用SpringBoot应用程序动态创建键空间和表。我正在使用基于Java的配置

我有一个用@Table注释的实体,我想在应用程序启动之前创建它的模式,因为它有预先知道的固定字段

但是,根据登录用户的不同,我还希望为这些用户动态创建其他表,并能够向这些表插入条目


有没有人能告诉我一些我可以利用的资源,或者告诉我如何着手解决这些问题的正确方向。非常感谢你的帮助

最简单的方法是将依赖项添加到Spring Boot应用程序中,如下所示

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-cassandra</artifactId>
  <version>1.3.5.RELEASE</version>
</dependency>

org.springframework.boot
到您的应用程序

使用Spring数据Cassandra,您可以通过调用方法,使用
CassandracClusterFactoryBean
(或者更准确地说,子类…
CassandraCqlClusterFactoryBean
)配置应用程序的键空间

这门课很容易解释。您甚至可以使用创建一个,将其添加到
集合
,然后将其传递给
CassandraClusterFactoryBean上的
setKeyspaceCreations(..)
方法

为了生成应用程序的表,基本上只需要使用SD Cassandra注释对应用程序域对象(实体)进行注释,并确保可以在应用程序的类路径上找到域对象/实体

具体来说,您可以让应用程序
@Configuration
类扩展SD Cassandra类。在那里,您将找到可以重写的方法,以提供包含应用程序域对象/实体类的包位置,然后SD Cassandra将使用这些包位置来创建
@Table
域对象/实体

正确识别应用程序
@Table
域对象/实体后,使用
CassandraSessionFactoryBean
方法将SD Cassandra设置为
CREATE
。这将在键空间中为扫描期间找到的所有域对象/实体创建表,为您的
CassandraSessionFactoryBean
提供适当的键空间

显然,如果应用程序创建/使用多个键空间,则需要为每个键空间创建单独的
CassandraSessionFactoryBean
,并为属于特定键空间的实体适当设置
entityBasePackages
配置属性,以便在该键空间中创建关联的表

现在

对于每个用户的“附加”表,这是相当复杂和棘手的

您可以在这里利用Spring概要文件,但是,概要文件通常只在启动时应用。如果不同的用户登录到已经运行的应用程序中,则需要一种方法在运行时为Spring
ApplicationContext
提供额外的
@Configuration

您的Spring Boot应用程序可以插入对
注释ConfigApplicationContext
的引用,然后在登录事件中使用该引用,以编程方式根据登录应用程序的用户添加
@Configuration
类。您需要使用
ApplicationContext.refresh()
跟随您的
register(Class…
调用

您还需要适当地处理表已经存在的情况

SD Cassandra目前不支持这一点,但有关更多详细信息,请参阅

从技术上讲,在运行时为所有用户创建应用程序所需的所有可能的表,并使用Cassandra的安全设置按角色和分配的权限限制单个用户的访问,要简单得多

另一个选项可能只是在用户登录应用程序时根据需要创建临时键空间和/或表,在用户注销时删除它们

显然,这里有很多不同的选择,它更多地归结为架构决策、权衡和考虑,然后是技术可行性,所以要小心

希望这有帮助


干杯

后续spring配置类创建键空间和表(如果它们不存在)

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {
    private static final String KEYSPACE = "my_keyspace";
    private static final String USERNAME = "cassandra";
    private static final String PASSWORD = "cassandra";
    private static final String NODES = "127.0.0.1"; // comma seperated nodes


    @Bean
    @Override
    public CassandraCqlClusterFactoryBean cluster() {
        CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean();
        bean.setKeyspaceCreations(getKeyspaceCreations());
        bean.setContactPoints(NODES);
        bean.setUsername(USERNAME);
        bean.setPassword(PASSWORD);
        return bean;
    }

    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }

    @Override
    protected String getKeyspaceName() {
        return KEYSPACE;
    }

    @Override
    public String[] getEntityBasePackages() {
        return new String[]{"com.panda"};
    }


    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>();
        createKeyspaceSpecifications.add(getKeySpaceSpecification());
        return createKeyspaceSpecifications;
    }

    // Below method creates "my_keyspace" if it doesnt exist.
    private CreateKeyspaceSpecification getKeySpaceSpecification() {
        CreateKeyspaceSpecification pandaCoopKeyspace = new CreateKeyspaceSpecification();
        DataCenterReplication dcr = new DataCenterReplication("dc1", 3L);
        pandaCoopKeyspace.name(KEYSPACE);
        pandaCoopKeyspace.ifNotExists(true).createKeyspace().withNetworkReplication(dcr);
        return pandaCoopKeyspace;
    }

}
@配置
公共类CassandraConfiguration扩展了AbstractCassandraConfiguration{
私有静态最终字符串KEYSPACE=“my_KEYSPACE”;
私有静态最终字符串USERNAME=“cassandra”;
私有静态最终字符串PASSWORD=“cassandra”;
私有静态最终字符串节点=“127.0.0.1”//逗号分隔的节点
@豆子
@凌驾
公共CassandraCqlClusterFactoryBean集群(){
CassandraCqlClusterFactoryBean=新的CassandraCqlClusterFactoryBean();
setKeyspaceCreations(getKeyspaceCreations());
设置触点(节点);
setUsername(USERNAME);
setPassword(PASSWORD);
返回豆;
}
@凌驾
公共SchemaAction getSchemaAction(){
如果不存在,则返回SchemaAction.CREATE\u;
}
@凌驾
受保护的字符串getKeyspaceName(){
返回键空间;
}
@凌驾
公共字符串[]getEntityBasePackages(){
返回新字符串[]{“com.panda”};
}
受保护列表getKeyspaceCreations(){
List createKeyspaceSpecifications=new ArrayList();
添加(getKeySpaceSpecification());
返回CreateKeyspace规范;
}
//下面的方法创建“我的密钥空间”,如果它不存在。
私有CreateKeyspaceSpecification getKeySpaceSpecification(){
CreateKeyspaceSpecification PandaCopKeyspace=新的CreateKeyspaceSpecification();
DataCenterReplication dcr=新的DataCenterReplication(“dc1”,3L);
名称(键空间);
潘德
@Configuration
@PropertySource(value = {"classpath:cassandra.properties"})
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration {

  @Value("${cassandra.keyspace}")
  private String cassandraKeyspace;

  @Override
  protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Collections.singletonList(CreateKeyspaceSpecification.createKeyspace(cassandraKeyspace)
                .ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true)
                .withSimpleReplication());
  }

  @Override
  protected List<String> getStartupScripts() {
    return Collections.singletonList("CREATE TABLE IF NOT EXISTS "+cassandraKeyspace+".test(id UUID PRIMARY KEY, greeting text, occurrence timestamp) WITH default_time_to_live = 600;");
  }

}

spring:
  data:
    cassandra:
      cluster-name: Test Cluster
      keyspace-name: keyspace
      port: 9042
      contact-points:
        - 127.0.0.1

@Configuration
@PropertySource(value = { "classpath:cassandra.yml" })
@ConfigurationProperties("spring.data.cassandra")
@EnableCassandraRepositories(basePackages = "info.vishrantgupta.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Value("${keyspacename}")
    protected String keyspaceName;

    @Override
    protected String getKeyspaceName() {
        return this.keyspaceName;
    }

    @Override
    protected List getKeyspaceCreations() {
        return Collections.singletonList(CreateKeyspaceSpecification
                .createKeyspace(keyspaceName).ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true)
                .withSimpleReplication());
    }

    @Override
    protected List getStartupScripts() {
        return Collections.singletonList("CREATE KEYSPACE IF NOT EXISTS "
                + keyspaceName + " WITH replication = {"
                + " 'class': 'SimpleStrategy', "
                + " 'replication_factor': '3' " + "};");

    }
}
@Value("${cassandra.keyspace}")
private String keySpace;

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name(keySpace)
                    .ifNotExists()
                    .withNetworkReplication(new DataCenterReplication("dc1", 3L)));
}
cassandra:
  keyspace: yout_keyspace_name
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS