模式创建
使用 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) -> …);
备注
模式支持只能识别新增和移除,即删除未被映射的表/列,或添加数据库中不存在的列。列无法重命名,数据也无法迁移,因为实体映射并未提供模式如何演变的细节。