|
对于最新的稳定版本,请使用 Spring Data Cassandra 5.0.4! |
从 1.x 迁移到 2.x 的迁移指南
Spring Data for Apache Cassandra 2.0 在从早期版本升级时引入了一系列破坏性变更:
-
将
spring-cql和spring-data-cassandra模块合并为一个模块。 -
将
CqlOperations和CassandraOperations中的异步和同步操作分离到专用的接口和模板中。 -
修订了
CqlTemplateAPI,以与JdbcTemplate保持一致。 -
移除了
CassandraOperations.selectBySimpleIds方法。 -
为
CassandraRepository使用了更好的名称。 -
移除了 Spring Data Cassandra 的
ConsistencyLevel和RetryPolicy类型,改用 DataStax 的ConsistencyLevel和RetryPolicy类型。 -
将 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的构造函数,推荐使用其构建器(builder)。 -
弃用
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.5.10</version>
</dependency>
</dependencies>
通过此次合并,我们将所有 CQL 包都整合进了 Spring Data Cassandra:
-
将
o.s.d.cql移至o.s.d.cassandra.core.cql。 -
将
o.s.d.cql与o.s.d.cassandra.config合并,并展平了 XML 和 Java 的子包。 -
将
CassandraExceptionTranslator和CqlExceptionTranslator移至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(影响映射注解)。 -
将
MapId从o.s.d.c.repository移至o.s.d.c.core.mapping。
[[revised-cqltemplate/cassandratemplate]]
== 修订后的 CqlTemplate/CassandraTemplate
我们从三个方面对 CqlTemplate 和 CassandraTemplate 进行了拆分:
-
CassandraTemplate不再是CqlTemplate,而是使用一个实例,该实例允许复用,并对获取大小(fetch size)、一致性级别(consistency levels)和重试策略(retry policies)进行细粒度控制。 您可以通过CqlOperations获取CassandraTemplate.getCqlOperations()。 由于这一变更,CqlTemplate的依赖注入需要额外的 Bean 配置。 -
CqlTemplate现在体现的是基本的 CQL 操作,而非混合使用高层和低层 API 调用(例如count(…)与execute(…)),并且其精简后的方法集已与 Spring Framework 的JdbcTemplate保持一致,并提供了便捷的回调接口。 -
异步方法在
AsyncCqlTemplate和AsyncCassandraTemplate中通过使用ListenableFuture重新实现。 我们移除了Cancellable以及各种异步回调监听器。ListenableFuture是一种灵活的方式,并允许转换为CompletableFuture。
已移除CassandraOperations.selectBySimpleIds()
该方法已被移除,因为它不支持复杂 ID。 新引入的查询 DSL 允许为单列 ID 使用映射的和复杂的 ID,如下例所示:
cassandraTemplate.select(Query.query(Criteria.where("id").in(…)), Person.class)
更好的命名CassandraRepository
我们将 CassandraRepository 和 TypedIdCassandraRepository 重命名,以使 Spring Data Cassandra 的命名与其他 Spring Data 模块保持一致:
-
将
CassandraRepository重命名为MapIdCassandraRepository -
将
TypedIdCassandraRepository重命名为CassandraRepository -
引入了
TypedIdCassandraRepository,作为已弃用的类型扩展CassandraRepository,以简化迁移过程
已移除 SD CassandraConsistencyLevel和RetryPolicy选择 DataStax 的类型ConsistencyLevel和RetryPolicy类型
Spring Data Cassandra 的 ConsistencyLevel 和 RetryPolicy 已被移除。
请使用 DataStax 驱动程序提供的类型。
Spring Data Cassandra 的类型限制了 Cassandra 原生驱动程序所提供和允许使用的功能。 因此,每当驱动程序引入新功能时,Spring Data Cassandra 的类型都需要进行更新。
将 CQL 规范重构为值对象和配置器
尽可能地,CQL 规范类型现在都是值类型(例如 FieldSpecification、AlterColumnSpecification),并通过静态工厂方法来构造对象。
这使得简单的值对象可以具备不可变性。
对必需属性(例如表名或 keyspace 名称)进行操作的配置器对象(例如 AlterTableSpecification)最初通过静态工厂方法构建,并允许进一步配置,直到达到所需的状态。
已重构QueryOptions成为不可变对象
QueryOptions 和 WriteOptions 现在是不可变的,可以通过构建器(builder)创建。
接受 QueryOptions 的方法强制要求传入非空对象,这些对象可通过静态的 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(…) 映射到一个类。