シーケンスサポート
主キープロパティ(@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(?, ?);
シーケンスから値を取得することと、オブジェクトを挿入することは、それぞれ別々の操作です。アトミック性を確保するため、これらの操作は周囲のトランザクション内で実行することを強くお勧めします。 |