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