Schema 建立

在使用 SQL 資料庫時,Schema 是一個必不可少的部分。Spring Data JDBC 支援各種 Schema 選項,但是在開始使用領域模型時,提出一個初始領域模型可能具有挑戰性。為了幫助您採用程式碼優先的方法,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 策略介面的物件計算得出的。可空性從型別推斷,如果屬性型別使用原始 Java 型別,則設定為 false

Schema 支援可以在整個應用程式開發生命週期中為您提供幫助。在差異模式下,您可以將現有的 Liquibase Database 提供給 schema 寫入器例項,並且 schema 寫入器將現有表與對映的實體進行比較,並從差異中得出要建立/刪除的表和列。預設情況下,除非配置 dropTableFilterdropColumnFilter,否則不會刪除任何表和列。這兩個過濾器謂詞都提供表名(相應的列名),因此您的程式碼可以計算可以刪除哪些表和列。

writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
Schema 支援只能識別新增和刪除,從刪除未對映的表/列或新增資料庫中不存在的列的意義上說。無法重新命名列,也無法遷移資料,因為實體對映未提供有關 schema 如何演變的詳細資訊。