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。
  • 透過 CqlTemplateQueryOptions 設定每個 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 時,才會註冊整個反應式稽核基礎架構。當配置 @EnableCassandraAuditing 時,之前的版本 (3.0.x) 註冊了一個名為 EntityCallback 的輕量級稽核。 現在已經不再是這種情況了,因此如果您之前使用過稽核功能,請務必重新檢查您的基於註釋的配置。

您可以在 使用 Apache Cassandra 進行稽核 中閱讀更多相關訊息,請參考 Spring Data Cassandra 參考文檔

每個 Statement 的 Keyspace 設定

Cassandra 4 允許在每個語句級別指定目標 keyspace。個別語句可以針對不同的 keyspace,而不是在已記錄的 keyspace 中運行語句。為了支援此功能,Spring Data for Apache Cassandra 允許通過以下方式配置 keyspace

  • CqlTemplate (包括 AsyncCqlTemplateReactiveCqlTemplate)
  • QueryOptions (包括子類別)

在 Template API 上配置 keyspace 允許在與已記錄的 keyspace 不同的 keyspace 上通過特定模板運行所有語句。一個典型的用例可以是每個租戶模型的 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));

此外,queryForStreamCassandraTemplate.stream(…) 提供服務,以運行返回實體串流的查詢。

使用輕量級資料類別和記錄 (截至 Java 15 及更高版本) 越來越成為臨時映射結果的流行選擇。此版本啟用了一種更輕量級的模式,以將查詢結果作為普通的 Java bean、Kotlin 資料類別和 Java 記錄使用,而不是使用面向實體的 CassandraTemplateDataClassRowMapper 是一個專用的 RowMapper,它通過檢查其構造函數屬性來實例化遵循資料類別/Java 記錄模式的類別。 以下範例說明了 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 社群中所有即將舉行的活動。

查看所有