从 1.x 迁移到 2.x 的指南
Spring Data for Apache Cassandra 2.0 引入了一些重大更改,当从早期版本升级时会影响现有代码:
-
将
spring-cql
和spring-data-cassandra
模块合并为一个单一模块。 -
将
CqlOperations
和CassandraOperations
中的异步和同步操作分离到专用接口和模板中。 -
修改了
CqlTemplate
API,使其与JdbcTemplate
保持一致。 -
移除了
CassandraOperations.selectBySimpleIds
方法。 -
为
CassandraRepository
使用了更好的命名。 -
移除了 SD 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
的构造函数,推荐使用其构建器。 -
弃用
TypedIdCassandraRepository
,推荐使用CassandraRepository
。
合并的 Spring CQL 和 Spring Data Cassandra 模块
Spring CQL 和 Spring Data Cassandra 现在已合并为一个模块。独立的 spring-cql
模块不再可用。所有类型已合并到 spring-data-cassandra
中。以下列表展示了如何将 spring-data-cassandra
包含到您的 maven 依赖中:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>4.4.3</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
,而是使用一个实例,允许重用并对提取大小、一致性级别和重试策略进行精细控制。您可以通过CassandraTemplate.getCqlOperations()
获取CqlOperations
。由于这一变化,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 Cassandra ConsistencyLevel
和 RetryPolicy
类型,改用 DataStax ConsistencyLevel
和 RetryPolicy
类型
Spring Data Cassandra ConsistencyLevel
和 RetryPolicy
已被移除。请使用 DataStax 驱动程序提供的类型。
Spring Data Cassandra 的类型限制了 Cassandra 原生驱动程序提供的可用功能的使用。因此,每当驱动程序引入新功能时,Spring Data Cassandra 的类型都需要进行更新。
重构的 CQL 规范到值对象和配置器
尽可能地,CQL 规范类型现在是值类型(例如 FieldSpecification
、AlterColumnSpecification
),对象通过静态工厂方法构造。这允许简单值对象的不可变性。操作强制属性(例如表名或键空间名)的配置对象(例如 AlterTableSpecification
)最初通过静态工厂方法构造,并允许进一步配置,直到创建所需状态。
重构 QueryOptions
为不可变对象
QueryOptions
和 WriteOptions
现在是不可变的,可以通过构建器创建。接受 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(…)
映射到一个类。