領先一步
VMware 提供訓練和認證,以加速您的進展。
瞭解更多在 Spring Data JDBC 2.0 中,我們不得不引入一些重大變更。本文的目的是協助您完成遷移過程。
針對自訂欄位和表格名稱使用預設字母大小寫,或針對表格產生,完全按照註釋中的用法來引號名稱。
使用 AbstractJdbcConfiguration
來自訂應用程式內容的配置。
檢閱事件處理程式碼,並確保您嘗試使用的資料不是 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)
);
表格名稱必須加上引號,因為它是以小寫字母給出的,但 H2 預設會將未加上引號的 SQL 識別碼轉換為大寫。
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;
}
AggregateChange
和 DbAction
不可變您可能在事件處理常式或回呼方法中遇到過這些。過去它們是可變的,但這幾乎不可能以有意義的方式使用。此外,實際上不可能以穩定的方式支援它。因此,它被移除且沒有替換。
如果您有一個實際變更這些執行個體的使用案例,請在我們的問題追蹤器中建立一個 issue。
Spring Data JDBC 現在有一個 Dialect
介面,並且對於完全支援的資料庫,它附帶一個相符的實作。
支援的資料庫有
DB2
HSQLDB
H2
MySQL 和 MariaDB
Postgres
SQL Server
目前正在 開發 Oracle 支援。
如果您使用不同的資料庫,則您的應用程式將無法啟動。在這種情況下,您必須
實作您自己的 Dialect
。
實作一個 JdbcDialectProvider
,傳回該 Dialect
。
透過將檔案 spring.factories
放在您類別路徑的 META-INF
資料夾中並新增行 org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<JdbcDialectProvider 的完整名稱>
來註冊提供者
在我們能夠發布本文之前,有人已經在 Stack Overflow 上寫了一個很棒的答案,說明如何做到這一點。
如果沒有可用的實體(例如,對於刪除事件),則事件僅提供實體的 ID。 如果事件中有可用的實體,則不會依序提供 ID,以避免尋找然後可能不會使用的值。 之前使用 Optional
值的事件現在使用可為 null 的值。 因此,您應該仔細檢閱您的事件接聽程式。