主キー(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;