使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合
在本文中,我們將瞭解 Hibernate Object/Grid Mapper (OGM) 的重要性,並使用它來整合 Hibernate 和 MongoDB。
MongoDB 中的休眠 OGM
Hibernate Object/Grid Mapper (OGM) 為我們提供了對 NoSQL 資料儲存的 Java Persistence API (JPA) 支援。請記住,NoSQL 是涵蓋所有子資料儲存型別的父術語。
例如,它包括文件、鍵值、面向圖形和麵向列的資料儲存。
使用 Hibernate OGM 的重要性
要了解它的重要性,你必須瞭解任何關聯式資料庫、Hibernate 和 MongoDB 的基礎知識。假設你具備所有基本知識(至少一個關聯式資料庫、Hibernate 和 MongoDB)。
Hibernate 將 Java 物件(更準確地說是屬性(也稱為欄位))對映到資料庫表中的列。讓我們舉一個例子,一個 students
可以有多個 courses
。
在關聯式資料庫中,我們可以通過包含一個 students
和 courses
表來對此建模,其中 courses
表中的多個條目可以對映到 students
表中的一個學生。
create table students {
id integer(10),
name varchar(100),
department varchar(100)
}
create table courses {
id integer(10),
course1 varchar(50),
course2 varchar(50),
}
create table student_courses {
student_id integer(10),
course_id integer(10)
}
我們可以在 Java 中表示類似的關係,如下所示。
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="student_courses", joinColumns={@JoinColumn(name="student_id ", referencedColumnName="id")}
, inverseJoinColumns={@JoinColumn(name="course_id", referencedColumnName="id")})
private Set<CoursesEntity> courses;
雖然 MongoDB 是一個 NoSQL 資料庫,但它通過鍵值對儲存和訪問資料。請記住,值部分以 JSON
/XML
格式儲存為文件。
如果我們儲存前面的 students
和 courses
示例,它將在 MongoDB 中如下所示。
{
id: 1,
name: "John",
department: "Comptuer Science"
courses: [
{
course1: "C Programming",
course2: "Machine Learning"
},
{
course1: "Recommender Systems",
course2: "Data Science"
}
]
}
正如我們所看到的,MongoDB 具有可以更深入的巢狀欄位,我們不能通過遵循傳統方法將 Java 欄位/屬性對映到文件來使用 Hibernate 和 MongoDB。
這就是我們需要物件/網格對映器(OGM)的地方。Hibernate 為我們提供了一個 OGM 引擎實現,它擴充套件了它的功能和特性以支援 NoSQL 資料儲存,例如 MongoDB。
OGM 還通過使用我們特定 NoSQL 資料庫語言的本機查詢以及 Java 永續性查詢語言 (JPQL)(也稱為 Java 永續性 API (JPA))來提供查詢資料的好處。
使用 OGM 的主要優勢是 Java Persistence API 在 NoSQL 和關係資料儲存之間的一致性。由於兩個關鍵介面 GridDialect
和 DatastoreProvider
,Hibernate OGM 可以提供對各種 NoSQL 資料儲存的抽象。
這就是為什麼 Hibernate OGM 支援的每個新的 NoSQL 資料儲存都帶有 DatastoreProvider
和 GridDialect
介面的實現。
截至今天,儘管 Hibernate OGM 不支援所有 NoSQL 資料儲存,但能夠與其中的許多資料一起工作,包括 Infinispan
(鍵值)、Neo4j
(圖形)和 MongoDB
(文件)。
使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合
我們需要設定以下內容以使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合。
- Java(我們使用的是 Java 18.0.1.1)。
- MongoDB 伺服器(我們使用的是 MongoDB 5.0.8)。
- 程式碼編輯器或 Java IDE(我們使用 Apache NetBeans IDE 13)。
- 使用 Maven 或 Gradle 的依賴項(我們正在使用 Maven)。
在這裡,我們將建立一個名為 Student
的類,該類將被視為 Entity
,Student
類的屬性將作為 MongoDB 中的 field
名稱。我們使用註解將 Java 類對映到實體,將屬性對映到欄位。
讓我們首先為此準備所需的檔案。編寫 pom.xml
檔案(該檔案包含所有必需的依賴項):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.voidtesting.hibernatewithmongodbusingogm</groupId>
<artifactId>HibernateWithMongoDBUsingOGM</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>18</maven.compiler.source>
<maven.compiler.target>18</maven.compiler.target>
<exec.mainClass>
<!--this name will be on single line, we are splitting it
for readability purpose-->
com.voidtesting.hibernatewithmongodbusingogm
.HibernateWithMongoDBUsingOGM
</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.ogm</groupId>
<artifactId>hibernate-ogm-mongodb</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.narayana.jta</groupId>
<artifactId>narayana-jta</artifactId>
<version>5.9.2.Final</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.parboiled</groupId>
<artifactId>parboiled-java</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.jboss.jbossts</groupId>
<artifactId>jbossjta</artifactId>
<version>4.16.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.9.Final</version>
</dependency>
</dependencies>
</project>
編寫 persistence.xml
檔案(這裡,我們配置給定的 JPA 持久單元):
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ogmdemo" transaction-type="JTA">
<!-- Use the Hibernate OGM provider: configuration will be transparent -->
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
<class>com.voidtesting.hibernatewithmongodbusingogm.Student</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"
/>
<!--
Here you will pick which NoSQL technology to use, and configure it;
in this example we use MongoDB.
-->
<property name="hibernate.ogm.datastore.provider" value="MONGODB"/>
<!-- Define MongoDB access parameters here. -->
<property name="hibernate.ogm.datastore.host" value="127.0.0.1"/>
<property name="hibernate.ogm.datastore.port" value="27017"/>
<property name="hibernate.ogm.datastore.create_database" value="true"/>
<property name="hibernate.ogm.datastore.database"
value="HibernateMongoDBDemo"/>
</properties>
</persistence-unit>
</persistence>
確保在 src/main/resources/META-INF
目錄中有 persistence.xml
檔案。否則,你可能會遇到錯誤。
建立 Student.java
類(該類將對映為實體,其變數對映為 MongoDB 中的欄位):
package com.voidtesting.hibernatewithmongodbusingogm;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Student implements Serializable {
@Id public int id;
public String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public Student() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
你可能注意到我們使用了註解@Entity
和@Id
來告訴 MongoDB 為這個類建立一個實體並將它命名為 Student
,其中主鍵是 id
。你可以在此處找到所有 JPA 註釋。
建立 Java 主類:
package com.voidtesting.hibernatewithmongodbusingogm;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class HibernateWithMongoDBUsingOGM {
public static void main(String args[]) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogmdemo");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// perform operations here
Student std = new Student(1, "Mehvish Ashiq");
entityManager.persist(std);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
}
}
這是一個截圖,用於瞭解 Java 專案中所有檔案的正確位置。
現在,執行程式。你可以觀察以下輸出以瞭解我們如何執行並確保一切正常。
輸出: