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) |