Spring-Data-Cassandra SchemaAction 不起作用

Thr*_*ion 5 spring cassandra spring-boot datastax spring-data-cassandra

我正在尝试通过扩展在我的应用程序中配置 CassandraCassandraAutoConfiguration

我使用 springCassandraRepository进行数据库访问,并使用带有o.s.d.cassandra.core.mapping.Table注释的类来定义我的表。

我还配置了以下属性以及集群所需的其他属性

spring: 
  data:
   cassandra:
     schema-action: CREATE_IF_NOT_EXISTS
Run Code Online (Sandbox Code Playgroud)

但应用程序启动时 Cassandra 中不会创建任何表。 schemaActionCassandraProperties 不工作。

如果我在启动时ApplicationRunner通过使用以编程方式创建表cassandraTemplate.getCqlOperations().execute(...),那么一切都会正常工作。

在这种情况下,我可以使用我的存储库。find() 和 save() 方法。只是为了证明我的@table类写得正确

clu*_*ven 4

这是我注意到的行为。这不仅适用于这个特定的键application.yaml

  • 当您不创建任何扩展AbstractCassandraConfigurationspring-data 的 bean 时,spring-data 将读取每个键匹配spring.data.*application.yaml包括您提供的模式操作。(按照惯例)。我没有发现您提供的文件有任何问题,事实上我这里有一个工作示例

  • 当您创建一个扩展 bean 时AbstractCassandraConfiguration,现在您的工作就是显式实现您想要的值,因此请在您的类中添加。您还需要明确提供注释@EnableCassandraRepositories

@Value("${spring.data.cassandra.schema-action}")
private String schemaAction;
    
@Override
public SchemaAction getSchemaAction() {
  return SchemaAction.valueOf(schemaAction);
}
Run Code Online (Sandbox Code Playgroud)

除此之外,我想建议根本不要使用它。Spring Data 很有魅力,但我担心的是:

  • 创建表不仅仅是匹配数据模型的问题。事实上,基于您的用例或 TTL 或任何元数据的压缩策略又如何呢?

  • 我们假设您知道如何使用分区键和集群列正确构建主键,但是如果您需要将完全相同的对象存储在两个表中,因为您有两个不同的查询,该怎么办?(请记住:我需要在应用程序中的任何位置允许过滤=>您的数据模型可能是错误的。