主キー(id)の自動生成について

自動生成の方法

今回はPostgerSQLを使用しているため、シーケンスを使用して自動生成するようにしました。

例えば会社マスタの場合

table
create SEQUENCE company_id_seq;

create TABLE {
    company_id INTEGER DEFAULT nextval('company_id_seq') PRIMARY KEY,
    ...
}
entity
public class company {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "COMPANY_ID_SEQ")
    @SequenceGenerator(name = "COMPANY_ID_SEQ", sequenceName = "COMPANY_ID_SEQ")
    public Integer company_id;

}

これで、idは自動生成されて登録されます。

問題点

S2JDBCのinsertBatchやupdateBatchではパラメータにエンティティのListや配列を渡すことで複数登録、追加処理できます。


この複数登録、追加のときにPostgreSQL内部のシーケンスがインクリメントされずに、insertBatchやupdateBatchを二回目移行実行すると、キー重複でエラーになってしまいました。


調べてみると、create SEQUENCE [sequence_name]でシーケンスを作ったときにインクリメントの増分が1何だけど、@SequenceGeneratorのallocationSizeがデフォルトで50のために、シーケンスがインクリメントされないみたい。

解決方法

S2JDBCのサイトにはcreate sequence [sequence_name] increment by 50 にするようにかいてあったけど、@SequenceGeneratorのallocationSizeを1にして対応した。

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "COMPANY_ID_SEQ")
@SequenceGenerator(name = "COMPANY_ID_SEQ", sequenceName = "COMPANY_ID_SEQ", allocationSize = "1")
public Integer company_id;