领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Spring Data 2020.0.0
版本包含了 Spring Data for Apache Cassandra 3.1。此版本带来了众多增强功能,改进了现有功能并引入了对精选 Cassandra 4 特性的支持。
通过使用 `@EnableReactiveCassandraAuditing` 注解配置类来启用响应式审计。注册实现 `ReactiveAuditorAware` 的 Bean 用作获取当前审计员的接口。以下示例展示了所需的配置:
@Configuration
@EnableReactiveCassandraAuditing
class ApplicationConfiguration {
@Bean
ReactiveAuditorAware<String> reactiveAuditorAware() {
return …;
}
}
启用响应式审计后,您可以在域类中使用 Spring Data 的审计注解。如果您之前使用过 Spring Data 审计,您可能会注意到与 Spring Data 的命令式用法相比,域模型的设置没有区别。
public class Order implements Persistable<String> {
@Id String orderId;
@CreatedBy String createdBy;
@CreatedDate Instant createdDate;
@LastModifiedBy String lastModifiedBy;
@LastModifiedDate Instant lastModifiedDate;
}
上面展示的域类通过使用 `@CreatedBy` 和 `@LastModifiedBy` 注解的属性来引用审计员。保存创建或修改时间的属性分别使用 `@CreatedDate` 或 `@LastModifiedDate` 进行注解。
您可能已经注意到该域类实现了 `Persistable`。为了正确地将实体标记为已审计,Spring Data 需要知道实体是新的还是应视为已存在于数据库中。通常,这是通过检查 `@Id` 属性是否为 `null` 来实现的。Cassandra 无法生成主键值。新对象必须使用提供的标识符进行持久化。因此,您的域模型必须表达它应该被视为新的还是现有的(参见 `Persistable.isNew()`)。此外,在使用乐观锁定时,Spring Data 可以检查 `@Version` 属性来判断实体是否应该被视为新的。
您可以通过响应式 Cassandra 仓库和 `ReactiveCassandraTemplate` 使用响应式审计。
关于迁移的最后一点说明:引入响应式审计后,整个响应式审计基础设施仅在您的配置类标记有 `@EnableReactiveCassandraAuditing` 时才会注册。之前的版本 (3.0.x) 在配置 `@EnableCassandraAuditing` 时会注册一个名为 `EntityCallback` 的轻量级审计。现在不再是这样了,因此如果您之前使用过审计功能,请务必重新检查基于注解的配置。
您可以在Spring Data Cassandra 参考文档中阅读更多关于使用 Apache Cassandra 进行审计的信息。
Cassandra 4 允许在每个 Statement 级别指定目标 keyspace。单个 Statement 可以指向与当前登录的 keyspace 不同的 keyspace,而不是在登录的 keyspace 中运行 Statement。为了支持此特性,Spring Data for Apache Cassandra 允许通过以下方式配置 keyspace:
在 Template API 上配置 keyspace 允许通过特定的模板在与当前登录的 keyspace 不同的 keyspace 上运行所有 Statement。一个典型的用例可以是每个租户一个 keyspace 的模型。
CqlSession cqlSession = …;
CqlTemplate tenant1Template = new CqlTemplate(cqlSession);
tenant1Template.setKeyspace(CqlIdentifier.fromCql("my-other-keyspace"));
tenant1Template.queryForList("SELECT …");
`CqlTemplate` 及其异步和响应式变体由 `CassandraTemplate` 和仓库基础设施使用,这允许将整个堆栈连接到不同的 keyspace。
要在 `CassandraTemplate` 上为单个操作自定义 keyspace,您可以使用 `QueryOptions` 及其特定于操作的子类来控制 keyspace。
CassandraTemplate template = …;
template.insert(person, InsertOptions.builder().keyspace("my-other-keyspace").build());
请注意,此特性需要 Cassandra 4,并且不影响早期版本的 Cassandra。
在此版本中,我们借此机会完善了 CQL Template API。我们一直希望 `CqlTemplate` 支持 Java 8 Stream,包括在 `CqlTemplate` 上实现透明分页。其响应式对应项 `ReactiveCqlTemplate` 通过 `queryForFlux` 支持此特性(自 2.0 版本起)。在此版本中,您可以在 `CqlTemplate` 上使用 `queryForStream`,从而实现对 `java.util.stream.Stream` 的惰性迭代。
CqlTemplate template = …;
Stream<String> stream = cqlTemplate.queryForStream("SELECT * from USERS", (row, index) -> row.getString(0));
此外,`queryForStream` 为 `CassandraTemplate.stream(…)` 提供支持,用于运行返回实体流的查询。
轻量级数据类和记录(自 Java 15 及更高版本起)的使用正日益成为结果即时映射的流行选择。此版本没有使用面向 Entity 的 `CassandraTemplate`,而是提供了一种更轻量级的模式,可以将查询结果作为普通 Java beans、Kotlin 数据类和 Java records 来消费。`DataClassRowMapper` 是一个专门的 `RowMapper`,它通过检查构造函数属性来实例化遵循数据类/Java records 模式的类。以下示例演示了 Java Records 的用法:
record User(String id, String name, int age){}
CqlTemplate template = …;
Stream<User> stream = cqlTemplate.queryForStream("SELECT * from USERS", new DataClassRowMapper(User.class));
以下是 Kotlin 数据类的变体:
data class User(id: String, name: String, age: Int)
val stream : Stream<Person> = cqlTemplate.queryForStream("SELECT * from USERS", DataClassRowMapper<User>())
您可以将 `DataClassRowMapper` 用于所有 `CqlTemplate` 变体,因为它们都接受 `RowMapper`。