无法使SchemaAction.CREATE正常工作

时间:2014-12-02 09:50:24

标签: spring-data-cassandra

My 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在我的项目中有效。但是,当我启动我的应用程序时,我没有创建表。谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:9)

如果你想创建自动表,你应该告诉cassandra在哪里查找实体类,在文档中编写得不​​好:

package nuaaagetest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;




public class test {
    public ArrayList<String> getCourselist(String userid) {
        ArrayList<String> courselist = new ArrayList<String>();
        ResultSet rs;
        String str;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/nuaage","root","131209");
            Statement stmt = connect.createStatement();
            rs = stmt.executeQuery("select cnm_sc from SCourse where sid_sc = '"+ userid +"'");
            while(rs.next()){
                str = rs.getString("cnm_sc");
                courselist.add(str);
            }

        }catch(SQLException e) {
            e.printStackTrace();
        }catch(ClassNotFoundException cnfex){
            cnfex.printStackTrace();
        }

        return courselist;
    }

}

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

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

为了轻松完成,我建议使用 AbstractCassandraConfiguration 并覆盖您需要的方法。

答案 1 :(得分: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;
    }

}

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

答案 2 :(得分:0)

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

@EntityScan(“ mypackage.repository.cassandra”)

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