首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring boot初始化Cassandra键空间和表

如何使用Spring boot初始化Cassandra键空间和表
EN

Stack Overflow用户
提问于 2016-02-02 14:42:11
回答 5查看 10.1K关注 0票数 7

我在Spring boot应用程序中使用Cassandra作为数据源,并希望在应用程序启动之前初始化数据库。

到目前为止,我已经定义了一个类"CassandraConfiguration“来扩展"AbstractCassandraConfiguration”类,你可以在下面的例子中看到,并且我有一个扩展"CassandraRepository“的存储库。当我自己创建键空间和表时,应用程序运行良好。

但是,我希望在应用程序启动时自动创建键空间和表。为了做到这一点,我在resources文件夹下提供了一个schema.cql文件,但我无法使该脚本工作。

有人知道我能做些什么来自动创建键空间和表吗?

谢谢。

编辑:我使用的是Cassandra 2.0.9,spring-boot 1.3.2.RELEASE和datastax cassandra driver 2.1.6版本。

CassandraConfiguration.java

代码语言:javascript
复制
@Configuration
@PropertySource(value = { "classpath:cassandra.properties" })
@EnableCassandraRepositories(basePackages = { "bla.bla.bla.repository" })
public class CassandraConfiguration extends AbstractCassandraConfiguration {

    @Autowired
    private Environment environment;


    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
        cluster.setContactPoints( environment.getProperty( "cassandra.contactpoints" ) );
        cluster.setPort( Integer.parseInt( environment.getProperty( "cassandra.port" ) ) );
        return cluster;
    }


    @Bean
    public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
        return new BasicCassandraMappingContext();
    }


    @Bean
    public CassandraConverter converter() throws ClassNotFoundException {
        return new MappingCassandraConverter(cassandraMapping());
    }


    @Override
    protected String getKeyspaceName() {
        return environment.getProperty( "cassandra.keyspace" );
    }


    @Bean
    public CassandraSessionFactoryBean session() throws Exception {

        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster().getObject());
        session.setKeyspaceName(environment.getProperty("cassandra.keyspace"));
        session.setConverter(converter());
        session.setSchemaAction(SchemaAction.NONE);

        return session;
    }


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

回答 5

Stack Overflow用户

发布于 2018-02-18 06:52:25

如果你在这方面仍然有问题,在Java Boot2和SD Cassandra2.0.3中,你可以做这个简单的配置,并设置所有开箱即用的东西。

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

    /*
     * Provide a contact point to the configuration.
     */
    @Override
    public String getContactPoints() {
        return "exampleContactPointsUrl";
    }

    /*
     * Provide a keyspace name to the configuration.
     */
    @Override
    public String getKeyspaceName() {
        return "exampleKeyspace";
    }

    /*
     * Automatically creates a Keyspace if it doesn't exist
     */
    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        CreateKeyspaceSpecification specification = CreateKeyspaceSpecification
                .createKeyspace("exampleKeyspace").ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true).withSimpleReplication();
        return Arrays.asList(specification);
    }


    /*
     * Automatically configure a table if doesn't exist
     */
    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }


    /*
     * Get the entity package (where the entity class has the @Table annotation)
     */
    @Override
    public String[] getEntityBasePackages() {
        return new String[] { "com.example.entity" };
    }

你就可以走了

票数 6
EN

Stack Overflow用户

发布于 2017-10-07 01:28:34

您的返回类型BasicCassandraMappingContext()可能已弃用。使用

代码语言:javascript
复制
@Bean
public CassandraMappingContext mappingContext() throws ClassNotFoundException {
    CassandraMappingContext mappingContext= new CassandraMappingContext();
    mappingContext.setInitialEntitySet(getInitialEntitySet());
    return mappingContext;
}
@Override
public String[] getEntityBasePackages() {
    return new String[]{"base-package name of all your entity, annotated 
with @Table"};
}

@Override
protected Set<Class<?>> getInitialEntitySet() throws ClassNotFoundException {
    return CassandraEntityClassScanner.scan(getEntityBasePackages());
}

而不是,

代码语言:javascript
复制
@Bean
public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
    return new BasicCassandraMappingContext();
}

同时设置:

代码语言:javascript
复制
session.setSchemaAction(SchemaAction.RECREATE_DROP_UNUSED);

并排除:

代码语言:javascript
复制
@Override
public SchemaAction getSchemaAction() {
    return SchemaAction.RECREATE_DROP_UNUSED;
}

获取引用here

票数 4
EN

Stack Overflow用户

发布于 2018-08-03 21:41:27

我正在使用spring-boot 1.5.10.RELEASEcassandra 3.0.16,但您可以尝试缩小这两个版本。若要创建键空间,可以从application.ymlapplication.properties导入键空间名称。如果您已经设置了实体基包,那么使用@Table注释,您的表应该会自动生成。

代码语言:javascript
复制
@Value("${cassandra.keyspace}")
private String keySpace;

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

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name(keySpace)
                    .ifNotExists()
    );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35146744

复制
相关文章

相似问题

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