3

我的 Spring Data Cassandra 配置如下所示:

@Configuration
@EnableCassandraRepositories(basePackages = {
        "mypackage.repository.cassandra",
})
public class DistributedRepositoryConfiguration  {

    // ...

    @Bean
    public CassandraSessionFactoryBean session() throws Exception {

      CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
      session.setCluster(cluster().getObject());
      session.setKeyspaceName(configuration.get().getKeyspace());
      session.setConverter(converter());
      session.setSchemaAction(SchemaAction.CREATE);

      return session;
    }

}

一般来说,Spring Data Cassandra 在我的项目中工作。但是,当我启动我的应用程序时,我没有创建任何表。谁能告诉我我做错了什么?

4

3 回答 3

11

如果您想自动创建表,则文档中没有写好,您应该告诉 cassandra 在哪里查找实体类:

<cassandra:mapping entity-base-packages="your.package" />

如果你想使用注释配置做同样的事情,你必须明确告诉 CassandraTemplate 在哪里寻找它。所以

@Bean
public CassandraSessionFactoryBean session() throws Exception {

    CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
    session.setCluster(cluster().getObject());
    session.setKeyspaceName(keyspaceName);
    session.setConverter(converter());
    session.setSchemaAction(SchemaAction.CREATE);

    return session;
}

@Bean
public CassandraConverter converter() throws Exception {
    return new MappingCassandraConverter(mappingContext());
}

@Bean
public CassandraMappingContext mappingContext() throws Exception {
    BasicCassandraMappingContext bean = new BasicCassandraMappingContext(); 
    bean.setInitialEntitySet(CassandraEntityClassScanner.scan(("package.with.your.entities")));

    return bean;
}

为了轻松做到这一点,我建议使用AbstractCassandraConfiguration并覆盖您需要的方法。

于 2015-05-19T14:34:01.693 回答
0

如果您使用 CassandraDataConfiguration 只是注释了您的基类应用程序:

@EntityScan("mypackage.repository.cassandra")

基本包信息将在 CassandraDataAutoConfiguration.cassandraMapping 方法中使用,以将此包添加到 cassandra 映射。

于 2019-03-11T16:23:59.190 回答
0

我检查了 AbstractCassandraConfiguration 类,发现以下代码:

public String[] getEntityBasePackages() {
    return new String[] { getClass().getPackage().getName() };
}

由于我的配置类不在主包中,因此组件扫描找不到带有 @Table 注释的类。因此,我使用 StartUp 类覆盖了方法“getEntityBasePackages()”,一切正常。

这是我的配置类:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Value("${spring.data.cassandra.keyspace-name}")
    private String keyspaceName;

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

    @Override
    public String[] getEntityBasePackages() {
        return new String[]{AppStartup.class.getPackage().getName()};
    }

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

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

}

使用这个类,您的应用程序应该创建运行所需的键空间和表。

于 2018-06-19T21:44:03.483 回答