メモφ(. . )

JPAのEntityで使用するIDというかシーケンスの指定の仕方。

はじめに

自動で採番するためには「@GeneratedValue」を付与する。
この引数strategyにどの採番方法を採用するか指定する。

  • GenerationType.TABEL
  • GenerationType.SEQUENCE
  • GenerationType.IDENTITY
  • GenerationType.AUTO (デフォルト)

今回、Struts2+Spring2.5+JPAな環境でサンプルを作ってたんだけども。
JPAの実装はOracleTopLink、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>エンティティ>プロパティ定義>識別子定義をみてました。