Spring Data 2020.0 - Spring Data for Apache Cassandra 3.1 新特性和值得关注之处

工程 | Mark Paluch | 2020 年 11 月 26 日 | ...

Spring Data 2020.0.0 版本包含了 Spring Data for Apache Cassandra 3.1。此版本带来了众多增强功能,改进了现有功能并引入了对精选 Cassandra 4 特性的支持。

  • 响应式审计
  • 在 `@Query` 查询方法中支持响应式 SpEL。
  • 通过 `CqlTemplate` 和 `QueryOptions` 为每个 `Statement` 配置 Keyspace。
  • 修订了 `CqlOperations`,新增 `queryForStream(…)` 方法,返回支持透明分页的 `Stream`。
  • `DataClassRowMapper`:通过构造函数创建/Bean 属性将 Cassandra 结果映射到数据类

响应式审计

通过使用 `@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 进行审计的信息。

每个 Statement 的 Keyspace 配置

Cassandra 4 允许在每个 Statement 级别指定目标 keyspace。单个 Statement 可以指向与当前登录的 keyspace 不同的 keyspace,而不是在登录的 keyspace 中运行 Statement。为了支持此特性,Spring Data for Apache Cassandra 允许通过以下方式配置 keyspace:

  • `CqlTemplate`(包括 `AsyncCqlTemplate` 和 `ReactiveCqlTemplate`)
  • `QueryOptions`(包括子类)

在 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。

修订后的 CqlTemplate 及其异步/响应式变体

在此版本中,我们借此机会完善了 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`。

订阅 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部