Postgres で SEQUENCE を利用できますか?はい、できます。でもちょっと問題もあります。 Postgres の Sequence については V2 の開発中、まるでジェットコースターに乗っているように変わったので、 Sequence を使う最もシンプルな方法は、GeneratedValue アノテーションの GenerationType.IDENTITY @Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
これを動かすには、関連するテーブルのカラムタイプを SERIAL にする必要があります。このインスタンスでは、 GeneratedValue アノテーションの GenerationType.SEQUENCE を通じて、JPA は 残念ながら、これは、Glassfish の Postgres 向け JPA 実装や Toplink では直接はサポートされていません。 Toplink の内部アーキテクチャ上の制限があるため、特定のデータベースプラットフォームで IDENTITY タイプ Toplink の実装者は、標準的な Postgres DB プラットフォームの実装に、Postgres SERIAL カラムを しかしながら、すべてが失われているわけではありません。Toplink は、どの DB プラットフォームを このメカニズムを使って、SERIAL カラムと IDENTITY をサポートするのではなく、Oracle のように これを行うには、新しいクラスを作成する必要があります。 // Code free for any use whatsoever.
package faq.glassfish.postgres;
import oracle.toplink.essentials.queryframework.ValueReadQuery;
import oracle.toplink.essentials.sessions.DatabaseSession;
public class PostgresPlatform
extends oracle.toplink.essentials.platform.database.PostgreSQLPlatform {
public PostgresPlatform() {
super();
}
public boolean shouldNativeSequenceAcquireValueAfterInsert() {
return false;
}
public ValueReadQuery buildSelectQueryForNativeSequence(String seqName, Integer size) {
ValueReadQuery selectQuery = new ValueReadQuery();
selectQuery.setSQLString("select nextval(\'" + seqName + "\')");
return selectQuery;
}
public void platformSpecificSequencingInitialization(DatabaseSession session) {
}
}
このコードをビルドするには、Glassfish ディストリビューションの toplink jar を classpath に追加 ファイルの場所は、$glassfish_install_dir/lib/toplink-essentials.jar になります。 このコードはデフォルトの Postgres DB プラットフォームを Oracle のような振る舞いをする このクラスをプロジェクトに追加したら、persistence.xml ファイルのプロパティを追加します。 <property name="toplink.platform.class.name"
value="faq.glassfish.postgres.PostgresPlatform"/>
ここで、エンティティで SEQUENCE を使いましょう: @Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MYSEQUENCE")
@SequenceGenerator(name="MYSEQUENCE", sequenceName="mysequence")
@Column(name = "id", nullable = false)
private Integer id;
副次的な効果として、sequence の allocationSize パラメータも利用できます。必要なのは、 SequenceGenerator アノテーションに allocationSize=10 を追加した場合、データベースでは次のように ALTER SEQUENCE mysequence INCREMENT 10; 日本語翻訳: shioda 英文 (翻訳したバージョン: 1) |