Overview
In this guide, you can learn how to use the MongoDB Extension for Hibernate ORM to run create, read, update, and delete (CRUD) operations on your MongoDB collections.
サンプル データ
このガイドの例では、Movie sample_mflix.moviesAtlasサンプルデータセットの コレクションを表す エンティティを使用します。Movie エンティティには次の定義があります。
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; public class Movie { private ObjectId id; private String title; private String plot; private int year; private String[] cast; public Movie(String title, String plot, int year, String[] cast) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; } public Movie() { } public ObjectId getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public String[] getCast() { return cast; } public void setCast(String[] cast) { this.cast = cast; } }
Hibernetes ORM 用のMongoDB拡張機能 を使用してこのMongoDBサンプルコレクションを操作するJavaアプリケーションを作成する方法については、「 を使い始める 」チュートリアルを参照してください。
重要
永続性コンテキスト
Hibernetes ORM を有効にしてデータベースを操作するには、 Hibernetes Session または Java 永続性 EntityManager を使用して永続性コンテキスト内で操作を実行する必要があります。 MongoDBデータを変更し、データの整合性を維持するには、トランザクション内で書込み操作も実行する必要があります。
このガイドの例を実行中前に、次のコードのような永続性コンテキストとトランザクション管理コードをアプリケーションに追加していることを確認してください。
var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // ... Perform CRUD operations here tx.commit(); session.close(); sf.close();
セッションを使用するには、HibernateUtil.java を構成するSessionFactory ファイルを作成する必要があります。詳細については、「 使い始める 」チュートリアルの「 アプリケーションを構成する 」の手順を参照してください。
// Replace <persistence unit> with the name of your persistence unit in the persistence.xml file EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence unit>"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); // ... Perform CRUD operations here entityManager.getTransaction().commit(); entityManager.close(); emf.close;
To use an EntityManager, you must create a persistence.xml file that declares a persistence unit. To learn more, see the Tutorial using JPA-standard APIs in the Hibernate ORM documentation.
ドキュメントの挿入
ドキュメントをコレクションに挿入するには、新しい エンティティインスタンスを作成します。次に、このインスタンスを次のメソッドの引数として渡して、ドキュメントとしてMongoDBコレクションに保存します。
org.hibernate.Session.persist(): Hibernetes API を使用して変更をデータベースに適用jakarta.persistence.EntityManager.persist(): Javaリスト 永続化API を使用して変更をデータベースに適用
例
次の例では、新しい Movie エンティティインスタンスを作成し、persist() メソッドを使用して対応するドキュメントをsample_mflix.moviesコレクションに挿入します。
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(new String[]{"Ana de Armas", "Daniel Craig", "Chris Evans"}); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); session.persist(myMovie);
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(new String[]{"Ana de Armas", "Daniel Craig", "Chris Evans"}); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); entityManager.persist(myMovie);
ドキュメントを読む
コレクションからドキュメントを検索するには 、クエリ条件を createQuery() メソッドに渡します。次の API は両方とも createQuery() メソッドを提供します。
非表示の
SessionAPI: 非表示クエリ言語(HQL)構文を使用してクエリを定義するJava 永続性の
EntityManagerAPI: クエリを定義するには、HQL のサブセットである Java 永続性クエリ言語(JavaQL)構文 を使用します
注意
このセクションでは、HQL と JQL を使用してドキュメントを読み取る方法について説明しますが、基準ビルダまたはネイティブ クエリを使用してデータを取得することもできます。詳しくは、次のガイドを参照してください。
1 つのドキュメントの例を返す
クエリ条件に一致するドキュメントを1 つだけ取得するには、getSingleResult() メソッドを createQuery() メソッドにチェーンします。次の例では、 sample_mflix.moviesコレクションから、title 値が "Boyhood" であるドキュメントを1 つ取得します。
var singleResult = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
var singleResult = entityManager.createQuery("select m from Movie m where m.title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
複数のドキュメントを返す例
次の例では、セッションで createQuery() メソッドを呼び出して、sample_mflix.moviesコレクションからドキュメントを検索します。このコードでは、HQL と JQL を使用して、year の値が 1920 であるドキュメントを返し、その title 値を出力します。
var results = session.createQuery("from Movie where year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
var results = entityManager.createQuery("select m from Movie m where m.year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
ドキュメントの変更
コレクション内のドキュメントを変更するには、次の操作を実行します。
1 つのドキュメントを更新 : エンティティの setter メソッドを呼び出して 1 つのエンティティインスタンスのフィールド値を変更し、セッションまたはエンティティ マネージャーを使用して変更を永続化します。
複数のドキュメントを更新:
createQuery()createMutationQuery()セッション マネージャーまたはエンティティ マネージャーのexecuteUpdate()メソッドまたは メソッドに更新ステートメントを渡します。次に、 メソッドを呼び出して、変更をデータベースに適用します。
Tip
更新 1 つの例
次の例では、 ObjectId 値でドキュメントを検索します。次に、この例ではMovie エンティティの setTitle() メソッドを呼び出して、ドキュメントの title 値を "Jurassic Park I" に更新します。
// Your ObjectId value might differ Movie movieById = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); session.persist(movieById);
// Your ObjectId value might differ Movie movieById = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); entityManager.persist(movieById);
複数の更新例
次の例では、一致するドキュメントの title の値を "The Three Stooges" から "The 3 Stooges" にアップデートします。次に、この例ではexecuteUpdate() メソッドを呼び出して、データベースに変更を適用します。
var updateResult = session.createMutationQuery( "update Movie set title = :new where title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
var updateResult = entityManager.createQuery( "update Movie m set m.title = :new where m.title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
Delete Documents
次の操作を実行して、コレクションからドキュメントを削除できます。
1 つのドキュメントを削除します
remove()。セッション マネージャーまたはエンティティ マネージャーで、削除するエンティティインスタンスを引数として渡して、 メソッドを呼び出します。複数のドキュメントを削除:
createQuery()createMutationQuery()セッション マネージャーまたはエンティティ マネージャーの またはexecuteUpdate()メソッドに delete ステートメントを渡します。次に、 メソッドを呼び出して、変更をデータベースに適用します。
Tip
Hibernetes ORM を使用してデータを削除する方法の詳細については、次のリソースを参照してください。
非表示 ORM クエリガイドの Delete ステートメント
削除の例 1 つ
次の例では、 ObjectId 値でドキュメントを検索します。次に、この例ではセッションで remove() メソッドを呼び出して、sample_mflix.moviesコレクションから対応するドキュメントを削除します。
// Your ObjectId value might differ Movie movieToDelete = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); session.remove(movieToDelete);
// Your ObjectId value might differ Movie movieToDelete = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); entityManager.remove(movieToDelete);
複数の削除の例
次の例では、 sample_mflix.moviesコレクションから year 値が 1920 であるすべてのドキュメントを削除します。この例では削除ステートメントを createMutationQuery() メソッドに渡し、executeUpdate() メソッドを呼び出してデータベースに変更を適用します。
var deleteResult = session.createMutationQuery( "delete Movie where year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
var deleteResult = entityManager.createQuery( "delete Movie m where m.year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
詳細情報
Hibernetes ORM を使用してCRUD操作を実行する方法の詳細については、次のリソースを参照してください。
作成、読み取り、アップデート、削除の例をさらに見るには、「 使い始める 」チュートリアルの次のセクションを参照してください。
Hibernetes ORM 拡張機能を使用してクエリを実行する方法の詳細については、次のガイドを参照してください。