模式创建

在使用 SQL 数据库时,模式是必不可少的一部分。Spring Data JDBC 支持多种模式选项,但在从领域模型开始时,可能难以想出一个初始的领域模型。为了帮助您使用代码优先的方法,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

模式支持可以在整个应用程序开发周期中为您提供帮助。在差异模式下,您将现有的 Liquibase Database 提供给模式编写器实例,模式编写器会将现有表与映射的实体进行比较,并从差异中推导出要创建/删除的表和列。默认情况下,不会删除任何表和列,除非您配置 dropTableFilterdropColumnFilter。这两个过滤器谓词分别提供表名和列名,以便您的代码可以计算哪些表和列可以删除。

writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
模式支持只能识别添加和删除,例如删除未映射的表/列或添加数据库中不存在的列。列不能重命名,数据也不能迁移,因为实体映射不提供有关模式如何演变的详细信息。