Spring Data 的新功能 (Klara Dan von) Neumann?

工程 | Christoph Strobl | 2020 年 5 月 18 日 | ...

Spring Data Neumann 是第一個遵循新的六個月頻率的版本。縮短的時間範圍讓我們能更頻繁地提供新功能,這是在協助您更快行動的關鍵。此版本本身帶有一系列新功能,並包含幾個儲存的重要(可能導致中斷的)升級。

主要版本升級

由於公開 API 或驅動程式中可能發生的重大變更,以下列出的幾個儲存模組需要進行主要版本更新

在繼續選定的新功能之前,讓我們分解一下這些 API 變更。如有疑問,請造訪模組參考文件的升級章節。對於那些擔心升級現在會太痛苦的人來說,之前的 Moore 版本列車仍將存在,並將在未來十二個月內收到更新。

JDBC 每個 SQL 儲存都有其自己的特性,需要進行特定處理。為了更好地支持這一點,必須進行一些變更,從而導致模組的主要版本更新。現在,預設情況下,AbstractJdbcConfiguration 將嘗試從提供的 DataSource 或註冊的 DialectResolver 確定資料庫特定的 Dialect。JDBC 模組開箱即用地提供適用於 H2、HSQLDB、MySQL、Postgres、MariaDB、Microsoft SqlServer 和 DB2 的方言。Spring Data JDBC 現在也預設引用所有表格名稱和欄位。雖然這可能會迫使您調整 CREATE TABLE 語句或 @Column 註釋,但在選擇這些名稱時,它提供了更大的彈性。

MongoDB Spring Data MongoDB 採用了 MongoDB Java 和 reactive streams 4.0 驅動程式生成,讓您可以選擇所需的方法,而不必將另一個方法放在路徑上。因此,同步和 reactive MongoDB 驅動程式現在都是可選的相依性,需要手動添加。使用新的驅動程式,一些已棄用的 API 最終被移除,影響了公開的配置類別,如 AbstractMongoConfiguration 和 Spring Data 實作提供的 XML 命名空間元素。我們在參考文件的 升級章節 中總結了面向公眾的變更。

Apache Cassandra 長期以來對 Apache Cassandra 4.0 驅動程式生成的升級不僅包含其新的套件和資料結構,還包含叢集和會話處理中變更的行為,導致配置發生廣泛變更,當使用 XML 命名空間或比僅使用 AbstractCassandraConfiguration 的預設設定更複雜的場景時,這些變更將滲透到使用者配置中。

Couchbase Couchbase 模組遵循 Couchbase SDK 並從 Version 3.x 升級到 4.x,其中包括自動索引管理和交易支援。請在他們的 Blog 中閱讀完整的故事。

Elasticsearch 此版本增加了對 HTTP Client API、SSL 和 Proxy 支援的支援,以及廣泛的內部變更,其中包括簡化和移除(已棄用的)API,這需要進行主要版本更新。Elasticsearch 模組現在提供一個 Document,涵蓋 Get-Index-Search-Requests,允許對應層使用 SearchHitSearchHitsSearchPage 等類型。

舞台已經準備就緒,讓我們繼續介紹一些新功能。

Kotlin Coroutines 儲存庫

Neumann 版本完成了 Moore 已經開始的故事,透過新增對支援儲存模組的專用 Coroutines 儲存庫的支援,引入了對 Kotlin Coroutines 的一流支援。

coroutines 支援由 Spring Data 的 reactive 儲存庫支援提供支援。因此,可以調用 reactive 查詢方法或擁有原生 suspended 函數。

interface StudentRepository : CoroutineCrudRepository<Student, String> {

    suspend fun findOne(id: String): User

    fun findByLastname(firstname: String): Flow<Student>
}

@Primary 儲存庫和 search 關鍵字

這兩個相當小的改進緩解了儲存庫 bean 查找和查找器方法命名的問題,因為我們現在將 @Primary 註釋從掃描的儲存庫 bean 定義提升到為儲存庫 factory 建立的註釋,這有助於容器在某些情況下解開儲存庫接線。額外的 search 前綴可以用作眾所周知的 find 關鍵字的別名,現在接受 search…By… 模式來進行查詢,例如 searchByFirstname

雖然旨在針對 Elasticsearch 等儲存庫,但讓我們繼續並將新的 search…By… 模式與 Spring Data R2DBC 的最新查詢推導支援一起使用。

R2DBC 查詢推導

到目前為止,除了透過 *.Repository 介面提供的預設值之外,Spring Data R2DBC 在使用時大量使用了儲存庫查找器方法上的 @Query 註釋。Neumann 版本現在透過新增方法名稱查詢推導來彌補了許多其他模組實作的差距,如下面的程式碼片段所示

interface StudentRepository extends ReactiveCrudRepository<Student, Long> {

