領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多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
時,才會註冊整個反應式稽核基礎架構。當配置 @EnableCassandraAuditing
時,之前的版本 (3.0.x) 註冊了一個名為 EntityCallback
的輕量級稽核。 現在已經不再是這種情況了,因此如果您之前使用過稽核功能,請務必重新檢查您的基於註釋的配置。
您可以在 使用 Apache Cassandra 進行稽核 中閱讀更多相關訊息,請參考 Spring Data Cassandra 參考文檔。
Cassandra 4 允許在每個語句級別指定目標 keyspace。個別語句可以針對不同的 keyspace,而不是在已記錄的 keyspace 中運行語句。為了支援此功能,Spring Data for Apache Cassandra 允許通過以下方式配置 keyspace
CqlTemplate
(包括 AsyncCqlTemplate
和 ReactiveCqlTemplate
)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 版本。
在此版本中,我們藉此機會完善了我們的 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 及更高版本) 越來越成為臨時映射結果的流行選擇。此版本啟用了一種更輕量級的模式,以將查詢結果作為普通的 Java bean、Kotlin 資料類別和 Java 記錄使用,而不是使用面向實體的 CassandraTemplate
。DataClassRowMapper
是一個專用的 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
。