我的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在我的项目中工作。但是,当我启动我的应用程序时,我没有创建表。谁能告诉我我做错了什么?
如果你想创建自动表,你应该告诉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并覆盖您需要的方法。
我检查了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;
}
}
使用此类,您的应用程序应创建所需的键空间和表来运行。
如果您使用CassandraDataConfiguration,则只需注释基类应用程序:
@EntityScan( “mypackage.repository.cassandra”)
基本包信息将在CassandraDataAutoConfiguration.cassandraMapping方法中使用,以将此包添加到cassandra映射中。