此版本仍在开发中,尚未被视为稳定版本。如需使用最新的稳定版本,请使用 Spring Data Relational 4.0.4spring-doc.cadn.net.cn

模式创建

在使用 SQL 数据库时,数据库模式(schema)是至关重要的组成部分。 Spring Data JDBC 支持多种数据库模式选项,但当你从领域模型入手时,要设计出初始的领域模型可能会颇具挑战性。 为了帮助你采用代码优先(code-first)的方法,Spring Data JDBC 内置了与 Liquibase 的集成,用于生成数据库变更集。spring-doc.cadn.net.cn

考虑以下领域实体:spring-doc.cadn.net.cn

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

通过以下代码渲染初始的 ChangeSet:spring-doc.cadn.net.cn

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

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

生成以下变更日志:spring-doc.cadn.net.cn

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 基本类型,则将其设置为 falsespring-doc.cadn.net.cn

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

writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
模式(Schema)支持只能识别新增和删除操作,即删除未被映射的表/列,或添加数据库中不存在的列。 由于实体映射未提供模式演变的详细信息,因此无法重命名列,也无法迁移数据。