8

PostgreSQL でこれらの一意の制約を使用する必要があります

CREATE UNIQUE INDEX favorites_3col_uni_idx
ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;

CREATE UNIQUE INDEX favorites_2col_uni_idx
ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;

JPAで最初に注釈を付けたもの:

@Table(uniqueConstraints= {
@UniqueConstraint(name="favorites_3col_uni_idx", columnNames = {"user_id", "menu_id", "recipe_id"})
})

しかし、 ¿JPA で 2 番目の一意のインデックスに注釈を付けることは可能ですか?

どうも。

4

1 に答える 1

8

JPA 制約定義を使用して部分インデックス( ) を作成したいようです。CREATE INDEX ... ON ... WHERE

これらはかなり PostgreSQL 固有のものであり、JPA によって指定されていません。それらを作成するには、ネイティブ構文を使用する必要があります。JPA がインデックス定義の機能を提供しているとは思えません。

一意の部分インデックスは一意の制約ではないため、この目的で一意の制約を使用することはできません。CONSTRAINT constraint_name UNIQUE(columns)部分ユニーク インデックスはPostgreSQL では作成できません。PostgreSQL が一意の制約に対して一意のインデックスを作成するのは、実装の詳細にすぎません。

見る:

一部の JPA プロバイダーは、その JPA プロバイダーに固有の拡張アノテーションを提供し、ネイティブ DDL スクリプトの実行、アノテーションによるインデックスの定義などの機能を追加します。EclipseLink index DDLのドキュメントは次のとおりです。Hibernate、OpenJPA、または EclipseLink 以外のものを使用している場合、これは機能ませ ん。

JPA の標準的な回避策は、クエリを実行して起動時にこれらのインデックスの存在を確認することですpg_catalog.pg_index。それらが見つからない場合は、EntityManager ネイティブ クエリを使用して、適切なネイティブ SQLCREATE UNIQUE INDEXコマンドを送信します。EJB3.1@Startup @Singletonを使用している場合、Bean はこの種のタスクに役立ちます。の構造については、PostgreSQL のドキュメントを参照してくださいpg_catalog.pg_index。特定の名前のインデックスが存在するかどうかを確認するには、次を実行します。

SELECT EXISTS(
    SELECT 1 
    FROM pg_index 
    WHERE indexrelid = 'public.indexname'::regclass
);

上記のクエリは、期待するインデックスであることを確認するために何もしないことに注意してください。ただし、追加のチェックを行うことで確認できます。pg_index何をテストすればよいかがわかるように、インデックスを作成した後にの内容を調べるだけです。indpred;の特定の値をチェックしようとすることはお勧めしません。null でないことを確認してください。

于 2012-08-19T14:46:36.367 に答える