Overview
Hibernate ORM 使您能够使用Java对象执行数据库操作,并且您可以使用适用于 Hibernate ORM 的MongoDB扩展来简化应用程序与MongoDB数据的交互。本指南介绍如何安装 Hibernate ORM 扩展、设立MongoDB 部署以及创建定义映射到MongoDB集合的类的Java应用程序。
提示
MongoDB Atlas 是完全托管的云数据库服务,旨在托管您的 MongoDB 部署。您可以按照本指南中的步骤创建您的免费(无需信用卡)MongoDB Atlas 部署。
下载并安装
安装依赖项
在开始开发之前,请确保本地计算机上安装了以下依赖项:
Java 版本 17 或更高版本
集成开发环境 (IDE),例如 IntelliJ IDEA 或 Eclipse
安装扩展
在 IDE 中,创建一个名为 MongoHibernateQuickstart 的新 Maven 或 Gradle项目。对于 Maven 项目,请将以下依赖项添加到 pom.xml文件中:
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-hibernate</artifactId> <version>1.0.0-alpha0</version> </dependency> </dependencies>
对于 Gradle 项目,请将以下依赖项添加到您的 build.gradle文件中:
dependencies { implementation("org.mongodb:mongodb-hibernate:1.0.0-alpha0") }
在 IDE 中,确保重新加载或同步项目以完成 Hibernate ORM 扩展安装。
完成这些步骤后,您已安装 Hibernate ORM 扩展,并在 IDE 中设立新的 Maven 或 Gradle项目。
创建 MongoDB 部署
您可以在 MongoDB Atlas 上创建一个免费套餐 MongoDB 部署来存储和管理您的数据。MongoDB Atlas 在云端托管和管理您的 MongoDB 数据库。
在 Atlas 上创建免费的 MongoDB 部署
完成MongoDB 入门指南,设立新的Atlas帐户并将示例数据加载到新的免费套餐MongoDB 部署。按照 Cloud Deployment 标签页中的说明在云中创建MongoDB Atlas部署。
完成这些步骤后,您就在 Atlas 上有了一个新的免费套餐 MongoDB 部署、数据库用户档案以及加载到数据库中的示例数据。
创建连接字符串
您可以通过提供连接 URI(也称为连接字符串)来连接到 MongoDB 部署,它指示驱动程序如何连接到 MongoDB 部署以及连接时的行为方式。
连接字符串包含部署的主机名或 IP 地址和端口、身份验证机制、用户档案(如果适用)以及连接选项。
查找 MongoDB Atlas 连接字符串
要检索您在上一步中创建的部署的连接字符串,日志登录您的Atlas帐户并导航到 Clusters 部分。单击新部署的 Connect 按钮,如以下屏幕截图所示:

