スキーマの作成

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 型を使用する場合、Null 可能性は型から推測され、false に設定されます。

スキーマサポートは、アプリケーション開発ライフサイクル全体を通じて役立ちます。差分モードでは、既存の Liquibase Database をスキーマライターインスタンスに提供すると、スキーマライターは既存のテーブルとマップされたエンティティを比較し、差分からどのテーブルと列を作成 / 削除するかを導き出します。デフォルトでは、dropTableFilter および dropColumnFilter を構成しない限り、テーブルも列も削除されません。どちらのフィルター述語もテーブル名とそれぞれの列名を提供するため、コードでどのテーブルと列を削除できるかを計算できます。

writer.setDropTableFilter(tableName -> …);
writer.setDropColumnFilter((tableName, columnName) -> …);
スキーマサポートは、マップされていないテーブル / 列の削除、またはデータベースに存在しない列の追加という意味での追加と削除のみを識別できます。エンティティマッピングではスキーマがどのように進化したかの詳細が提供されないため、列の名前を変更したり、データを移行したりすることはできません。