くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

SpringBoot/JPAの採番はややこしい。。。

SpringBoot/JPAを使うと、アノテーションベースでテーブル定義を作れて楽ちん♪

しかし、細かいとこらラップされていたりするので、たまにはまる。。。

採番やシーケンスではまったので、その時の備忘録φ(..)メモメモ

@GeneratedValue(strategy = GenerationType.AUTO)

とりあえず、IDを付与するのであれば、以下の感じでOK。

application.propertiesでspring.jpa.hibernate.ddl-autoを設定すると、

hibernate_sequenceという全体で一つのSEQUENCEが作成され、それをつかって採番される。

@Setter
@Getter
@Entity
@Table(name = "user")
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;
}

ただ、全体で1つのシーケンスなので、 * 起動時に初期データを投入するimport.sqlを使う場合や * テーブルごとにIdを連番にしたい場合 うまくいかなくなってしまう。。。

@GeneratedValue(strategy = GenerationType.SEQUENCE)

JPAでは、@SequenceGeneratorを使うと、シーケンスまで作ってくれるので、それをちゃんと追加ましょうというお話

@Setter
@Getter
@Entity
@Table(name = "user")
public class UserEntity {

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "user_user_id_seq")
    @SequenceGenerator(
        name = "user_user_id_seq",
        sequenceName = "user_user_id_seq",
        initialValue = 1,
        allocationSize = 1)
    private Long userId;
}

注意: 番号を1から始めたい場合は、allocationSize = 1を指定すること!

デフォルトが50になっているので、指定しないと@Idのフィールドに50が入ってきてえ!?ってなる

デフォルトこわい。。。。

以上!!

参考になる書籍

Spring Boot 2 プログラミング入門

Spring Boot 2 プログラミング入門

参考にしたサイト様