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;