从 1.x 到 2.x 的迁移指南

从早期版本升级时,Spring Data for Apache Cassandra 2.0 引入了一系列重大变更

  • spring-cqlspring-data-cassandra 模块合并为一个模块。

  • CqlOperationsCassandraOperations 中的异步和同步操作分离到专用的接口和模板中。

  • 修订了 CqlTemplate API,使其与 JdbcTemplate 对齐。

  • 移除了 CassandraOperations.selectBySimpleIds 方法。

  • CassandraRepository 使用了更好的名称。

  • 移除了 SD Cassandra 的 ConsistencyLevelRetryPolicy 类型,转而使用 DataStax 的 ConsistencyLevelRetryPolicy 类型。

  • 将 CQL 规范重构为值对象和配置器。

  • QueryOptions 重构为不可变对象。

  • CassandraPersistentProperty 重构为单列。

弃用

  • 弃用 QueryOptionsBuilder.readTimeout(long, TimeUnit),转而使用 QueryOptionsBuilder.readTimeout(Duration)

  • 弃用 CustomConversions,转而使用 CassandraCustomConversions

  • 弃用 BasicCassandraMappingContext,转而使用 CassandraMappingContext

  • 弃用 o.s.d.c.core.cql.CachedPreparedStatementCreator,转而使用 o.s.d.c.core.cql.support.CachedPreparedStatementCreator

  • 弃用 CqlTemplate.getSession(),转而使用 getSessionFactory()

  • 弃用 CqlIdentifier.cqlId(…)KeyspaceIdentifier.ksId(…),转而使用 `.of(…)` 方法。

  • 弃用 QueryOptions 的构造函数,转而使用其构建器。

  • 弃用 TypedIdCassandraRepository,转而使用 CassandraRepository

合并 Spring CQL 和 Spring Data Cassandra 模块

Spring CQL 和 Spring Data Cassandra 现已合并为一个模块。独立的 spring-cql 模块不再可用。你可以在 spring-data-cassandra 中找到所有合并的类型。以下列表展示了如何在 Maven 依赖中包含 spring-data-cassandra

<dependencies>

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-cassandra</artifactId>
    <version>4.4.5</version>
  </dependency>

</dependencies>

合并后,我们将所有 CQL 包合并到 Spring Data Cassandra 中

  • o.s.d.cql 移至 o.s.d.cassandra.core.cql

  • o.s.d.cqlo.s.d.cassandra.config 合并,并展平了 XML 和 Java 子包。

  • CassandraExceptionTranslatorCqlExceptionTranslator 移至 o.s.d.c.core.cql

  • 将 Cassandra 异常 o.s.d.c.support.exception 移至 o.s.d.cassandra

  • o.s.d.c.convert 移至 o.s.d.c.core.convert(影响转换器)。

  • o.s.d.c.mapping 移至 o.s.d.c.core.mapping(影响映射注解)。

  • MapIdo.s.d.c.repository 移至 o.s.d.c.core.mapping

[[revised-cqltemplate/cassandratemplate]] == 修订 CqlTemplate/CassandraTemplate

我们将 CqlTemplateCassandraTemplate 分为三个方面

  • CassandraTemplate 不再是 CqlTemplate,而是使用一个实例,该实例允许对 fetch size、一致性级别和重试策略进行复用和细粒度控制。你可以通过 CassandraTemplate.getCqlOperations() 获取 CqlOperations。由于此变更,CqlTemplate 的依赖注入需要额外的 Bean 设置。

  • CqlTemplate 现在反映的是基本的 CQL 操作,而不是混合高级和低级 API 调用(例如 count(…)` 与 `execute(…)`),并且精简后的方法集与 Spring Framework 的 `JdbcTemplate` 及其便利的回调接口对齐。

  • 异步方法已在 AsyncCqlTemplateAsyncCassandraTemplate 上使用 ListenableFuture 重新实现。我们移除了 Cancellable 和各种异步回调监听器。ListenableFuture 是一种灵活的方法,允许转换为 CompletableFuture

移除了 CassandraOperations.selectBySimpleIds()

此方法被移除是因为它不支持复杂 ID。新引入的查询 DSL 允许对单列 ID 使用映射和复杂 ID,如下例所示

cassandraTemplate.select(Query.query(Criteria.where("id").in(…)), Person.class)

CassandraRepository 使用更好的名称

我们重命名了 CassandraRepositoryTypedIdCassandraRepository,以使 Spring Data Cassandra 的命名与其他 Spring Data 模块对齐

  • CassandraRepository 重命名为 MapIdCassandraRepository

  • TypedIdCassandraRepository 重命名为 CassandraRepository

  • 引入了 TypedIdCassandraRepository,将其作为已弃用类型扩展 CassandraRepository 以方便迁移

移除了 SD Cassandra 的 ConsistencyLevelRetryPolicy 类型,转而使用 DataStax 的 ConsistencyLevelRetryPolicy 类型

Spring Data Cassandra 的 ConsistencyLevelRetryPolicy 已被移除。请使用 DataStax 驱动提供的类型。

Spring Data Cassandra 类型限制了 Cassandra 原生驱动中提供的和允许的可用功能的使用。因此,每当驱动引入新功能时,Spring Data Cassandra 的类型都需要更新。

将 CQL 规范重构为值对象和配置器

CQL 规范类型现在尽可能地是值类型(例如 FieldSpecificationAlterColumnSpecification),并且对象通过静态工厂方法构造。这允许简单的值对象保持不可变性。对强制属性(例如表名或键空间名)进行操作的配置器对象(例如 AlterTableSpecification)最初通过静态工厂方法构造,并允许进一步配置,直到创建所需的状态。

QueryOptions 重构为不可变对象

QueryOptionsWriteOptions 现在是不可变的,可以通过构建器创建。接受 QueryOptions 的方法强制要求非 null 对象,这些对象可以通过静态 empty() 工厂方法获得。以下示例展示了如何使用 QueryOptions.builder()

QueryOptions queryOptions = QueryOptions.builder()
		.consistencyLevel(ConsistencyLevel.ANY)
		.retryPolicy(FallthroughRetryPolicy.INSTANCE)
		.readTimeout(Duration.ofSeconds(10))
		.fetchSize(10)
		.tracing(true)
		.build();

CassandraPersistentProperty 重构为单列

此变更仅影响直接操作映射模型的用户。

CassandraPersistentProperty 之前允许绑定多个列名用于复合主键。CassandraPersistentProperty 的列现在减少到单列。解析后的复合主键通过 MappingContext.getRequiredPersistentEntity(…)` 映射到一个类。