カツオ @SpringBootとVue.jsでWebサービス開発中

起業、転職、サラリーマン生活、Webサービス、アプリ、働き方、プログラミング、Java、JavaScript

java

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

投稿日:

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」が使われる。

-java

執筆者:


comment

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

関連記事

no image

【mybatis】Insert時にシーケンスで自動採番されたキーを取得する【SpringBoot】

サーバーサイドはSpringBootを使って絶賛Webサービスを開発しています。カツオです。 SpringBootのDBアクセスはJPAが主流なのかもしれませんが、JPAだとデータモデルとJavaのク …

no image

【SpringBoot】faicon(ファビコン)の設定方法

SpringBootの場合、デフォルトだとfavicon(ファビコン)にSpringBootの葉っぱの画像が使われています。さすがにそのままサービスをローンチするわけにもいかないので、favicon( …

no image

【SpringBoot入門】Spring Boot+JPAで複数テーブル結合処理

SpringBootのプログラミングネタ連投で失礼します。 先日、PostgresSQL+SpringBootでDBアクセスから画面表示までの実装を行いました。 【SpringBoot入門】Sprin …

no image

【SpringBoot入門】Spring Boot + PostgreSQLの設定・DB検索

この週末にSpringBootの入門書を1冊写経しながら勉強しました。入門書の中ではDBアクセスがHSQLDBのみの例しかなかったので、Webサイトなどを参考にしつつ、PosgresSQLとの接続を試 …

no image

【JAVA】phantomjsでスクレイピング(Googleの検索結果をクローリング取得)

やること Googleのキーワード検索結果の一覧URLを取得します。ポチポチとコピペしてもいいのですが、一応エンジニアの端くれということで、JAVAを使ったスクレイピングシステムを作ってみます。 スク …