遷移至 Spring Data JDBC 2.0

工程 | Jens Schauder | 2020 年 5 月 20 日 | ...

在 Spring Data JDBC 2.0 中,我們不得不引入一些重大變更。本文的目的是協助您完成遷移過程。

TL;DR

  1. 針對自訂欄位和表格名稱使用預設字母大小寫,或針對表格產生,完全按照註釋中的用法來引號名稱。

  2. 使用 AbstractJdbcConfiguration 來自訂應用程式內容的配置。

  3. 如有必要,請註冊 Dialect.

  4. 檢閱事件處理程式碼,並確保您嘗試使用的資料不是 null

識別碼的引號

Spring Data JDBC 1.x 大多數情況下使用表格和欄位名稱,且不做變更。當您使用 SQL 關鍵字作為屬性或實體名稱,或者嘗試在欄位名稱中使用某些特殊字元時,這會導致問題。

因此,Spring Data JDBC 2.0 預設會為所有識別碼加上引號。這使得名稱區分大小寫,至少對於大多數資料庫而言是如此。由於預設情況下,我們也會將產生的名稱轉換為資料庫使用的預設字母大小寫,因此假設您在 CREATE TABLE 陳述式中沒有使用任何引號(大多數人都是如此),這應該不會造成任何問題。

例如,假設有一個 Student 實體,如下所示

class Student {

    @Id
    Long id;
    String name;
}

H2 的相符表格可能如下所示

CREATE TABLE STUDENT
(
    ID SERIAL PRIMARY KEY,
    NAME  VARCHAR(30)
);

該範例與先前版本的 Spring Data JDBC 相同。當您使用 @Column@Table@MappedCollection 明確指定欄位或表格名稱時,情況會發生變化。在這種情況下,我們假設您指定的名稱與您希望使用的名稱完全相同,因此表格定義必須使用帶引號的識別碼,或者名稱必須使用資料庫的預設字母大小寫,如以下修改後的學生範例所示

@Table("student")
class Student {

    @Id
    Long id;
    @Column("LAST_NAME")
    String name;
}

H2 的相符表格可能如下所示

CREATE TABLE "student" -- (1)
(
    ID SERIAL PRIMARY KEY,
    LAST_NAME  VARCHAR(30) -- (2)
);
  1. 表格名稱必須加上引號,因為它是以小寫字母給出的,但 H2 預設會將未加上引號的 SQL 識別碼轉換為大寫。

  2. LAST_NAME 不需要加上引號,因為它已經使用預設字母大小寫。

請參閱下文,瞭解如果您真的想停用強制引號該怎麼做。

組態

如果您需要自訂 ApplicationContext 的組態,最簡單的方法可能是繼承自 org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration。已移除具有相似名稱和相同目的的其他類別。

在繼承自 AbstractJdbcConfiguration 的組態中,您可以覆寫(例如)jdbcMappingContext,以停用 SQL 識別碼的強制引號。

@Bean
@Override
public JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy, JdbcCustomConversions customConversions) {

	JdbcMappingContext mappingContext = super.jdbcMappingContext(namingStrategy, customConversions);
  mappingContext.setForceQuote(false);

	return mappingContext;
}

AggregateChangeDbAction 不可變

您可能在事件處理常式或回呼方法中遇到過這些。過去它們是可變的,但這幾乎不可能以有意義的方式使用。此外,實際上不可能以穩定的方式支援它。因此,它被移除且沒有替換。

如果您有一個實際變更這些執行個體的使用案例,請在我們的問題追蹤器中建立一個 issue。

方言

Spring Data JDBC 現在有一個 Dialect 介面,並且對於完全支援的資料庫,它附帶一個相符的實作。

支援的資料庫有

  • DB2

  • HSQLDB

  • H2

  • MySQL 和 MariaDB

  • Postgres

  • SQL Server

目前正在 開發 Oracle 支援。

如果您使用不同的資料庫,則您的應用程式將無法啟動。在這種情況下,您必須

  1. 實作您自己的 Dialect

  2. 實作一個 JdbcDialectProvider,傳回該 Dialect

  3. 透過將檔案 spring.factories 放在您類別路徑的 META-INF 資料夾中並新增行 org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<JdbcDialectProvider 的完整名稱> 來註冊提供者

在我們能夠發布本文之前,有人已經在 Stack Overflow 上寫了一個很棒的答案,說明如何做到這一點。

精簡事件

如果沒有可用的實體(例如,對於刪除事件),則事件僅提供實體的 ID。 如果事件中有可用的實體,則不會依序提供 ID,以避免尋找然後可能不會使用的值。 之前使用 Optional 值的事件現在使用可為 null 的值。 因此,您應該仔細檢閱您的事件接聽程式。

取得 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

領先一步

VMware 提供訓練和認證,以加速您的進展。

瞭解更多

取得支援

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

瞭解更多

即將舉辦的活動

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

檢視全部