メモφ(. . )
JPAのEntityで使用するIDというかシーケンスの指定の仕方。
はじめに
自動で採番するためには「@GeneratedValue」を付与する。
この引数strategyにどの採番方法を採用するか指定する。
- GenerationType.TABEL
- GenerationType.SEQUENCE
- GenerationType.IDENTITY
- GenerationType.AUTO (デフォルト)
今回、Struts2+Spring2.5+JPAな環境でサンプルを作ってたんだけども。
JPAの実装はOracleのTopLink、DBはH2を使ってみた。
@GeneratedValue @SequenceGenerator
Entityを用意。
Entityを一意にするため、PrimaryKeyでもある項目にIDを指定。
また自動採番にはシーケンスを利用。
@ID @Column(name="USER_ID", unique=true, nullable=false, precision=10, scale=0) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_ID_GEN") @SequenceGenerator(name="USER_ID_GEN", sequenceName="SEQ_USER_ID", allocationSize=1) public long getUserId() { return this.userId; }
Entityに関しては先にテーブルを作っておいてHibernateToolからの自動生成してたりするw
strategyにはSEQUENCEを指定して、generatorには実際にどのシーケンスを利用するのかを定義した「SequenceGenerator」のnameを指定。
@SequenceGenerator(name="Generatorの名前", sequenceName="DBに作成したシーケンス名", allocationSize=増分数)
はじめ、nameとsequenceNameだけを設定して動かしていたら例外が発生。
調べたらallocationSizeのデフォルト指定が「50」になっていたと。
自分が作ったシーケンスは「1」ずつ増加するようにしてたのでこの部分で例外になってたみたい。
GeneratedValueのほうで直接シーケンス指定して、実装側でNEXTVAL()とかで取得すればいいだけじゃない?
と思うんだけど、なんでめんどくさいことを…。
この辺の説明(セットアップ)についてはS2JDBC>エンティティ>プロパティ定義>識別子定義をみてました。