Overview
このガイドでは、 Hibernetes ORM 用のMongoDB拡張機能 を使用して、エンティティで単一フィールド、複合インデックス、および一意のインデックスを宣言する方法を学習できます。 Hibernetes ORM 拡張機能は、スキーマ生成を有効にするときに、エンティティに宣言したインデックスと一意の制約をMongoDBインデックス操作に変換します。
スキーマ生成の構成
エンティティに宣言されたインデックスと一意の制約を作成するには、アプリケーションの構成でスキーマ生成を有効にします。スキーマ生成は、create または create-dropアクションを使用して有効にできます。
create:SessionFactoryが閉じるときに削除せずにスキーマオブジェクトを作成します。create-drop:SessionFactoryが開くときにスキーマオブジェクトを作成し、閉じるとそれらを削除します。
警告
create-dropアクションは、開発とテストを対象としています。本番データを保持する必要がある場合は、 を使用しないでください 。
フォールトを使用する場合は、次のプロパティをapplication.propertiesファイルに追加します。
spring.jpa.properties.jakarta.persistence.schema-generation.database.action=create-drop
Java 永続性を直接構成する場合は、次のプロパティをpersistence.xmlファイルに追加します。
<property name="jakarta.persistence.schema-generation.database.action" value="create-drop"/>
あるいは、hibernate.propertiesファイルにプロパティを設定することもできます。
jakarta.persistence.schema-generation.database.action=create-drop
スキーマ生成が実行されると、 Hibernetes ORM 拡張機能はコレクションを作成し、 エンティティが宣言するインデックスと一意の制約に対してMongoDB createIndexes コマンドを発行します。
インデックス タイプ
このガイドの例では、次の Movie エンティティの @Table アノテーションに @Index と @UniqueConstraint アノテーションを追加することで、インデックスと一意の制約を宣言します。
public class Movie { private ObjectId id; private String title; private String plot; private int year; private List<String> cast; private List<String> directors; public Movie(String title, String plot, int year, List<String> cast, List<String> directors) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; } public Movie() { } // Getter and setter methods }
単一フィールド インデックス
単一フィールドインデックスは、コレクションのドキュメント内の単一のフィールドを参照インデックスです。単一のフィールドのクエリとソートのパフォーマンスが向上します。
次の例では、yearフィールドに降順で単一のフィールドインデックスを作成します。
フィールド名に columnList を設定し、方向を指定するには asc または desc を追加します。方向を省略すると、 MongoDB は昇順のインデックスを作成します。 name 要素はMongoDBインデックスの名前を指定します。
詳細については、MongoDB Server マニュアルの「単一フィールド インデックス」を参照してください。
複合インデックス
複合インデックスは、コレクションのドキュメント内の複数のフィールドへの参照を保持し、クエリとソートのパフォーマンスを向上させます。
次の例では、title フィールドと year フィールドに降順で複合インデックスを作成しています。
columnList 内のフィールドの順序によって、 MongoDB がインデックスキーを並べ替える順序が決まり、インデックスがサポートできるクエリ プレフィックスに影響します。例、title のインデックスとそれに続く year のインデックスは title のみに一致するクエリをサポートできますが、year のインデックスはtitle のみに一致するクエリには役立ちません。
詳細については、 マニュアルの「 複合インデックス MongoDB Server」を参照してください。
一意のインデックスと制約
一意なインデックス により、インデックス フィールドに重複する値が保存されなくなります。
@Index または @UniqueConstraint 注釈を使用してユニークインデックスを作成できます。
フィールド方向などのインデックスオプションを指定する必要がある場合は、
@Index(unique = true)を使用します。テーブルレベルの制約モデルを使用する場合は、
@UniqueConstraintを使用します。columnNamesのフィールドはキーの順序を定義し、@UniqueConstraintはフィールド方向を指定していないため、結果として得られるユニークインデックスは昇順になります。
次の例では、titleフィールドにユニークインデックスを作成します。
次の例では、title フィールドと plot フィールドに一意の制約を作成しています。
MongoDB は、インデックスフィールドの null または欠損値をインデックス付き値として扱います。一意の制約により、単一フィールドユニークインデックスには、インデックスエントリに null 値を持つドキュメントを1 つだけ含めることができます。
重要
一意のインデックスの作成は失敗する可能性あり
MongoDBは、コレクションに重複する値を持つドキュメントがすでに含まれている場合、指定されたフィールドにユニークインデックスを作成できません。ユニークインデックスを作成する前に、既存のデータに重複値がないか確認してください。
詳細については、 MongoDB Serverマニュアルの 「一意のインデックス」 を参照してください。
詳細情報
エンティティの作成と埋め込みデータのマッピングの詳細については、「 コレクションを表すエンティティの作成 」ガイドを参照してください。
エンティティを使用してデータベース操作を実行する方法については、 「 CRUD操作の実行 」および「 クエリの指定 」ガイドを参照してください。
Hibernetes ORM 拡張機能がサポートするインデックスタイプのリストを表示するには、「 機能の互換性 」ページを参照してください。
このガイドで使用されている Java 永続化注釈 の詳細については、 Java 永続化APIドキュメントを参照してください。