使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合

Mehvish Ashiq 2023年1月30日 2022年7月18日
  1. MongoDB 中的休眠 OGM
  2. 使用 Hibernate OGM 的重要性
  3. 使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合
使用 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

在關聯式資料庫中,我們可以通過包含一個 studentscourses 表來對此建模,其中 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 格式儲存為文件。

如果我們儲存前面的 studentscourses 示例,它將在 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 和關係資料儲存之間的一致性。由於兩個關鍵介面 GridDialectDatastoreProvider,Hibernate OGM 可以提供對各種 NoSQL 資料儲存的抽象。

這就是為什麼 Hibernate OGM 支援的每個新的 NoSQL 資料儲存都帶有 DatastoreProviderGridDialect 介面的實現。

截至今天,儘管 Hibernate OGM 不支援所有 NoSQL 資料儲存,但能夠與其中的許多資料一起工作,包括 Infinispan(鍵值)、Neo4j(圖形)和 MongoDB(文件)。

使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合

我們需要設定以下內容以使用 Hibernate OGM 將 Hibernate 與 MongoDB 整合。

  1. Java(我們使用的是 Java 18.0.1.1)。
  2. MongoDB 伺服器(我們使用的是 MongoDB 5.0.8)。
  3. 程式碼編輯器或 Java IDE(我們使用 Apache NetBeans IDE 13)。
  4. 使用 Maven 或 Gradle 的依賴項(我們正在使用 Maven)。

在這裡,我們將建立一個名為 Student 的類,該類將被視為 EntityStudent 類的屬性將作為 MongoDB 中的 field 名稱。我們使用註解將 Java 類對映到實體,將屬性對映到欄位。

讓我們首先為此準備所需的檔案。編寫 pom.xml 檔案(該檔案包含所有必需的依賴項):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://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="http://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 專案中所有檔案的正確位置。

使用 hibernate ogm 將 hibernate 與 mongodb 整合 - 所有檔案

現在,執行程式。你可以觀察以下輸出以瞭解我們如何執行並確保一切正常。

輸出:

使用 hibernate ogm 將 hibernate 與 mongodb 整合 - 最終輸出

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook