跳到主要内容

模式创建

DeepSeek V3 中英对照 Schema Creation

在使用 SQL 数据库时,模式(schema)是一个至关重要的部分。Spring Data JDBC 支持多种模式选项,但在从领域模型开始时,提出初始的领域模型可能具有挑战性。为了帮助您采用代码优先的方法,Spring Data JDBC 提供了与 Liquibase 的集成,用于创建数据库变更集。

考虑以下领域实体:

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

通过以下代码渲染初始的 ChangeSet

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

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

生成了以下变更日志:

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
yaml

列类型是通过实现 SqlTypeMapping 策略接口的对象来计算的。如果属性类型使用了原始的 Java 类型,则从该类型推断出可空性,并将其设置为 false

Schema 支持可以在整个应用程序开发生命周期中为你提供帮助。在差异模式下,你向 schema writer 实例提供一个现有的 Liquibase Database,schema writer 会将现有表与映射的实体进行比较,并从差异中推导出需要创建或删除的表和列。默认情况下,除非你配置了 dropTableFilterdropColumnFilter,否则不会删除任何表或列。这两个过滤谓词提供了表名和列名,以便你的代码可以判断哪些表和列可以被删除。

writer.setDropTableFilter(tableName ->);
writer.setDropColumnFilter((tableName, columnName) ->);
java
备注

Schema 支持只能识别添加和删除操作,即删除未映射的表/列或添加数据库中不存在的列。由于实体映射并未提供 schema 如何演变的详细信息,因此无法重命名列,也无法迁移数据。