2016-02-02 7 views
3

Я использую Cassandra в качестве источника данных в моем приложении загрузки Spring и хотел бы инициализировать базу данных до запуска приложения.Как инициализировать пространство ключей и таблицы Cassandra с загрузкой Spring

До сих пор, что я сделал, я определил класс «CassandraConfiguration», расширяющий класс AbstractCassandraConfiguration, как в примерах, которые вы видите ниже, и у меня есть репозиторий, расширяющий «CassandraRepository». Когда я сам создаю пространство ключей и таблицу, приложение отлично работает.

Тем не менее, я хочу создать пространство ключей и таблицы автоматически при запуске приложения. Для этого я предоставил файл schema.cql в папке ресурсов, но я не смог заставить этот скрипт работать.

Кто-нибудь знает, что я могу сделать для автоматического создания ключей и таблиц?

Спасибо.

Редактировать: Я использую Cassandra 2.0.9, spring-boot 1.3.2.RELEASE и драйвер datastax cassandra 2.1.6.

CassandraConfiguration.java

@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; 
    } 
} 
+0

С пружинной загрузкой 1.3 конфигурацией намного проще, увидеть это: http://flnjworkingnotes.blogspot.com/2016/01/tutorial-connecting-to-cassandra -using.html, например. – jny

+1

Моя проблема заключается не в сопоставлении объектов, а в создании таблиц автоматически, если таблица не существует заранее. – frkn

ответ

1

Ваш тип возвращаемого BasicCassandraMappingContext() может быть устаревшим. Используйте

@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()); 
} 

Вместо,

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

также установить:

session.setSchemaAction(SchemaAction.RECREATE_DROP_UNUSED); 

и Исключено:

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

получить ссылку here.

0

Если у вас все еще есть проблемы с этим, в Spring Boot 2 и SD Cassandra 2.0.3 вы можете выполнить эту простую конфигурацию Java и настроить все из коробки.

@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" }; 
    } 

И вы хорошо идти