模式建立
在使用 SQL 資料庫時,模式是必不可少的部分。Spring Data JDBC 支援廣泛的模式選項,但在開始使用領域模型時,構建初始領域模型可能具有挑戰性。為了幫助您採用程式碼優先的方法,Spring Data JDBC 集成了使用 Liquibase 建立資料庫變更集的功能。
考慮以下領域實體
@Table
class Person {
@Id long id;
String firstName;
String lastName;
LocalDate birthday;
boolean active;
}
透過以下程式碼渲染初始變更集
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。
模式支援可以在整個應用程式開發生命週期中為您提供幫助。在差異模式下,您向模式寫入器例項提供現有的 Liquibase Database,模式寫入器將現有表與對映的實體進行比較,並從差異中推匯出要建立/刪除的表和列。預設情況下,除非您配置 dropTableFilter 和 dropColumnFilter,否則不會刪除任何表和列。這兩個過濾謂詞都提供了表名和列名,以便您的程式碼可以計算可以刪除哪些表和列。
writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
| 模式支援只能識別新增和刪除,即刪除未對映的表/列或新增資料庫中不存在的列。列不能重新命名,資料不能遷移,因為實體對映不提供模式如何演變的詳細資訊。 |