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