Spring JPAでテーブル毎に自動採番のIDを作成する方法

Spring JPAでテーブル毎に自動採番のIDを作成する方法をご紹介します。

条件

  • Spring Tool Suite 4
  • Spring Boot 2.5.0
  • PostgreSQL 13.3
  • gradle

前提

以下のようなデータを考えます。

投稿 : コメント = 1 : N

一つの投稿について、複数のコメントが付けられるものとします。

プロジェクト依存関係

以下を使用します。

  • Spring Data JPA
  • PostgreSQL Driver
  • Rest Repositories
  • Lombok

パッケージ構成

application.properties

spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.generate-ddl=True

環境に合わせて変更してください。

spring.jpa.generate-ddl=Trueとすることで、テーブルを自動生成するようにしています。

ソース

モデル

Post.java

package com.example.demo.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.Data;

@Data
@Entity
public class Post {
  @Id
  @GeneratedValue
  private Long id;
  
  @Column
  private String title;
}

Comment.java

package com.example.demo.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import lombok.Data;

@Data
@Entity
public class Comment {
  @Id
  @GeneratedValue
  private Long id;
  
  @Column
  private String message;
  
  @ManyToOne
  private Post post;
}

リポジトリ

PostRepository.java

package com.example.demo.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.demo.model.Post;

public interface PostRepository extends CrudRepository<Post, Long>{

}

CommentRepository.java

package com.example.demo.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.demo.model.Comment;

public interface CommentRepository extends CrudRepository<Comment, Long>{

}

テーブル毎の採番ではないケース

Post.javaおよびComment.javaのIDを以下のように記述します。

@Id
@GeneratedValue
private Long id;

@GeneratedValueのみの場合、以下と同義になります。
@GeneratedValue(strategy = GenerationType.AUTO)

「hibanate_sequence」というシーケンスのみが作成され、db全体での共有シーケンスでidが採番されます。

テーブル毎のに採番するケース

Post.javaおよびComment.javaのIDを以下のように記述します。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

post_id_seqおよびcomment_id_seqが生成されており、テーブル毎に主キーが採番されることがわかります。

その他

上記以外にも以下2種類のして方法がありますが、詳細は割愛します。

  • GenerationType.SEQUENCE
    • シーケンスオブジェクトを使用して主キー値を生成する。
  • GenerationType.TABLE
    • テーブルを使用して主キー値を生成する。

参考

アノテーション型 GeneratedValue

https://spring.pleiades.io/specifications/platform/8/apidocs/javax/persistence/generatedvalue

Qiita:@GeneratedValueを使って主キーを生成する方法

https://qiita.com/KevinFQ/items/a6d92ec7b32911e50ffe

コメントを残す

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