Overview
このガイドでは、MongoDB Extension for Hibernate ORMを使用して、エンティティ上で単一フィールド、複合、およびユニークインデックスを宣言する方法を学びます。Hibernate ORM拡張機能は、スキーマ生成を有効にすると、エンティティで宣言したインデックスとユニーク制約をMongoDBのインデックス操作に変換します。
スキーマ生成の構成
エンティティで宣言されたインデックスと一意の制約を作成するには、アプリケーションの構成でスキーマ生成を有効にします。create または create-drop アクションを使用して、スキーマ生成を有効にできます。
create:SessionFactoryが閉じるときにスキーマオブジェクトを削除せずに作成します。create-dropSessionFactoryが開くときにスキーマオブジェクトを作成し、閉じるときに削除します。
警告
create-drop アクションは、開発およびテストを目的としています。本番データを保持する必要がある場合は使用しないでください。
Spring Boot を使用している場合は、お使いの application.properties ファイルに次のプロパティを追加してください。
spring.jpa.properties.jakarta.persistence.schema-generation.database.action=create-dropJakarta Persistence を直接構成する場合は、次のプロパティを persistence.xml ファイルに追加します。
<property name="jakarta.persistence.schema-generation.database.action" value="create-drop"/>あるいは、hibernate.properties ファイルでプロパティを設定することもできます。
jakarta.persistence.schema-generation.database.action=create-dropスキーマ生成が実行されると、Hibernate ORM拡張機能はコレクションを作成し、エンティティで宣言されたインデックスと一意の制約に対してMongoDB createIndexesコマンドを発行します。
インデックス タイプ
このガイドの例では、次の Movie エンティティの @Table アノテーションに @Index および @UniqueConstraint アノテーションを追加することで、インデックスと一意制約を宣言しています。
@Entity@Table(name = "movies")public class Movie {
@Id @ObjectIdGenerator 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 フィールドに降順で単一フィールドインデックスを作成します。
@Table( name = "movies", indexes = { @Index(name = "idx_year", columnList = "year desc") })columnList をフィールド名に設定し、asc または desc を追加して方向を指定します。方向を省略した場合、MongoDBは昇順のインデックスを作成します。name 要素は、MongoDBインデックスの名前を指定します。
複合インデックス
複合インデックスは、コレクションのドキュメント内の複数のフィールドへの参照を保持し、クエリとソートのパフォーマンスを向上させます。
次の例では、title フィールドと year フィールドに降順で複合インデックスを作成します。
@Table( name = "movies", indexes = { @Index(name = "idx_title_year", columnList = "title desc,year desc") })columnList のフィールドの順序によって、MongoDB がインデックス キーをソートする順序が決まります。これにより、インデックスがサポートできるクエリ プレフィックスが変わります。例えば、title の後に year が続くインデックスは title のみに一致するクエリをサポートできますが、year のインデックスは title のみに一致するクエリには役立ちません。
詳細については、 マニュアルの「 複合インデックス MongoDB Server」を参照してください。
ユニークインデックスと制約
ユニークインデックスにより、インデックス フィールドに重複する値が格納されなくなります。
@Index または @UniqueConstraint アノテーションを使用して、ユニークインデックスを作成できます。
フィールドの方向などのインデックスオプションを指定する必要がある場合は、
@Index(unique = true)を使用します。テーブルレベルの制約モデルを使用する場合は、
@UniqueConstraintを使用します。columnNamesのフィールドはキーの順序を定義し、@UniqueConstraintはフィールドの方向を指定しないため、結果として得られるユニークインデックスは昇順になります。
次の例では、title フィールドにユニークインデックスを作成します。
@Table( name = "movies", indexes = { @Index(name = "idx_title", columnList = "title", unique = true) })次の例では、title フィールドと plot フィールドにユニーク制約を作成します。
@Table( name = "movies", uniqueConstraints = { @UniqueConstraint(name = "uk_title_plot", columnNames = {"title", "plot"}) })MongoDB は、インデックス付きフィールドの null または欠落している値をインデックス付き値として扱います。ユニーク制約により、単一フィールドのユニークインデックスは、インデックスエントリに null 値を含むドキュメントを 1 つしか含めることができません。
重要
ユニークインデックスの作成が失敗する可能性がある
コレクションにこれらのフィールドの重複値を持つドキュメントが既に含まれている場合、MongoDBは指定されたフィールドにユニークインデックスを作成できません。ユニークインデックスを作成する前に、既存のデータに重複した値がないか検討してください。
詳細については、MongoDB Serverマニュアルのユニークインデックスを参照してください。
詳細情報
エンティティの作成と埋め込みデータのマッピングの詳細については、「コレクションを表すエンティティの作成」ガイドを参照してください。
エンティティを使用してデータベース操作を実行する方法を学ぶには、「CRUD 操作の実行」および「クエリの指定」ガイドを参照してください。
Hibernate ORM拡張機能がサポートするインデックスタイプの一覧を表示するには、機能互換性ページを参照してください。
このガイドで使用されているJakarta Persistenceアノテーションの詳細を学ぶには、Jakarta Persistence APIのドキュメントを参照してください。