	Flux<Student> searchByLastname(String lastname); (1)
}
  1. 相當於 @Query("select id, firstname, lastname from customer c where c.lastname = :lastname")

JDBC 的分頁和查詢推導支援

對於關係儲存再多說一點,Spring Data JDBC 2.0 提供了更廣泛的支援資料庫。我們現在使用 H2、HSQLDB、MySQL、MariaDB、PostgreSQL 和 DB2 運行我們的整合測試。

對於這些資料庫,我們支援查詢推導和分頁。使儲存庫像以下這樣成為可能

interface StudentRepository extends PagingAndSortingRepository<Student, Long> {

	Page<Student> findByLastname(String lastname);
}

有了這些,我們將繼續進入 NoSQL 儲存的空間,從 MongoDB 及其修改文檔的新方法開始。

MongoDB 更新彙總

一個重要的增強功能(沒有完全進入 Moore 版本,現在受益於縮短的發布週期)讓您可以將 彙總管道 用於更新操作。透過這樣做,更新可以包含更複雜的語句,例如基於實際欄位值的條件,如下所示

AggregationUpdate update = Aggregation.newUpdate()
    .set("average").toValue(ArithmeticOperators.valueOf("tests").avg())
    .set("grade").toValue(ConditionalOperators.switchCases(
        when(valueOf("average").greaterThanEqualToValue(90)).then("A"),
        when(valueOf("average").greaterThanEqualToValue(80)).then("B"),
        when(valueOf("average").greaterThanEqualToValue(70)).then("C"),
        when(valueOf("average").greaterThanEqualToValue(60)).then("D"))
        .defaultTo("F")
    );

template.update(Student.class)
    .apply(update)
    .all();

已經在考慮下一個版本,Spring Data MongoDB 肯定會受益於最近已新增到其他模組的功能:對嵌入式物件的支援。

針對 Apache Cassandra 的嵌入式類型支援

Apache Cassandra 作為一種以表格為中心的資料儲存庫,將其資料保存在欄位中,現在獲得了對嵌入式類型對應的支援,該支援已經可用於 Spring Data JDBC。 嵌入式實體用於在 Java 域模型中設計值物件,其屬性會被扁平化到表格中。 在以下範例中,Student.name 使用 @Embedded 註解,這會觸發將 Name 的所有屬性摺疊到 student 表格中,該表格由三個欄位組成(student_idfirstnamelastname

public class Student {

    @PrimaryKey("student_id")
    private String studentId;

    @Embedded(onEmpty = USE_NULL)
    Name name;
}

public class Name {
    private String firstname;
    private String lastname;
}

使用 Elasticsearch 進行稽核

由於 id 的存在並不足以判斷實體在 Elasticsearch 中是否為新實體,因此在實作 `Persistable` 時,需要透過 isNew() 方法提供其他資訊,如下所示

@Document(indexName = "person")
public class Person implements Persistable<Long> {

    @Id private Long id;
    private String lastName;
    private String firstName;

    @Field(type = Date)
    private Instant createdDate;
    private String createdBy

    @Field(type = Date)
    private Instant lastModifiedDate;
    private String lastModifiedBy;

    @Override
    public boolean isNew() {
        return id == null || (createdDate == null && createdBy == null);
    }
}

完成上述設定後,將 @EnableElasticsearchAuditing 新增至設定檔會註冊使其運作所需的所有元件。

Neo4j

Spring Data Neo4j 透過替換先前已棄用且現在已移除的佔位符樣式,帶來對 Neo4j 4.0 參數語法的支援。 現在它依賴最新的 Neo4j-OGM 和 Neo4j Java 驅動程式,以便在使用最新版本的 Neo4j 時獲得最佳體驗。

雖然 Neo4j 並非目前發布訓練的一部分(儘管它已準備好被下一個版本採用),但 Neo4j 一直在努力推動對圖形資料庫及其與 Neo4j RX 的 Spring Data 整合的反應式支援。

Apache Geode / VMware Tanzu GemFire

適用於 Apache Geode 和 VMware Tanzu GemFire 的 Spring Data(統稱為 SDG)現在將 spring-data-geodespring-data-gemfire 模組合併到單一專案中。 Apache Geode 已升級到 1.12.0,GemFire 已升級到 9.10.0,它本身基於 Apache Geode 1.12。 此外,SDG 在 JDK 8JDK 14 上建置和執行。

SDG 現在支援 自動交易事件發布,它將 GemFire/Geode Cache TransactionEvent 轉換為在上下文中觸發的適當 ApplicationEvent。

現在也可以在配置了 SDG 的 AEQ 上暫停事件分派。 此外,當使用 SDG 的 @LocatorApplication 註解建置基於 GemFire/Geode 定位器的應用程式時,您現在可以配置定位器以連接到其他定位器,從而形成一個高度可用、高度彈性的叢集。

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

搶先一步

VMware 提供培訓和認證,以加速您的進度。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔。

瞭解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部