シーケンスサポート

主キープロパティ(@Id でアノテーション)は、@Sequence でアノテーションすることもできます。@Sequence アノテーションが指定されている場合、プロパティの初期値はオブジェクトの挿入時にデータベースシーケンスから取得されます。データベースがシーケンスを生成できるかどうかは、使用されているデータベースダイアレクトによって決まります@Sequence アノテーションが指定されていない場合、対応する列の値は行の挿入時にデータベースによって自動的に生成されるものとみなされます。

次のエンティティを考えてみましょう。

シーケンスから ID を生成するエンティティ
@Table
class MyEntity {

    @Id
    @Sequence(
        sequence = "my_seq",
        schema = "public"
    )
    private Long id;

    // …
}

このエンティティを永続化する際、Spring Data は SQL INSERT の前に、シーケンスから次の値を取得するために追加の SELECT 文を発行します。たとえば PostgreSQL の場合、Spring Data が発行するクエリは次のようになります。

PostgreSQL で次のシーケンス値を選択する
SELECT nextval('public.my_seq');

取得された識別子の値は、挿入時に VALUES に含められます。

ID 値で強化された挿入ステートメント
INSERT INTO "my_entity"("id", "name") VALUES(?, ?);
シーケンスから値を取得することと、オブジェクトを挿入することは、それぞれ別々の操作です。アトミック性を確保するため、これらの操作は周囲のトランザクション内で実行することを強くお勧めします。

サポートされているダイアレクト

次のダイアレクトがシーケンスをサポートしています。

  • H2

  • HSQL

  • PostgreSQL

  • DB2

  • Oracle

  • Microsoft SQL Server

MySQL はシーケンスをサポートしていないことに注意してください。