【SpringBoot+PostgresSQL】JPA EntityでIDを自動採番する

投稿者: | 2018年9月13日

SpringBootでDBへデータ登録する際に主キーを自動で採番するやり方です。個人的に詰まってしまい色々調べたので、まとめておきます。

やりたいこと

  • テーブルのキーを自動で採番する
  • postgresSQL利用
  • INSERT文で登録済のレコードとのキー重複を避ける

実現方法

  • Entityでのアノテーション設定
  • postgresSQLで主キーのカラムをシーケンスで宣言する
  • INSERT文でもシーケンスを利用する ※主キーの値を勝手に自分で書かない

コード

Entity(Javaの設定)

package com.example.demo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name = "book")
public class BookEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
}

サンプルとして、book(id、title)という簡易的なテーブルを想定。idがキーで@GeneratedValueのアノテーションを付与する。

postgresSQLでのテーブル定義(create文)

CREATE TABLE
BOOK(
id serial NOT NULL,
title varchar(40)
);

idをserial宣言で作成

これで自動でidを採番しながらJavaでレコード追加が可能となる。

Java以外からも手動でInsert文を打つ場合にもシリアルを利用する。利用しないとidが重複となる。

Insert文の書き方

insert into book values (nextval('book_id_seq') , '下町ロケット');

idを直接指定するのではなく、シーケンスで取得している。すべての更新処理でシーケンスを利用することでキーの重複がなくなる。

もしも誰かが間違って好きなidでレコードを登録してしまった場合は、シーケンスを明示的に更新することで対処可能。

シーケンスの明示的な更新

select setval('book_id_seq', 10, false);

※次にシーケンスを利用した場合、「10」が使われる。


カツオが開発したWebサービスです。

平成の想い出を気軽に年表にしてシェアすることができるサービスです。ぜひ使ってみてください。

カテゴリー: java

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です