然后,继续执行 Connect your application 部分。从 Driver 选择菜单中选择“Java”,然后从 Version 选择菜单中选择与您安装的版本最匹配的版本。
完成这些步骤后,您就拥有了一个包含用户名、密码和数据库的连接字符串。
配置应用程序
安装 Hibernate ORM 扩展并创建MongoDB Atlas 群集后,您可以创建连接到MongoDB 的Java应用程序。
将应用程序连接到MongoDB
导航到 MongoHibernateQuickstart 项目的 src/main/resources目录并创建一个名为 hibernate.cfg.xml 的新文件,用于存储应用程序的配置设置。
将以下代码复制到此文件中:
<hibernate-configuration> <session-factory> <property name="hibernate.dialect">com.mongodb.hibernate.dialect.MongoDialect</property> <property name="hibernate.connection.provider_class"> com.mongodb.hibernate.jdbc.MongoConnectionProvider </property> <property name="jakarta.persistence.jdbc.url"> connection-string </property> <property name="hibernate.show_sql">true</property> <mapping class="org.example.Movie"/> </session-factory> </hibernate-configuration>
在jakarta.persistence.jdbc.url 属性中,将connection-string 占位符替换为您在上一步中创建的连接字符串。
创建实用程序类来管理会话
注意
默认包目录
本教程使用 Maven 和 Gradle 的默认org.example包,并将应用程序文件添加到 src/main/java/org/example目录。如果使用不同的包名称,请确保在相应的目录中创建文件。
在项目的 src/main/java/org/example目录中,创建一个名为 HibernateUtil.java 的新文件。该实用程序类会根据 hibernate.cfg.xml 配置文件创建一个 SessionFactory。
将以下代码复制到此文件中:
package org.example; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public final class HibernateUtil { private static final SessionFactory SESSION_FACTORY = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); private HibernateUtil() {} public static SessionFactory getSessionFactory() { return SESSION_FACTORY; } }
定义您的Movie 实体
在项目的 org/example目录中,创建一个名为 Movie.java 的新文件。此文件包含您的 Movie 实体,它表示 Atlas 示例数据集 中的 sample_mflix.movies 示例集合。
将以下代码复制到此文件中:
package org.example; import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import java.util.List; 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 List<String> cast; public Movie(String title, String plot, int year, List<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 List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } }
此文件定义了一个包含以下字段的 Movie 实体:
id:电影的唯一标识符,映射到MongoDB_id字段。title:电影的标题。year:电影上映的年份。cast:表示电影演员的字符串列表。
定义主应用程序类
在项目的 org/example目录中,创建一个名为 Main.java 的新文件。此文件包含主应用程序类,其中存储应用程序的逻辑。
将以下代码复制到此文件中:
package org.example; import org.hibernate.Transaction; import org.hibernate.Session; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // Add CRUD operations here tx.commit(); session.close(); sf.close(); } }
完成这些步骤后,您已将Java应用程序配置为使用 Hibernate ORM 扩展并连接到您的MongoDB部署。您的应用程序具有以下文件结构:
MongoHibernateQuickstart ├── src │ └── main │ ├── java │ │ └── org/example │ │ ├── HibernateUtil.java │ │ ├── Main.java │ │ └── Movie.java │ └── resources │ └── hibernate.cfg.xml ├── .gitignore ├── pom.xml (for Maven projects) └── build.gradle (for Gradle projects)
运行示例查询
您可以对 Movie 对象运行查询,扩展会将其转换为MongoDB查询。
对 title字段运行查询
导航到 Main.java文件并将以下代码粘贴到 // Add CRUD operations here 注释下方:
var searchTitle = "Little Women"; var results = session.createQuery("from Movie m where m.title = :t", Movie.class) .setParameter("t", searchTitle) .getResultList(); for (var m : results) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear()); }
此代码使用 Hibernate ORM 的 Hibernate 查询语言 (HQL) 来检索title 值为 "Little Women" 的 sample_mflix.movies 文档。然后,它会打印每个结果的 title 和 year 值。
提示
要了解有关 HQL 的更多信息,请参阅 Hibernate ORM 用户指南中的Hibernate 查询语言。
运行应用程序
在 IDE 中运行 Main.java文件。输出包含有关数据库命令和检索到的文档的详细信息:
Hibernate: {"aggregate": "movies", "pipeline": [{"$match": {"title": {"$eq": {"$undefined": true}}}}, {"$project": {"_id": true, "cast": true, "plot": true, "title": true, "year": true}}]} Title: Little Women, Year: 1949 Title: Little Women, Year: 1994
将数据写入 MongoDB
您可以通过创建和修改 Movie 对象将数据写入MongoDB 部署。
将文档插入movies 集合
在 Main.java文件中,添加以下代码以创建名为 myMovie 的 Movie 实体实例并将其保存到数据库:
var title = "A Real Pain"; var plot = "Mismatched cousins David and Benji tour Poland to honor their grandmother. " + "Their adventure becomes complicated as old tensions resurface while exploring their family history."; var year = 2024; var cast = List.of("Jesse Eisenberg", "Kieran Culkin", "Will Sharpe"); var myMovie = new Movie(title, plot, year, cast); session.persist(myMovie); System.out.println("Movie created with ID: " + myMovie.getId());
此代码创建一个新的 Movie 实体实例,并使用 session.persist() 方法将其保存到数据库。
更新文档
将以下代码添加到 Main.java文件,以更新您在上一步中创建的 Movie实例:
var currentCast = new ArrayList<>(myMovie.getCast()); currentCast.add("Jennifer Grey"); myMovie.setCast(currentCast); System.out.println("Movie updated with new cast: " + myMovie.getCast());
此代码检索当前的 cast 值,向其添加新的节点,并更新 myMovie 实体实例的 cast字段。Hibernate ORM 扩展将此更改应用于数据库中的相应文档。
运行应用程序
在 IDE 中运行 Main.java文件。输出包含有关写入操作的详细信息:
Hibernate: {"insert": "movies", "documents": [{"cast": {"$undefined": true}, "plot": {"$undefined": true}, "title": {"$undefined": true}, "year": {"$undefined": true}, "_id": {"$undefined": true}}]} Hibernate: {"delete": "movies", "deletes": [{"q": {"_id": {"$eq": {"$undefined": true}}}, "limit": {"$numberInt": "0"}}]} Movie created with ID: <ObjectId> Movie updated with new cast: [Jesse Eisenberg, Kieran Culkin, Will Sharpe, Jennifer Grey] Movie deleted with ID: <ObjectId>
后续步骤
恭喜您完成本教程!
注意
如果您在学习本教程时运行问题,请使用本页面右侧的 Rate this page 标签页提交反馈。
您可以使用MongoDB Stack Overflow标签 或MongoDB Reddit Community 寻求一般问题的支持。
在本教程中,您创建了一个Java应用程序,该应用程序连接到MongoDB Atlas上托管的MongoDB 部署,并使用 Hibernate ORM 扩展与数据进行交互。
要学习;了解有关 Hibernate ORM 扩展的更多信息,请参阅以下资源:
Hibernate ORM 扩展 API文档
GitHub 上的 mongo-hibernate源代码
要查看演示如何安装 Hibernate ORM 扩展以及与图书数据交互的入门教程,请入门Hibernate ORM 和MongoDB Foojay博文。
