此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Relational 3.5.2spring-doc.cadn.net.cn

架构创建

使用 SQL 数据库时,模式是必不可少的一部分。Spring Data JDBC 支持广泛的模式选项,但是从领域模型开始时,提出初始领域模型可能具有挑战性。为了帮助您采用代码优先的方法,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策略接口。可空性是从类型推断出来的,并设置为false如果属性类型使用原始 Java 类型。spring-doc.cadn.net.cn

模式支持可以在整个应用程序开发生命周期中为您提供帮助。在差异模式下,您提供现有的 LiquibaseDatabase到架构编写器实例,架构编写器将现有表与映射的实体进行比较,并从要创建/删除的表和列的差异中派生出来。默认情况下,除非将dropTableFilterdropColumnFilter. 这两个筛选器谓词都提供表名和相应的列名,以便代码可以计算机可以删除哪些表和列。spring-doc.cadn.net.cn

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