S2JDBCでの@SequenceGeneratorアノテーションの注意点

S2JDBCで連続して@SequenceGenerator アノテーション
実行すると実際のシーケンスが上がっていなかった事象が発生。

ぐぐってみるとこういうことらしい。

@SequenceGenerator アノテーションには
allocationSize という要素があり,その
デフォルト値は 50 となっています.
# JPA の仕様です.

S2JDBC は,Sequence から取得した値から,
この allocationSize の範囲までは,新たに
Sequence から値を取得することなく主キーに
割り当てます.

そのため,Sequence の増分値と allocationSize が
一致している必要があります.
Sequence の増分値は create sequence 文で指定します.

CREATE SEQUENCE DEPARTMENT_SEQ INCREMENT BY 50 START WITH 5;
^^
この増分値と allocationSize が一致していれば,
毎回 nextval を取得するより効率的です.

どうしても毎回 nextval を取得させたいなら,
@SequenceGenerator で allocationSize を 1 に
してください.

なるほど。
@SequenceGenerator アノテーションって
SQL文を書かなくてもシーケンスから取得出来るって訳じゃないのね^^;
思いっ切り勘違いしてた^^;

S2JDBCのallocationSizeに指定した値までは、
シーケンスから値を取得せずに独自で値を発行するのね。
このため、実際のシーケンス値とDB登録済みの値がズレる場合があるのか。
(1トランザクションで連続して登録処理を実行するとズレたので、
正確には1トランザクションにつき1つだけシーケンスをあげているのかな?
シーケンスそのものは1つずつ増えていたし。)

対処方法は引用の通り。

@SequenceGenerator で allocationSize を 1 に剃る方法は、

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HOGE_NO")
@SequenceGenerator(name = "HOGE_NO",sequenceName = "hoge_hoge",allocationSize=1)
public Long hoge;