Schema Creation

當使用 SQL 資料庫時,結構描述是不可或缺的一部分。Spring Data JDBC 支援多種結構描述選項,但當從領域模型開始時,提出初始領域模型可能具有挑戰性。為了協助您使用程式碼優先方法,Spring Data JDBC 隨附整合功能,可使用 Liquibase 建立資料庫變更集。

考慮以下領域實體

@Table
class Person {
  @Id long id;
  String firstName;
  String lastName;
  LocalDate birthday;
  boolean active;
}

透過以下程式碼呈現初始 ChangeSet

RelationalMappingContext context = … // The context contains the Person entity, ideally initialized through initialEntitySet
LiquibaseChangeSetWriter writer = new LiquibaseChangeSetWriter(context);

writer.writeChangeSet(new FileSystemResource(new File(…)));

產生以下變更日誌

databaseChangeLog:
- changeSet:
    id: '1685969572426'
    author: Spring Data Relational
    objectQuotingStrategy: LEGACY
    changes:
    - createTable:
        columns:
        - column:
            autoIncrement: true
            constraints:
              nullable: false
              primaryKey: true
            name: id
            type: BIGINT
        - column:
            constraints:
              nullable: true
            name: first_name
            type: VARCHAR(255 BYTE)
        - column:
            constraints:
              nullable: true
            name: last_name
            type: VARCHAR(255 BYTE)
        - column:
            constraints:
              nullable: true
            name: birthday
            type: DATE
        - column:
            constraints:
              nullable: false
            name: active
            type: TINYINT
        tableName: person

欄位類型是從實作 SqlTypeMapping 策略介面的物件計算而來。可為 Null 性是從類型推斷而來,如果屬性類型使用原始 Java 類型,則設定為 false

結構描述支援可以在整個應用程式開發生命週期中協助您。在差異模式中,您提供現有的 Liquibase Database 給結構描述寫入器實例,結構描述寫入器會將現有表格與對應的實體進行比較,並從差異中推導出要建立/刪除的表格和欄位。預設情況下,除非您設定 dropTableFilterdropColumnFilter,否則不會刪除表格和欄位。這兩個篩選器謂詞都提供表格名稱和各自的欄位名稱,以便您的程式碼可以計算可以刪除哪些表格和欄位。

writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
結構描述支援只能識別新增和移除,從意義上來說,是指移除未對應的表格/欄位或新增資料庫中不存在的欄位。欄位無法重新命名,資料也無法遷移,因為實體對應未提供結構描述如何演進的詳細資訊。