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.movies Atlas示例数据集中的 集合。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; } }
要学习;了解如何创建Java应用程序以使用MongoDB Extension for Hibernate ORM 与此MongoDB示例集合交互,请参阅 入门教程。
重要
持久性上下文
启用Hibernate ORM 能够与数据库交互,您必须使用 Hibernate Session 或 Jakarta Persistence EntityManager 在持久性上下文中运行操作。您还必须在ACID 事务中运行写入操作,才能修改MongoDB数据并保持数据完整性。
在运行本指南中的示例之前,请确保将持久性上下文和ACID 事务管理代码添加到应用程序中,代码类似于以下代码:
// 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():使用 Hibernate API应用更改应用于数据库jakarta.persistence.EntityManager.persist():使用 Jakarta Persistence 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() 方法:
Hibernate 的
SessionAPI:使用 Hibernate Query Language (HQL) 语法定义查询Jakarta Persistence 的
EntityManagerAPI:使用 Jakarta Persistence Query Language (JPQL) 语法(HQL 的子集)来定义查询
提示
要学习;了解有关使用 HQL 和 JPQL 语法检索数据的更多信息,请参阅 Hibernate ORM查询指南中的 Select 语句。
返回一个文档示例
要仅检索与查询条件匹配的一份文档,请将 getSingleResult() 方法链接到 createQuery() 方法。以下示例从 sample_mflix.movies集合中检索一个 title 值为 "Boyhood" 的文档:
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 和 JPQL 返回 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
修改文档
您可以执行以下操作来修改集合中的文档:
提示
要学习;了解有关使用 Hibernate ORM 修改数据的更多信息,请参阅以下资源:
Hibernate ORM 用户指南中的修改托管/持久状态
更新一个示例
以下示例通过 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
您可以执行以下操作从集合中删除文档:
删除一个文档:在会话或实体管理器上调用
remove()方法,并将要删除的实体实例作为参数传递。删除多个文档:将删除声明传递给会话或实体管理器上的
createQuery()或createMutationQuery()方法。然后,调用executeUpdate()方法将更改应用到数据库。
提示
要学习;了解有关使用 Hibernate ORM 删除数据的更多信息,请参阅以下资源:
Hibernate ORM 用户指南中的删除实体
删除一个示例
以下示例通过 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
更多信息
要学习;了解有关使用 Hibernate ORM 执行增删改查操作的更多信息,请参阅以下资源:
要查看更多创建、读取、更新和删除示例,请参阅入门教程的以下部分:
要学习;了解有关使用 Hibernate ORM 扩展来运行查询的更多信息,请参阅以下指南: