Verwendung von Hibernate OGM zur Integration von Hibernate mit MongoDB

Mehvish Ashiq 15 Februar 2024
  1. OGM in MongoDB in den Ruhezustand versetzen
  2. Bedeutung der Verwendung von Hibernate OGM
  3. Verwenden Sie Hibernate OGM, um Hibernate mit MongoDB zu integrieren
Verwendung von Hibernate OGM zur Integration von Hibernate mit MongoDB

In diesem Artikel lernen wir die Bedeutung von Hibernate Object/Grid Mapper (OGM) kennen und verwenden ihn, um Hibernate mit MongoDB zu integrieren.

OGM in MongoDB in den Ruhezustand versetzen

Hibernate Object/Grid Mapper (OGM) bietet uns Unterstützung für die Java Persistence API (JPA) für die NoSQL-Datenspeicher. Denken Sie daran, dass NoSQL der übergeordnete Begriff ist, der die gesamte untergeordnete Vielfalt der Datenspeicherung abdeckt.

Beispielsweise umfasst es Dokumente, Schlüsselwerte, diagrammorientierte und spaltenorientierte Datenspeicher.

Bedeutung der Verwendung von Hibernate OGM

Um seine Bedeutung zu verstehen, müssen Sie jede relationale Datenbank, Hibernate und MongoDB auf einer grundlegenden Ebene kennen. Vorausgesetzt, Sie haben grundlegende Kenntnisse über alle (mindestens eine relationale Datenbank, Hibernate und MongoDB).

Der Hibernate bildet Java-Objekte, genauer Eigenschaften (auch als Felder bezeichnet), auf die Spalten einer Datenbanktabelle ab. Nehmen wir ein Beispiel, bei dem ein students mehrere courses haben kann.

In einer relationalen Datenbank können wir dies modellieren, indem wir eine Tabelle students und courses enthalten, in der mehrere Einträge in der Tabelle courses einem Studenten in der Tabelle students zugeordnet werden können.

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)
}

Wir können eine ähnliche Beziehung in Java wie folgt darstellen.

@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;

Während MongoDB eine NoSQL-Datenbank ist, speichert und greift es auf die Daten über Schlüssel-Wert-Paare zu. Denken Sie daran, dass der Wertabschnitt als Dokument im JSON/XML-Format gespeichert wird.

Wenn wir das vorherige Beispiel von students und courses hinterlegen, sieht es in MongoDB wie folgt aus.

{
    id: 1,
    name: "John",
    department: "Comptuer Science"
    courses: [
        {
            course1: "C Programming",
            course2: "Machine Learning"
        },
        {
            course1: "Recommender Systems",
            course2: "Data Science"
        }
   ]
}

Da wir sehen können, dass MongoDB verschachtelte Felder hat, die noch tiefer gehen können, können wir Hibernate nicht mit MongoDB verwenden, indem wir traditionellen Methoden folgen, um Java-Felder/Eigenschaften einem Dokument zuzuordnen.

Hier brauchen wir Object/Grid Mapper (OGM). Hibernate stellt uns eine OGM-Engine-Implementierung zur Verfügung, die ihre Funktionalität und Features erweitert, um NoSQL-Datenspeicher, z. B. MongoDB, zu unterstützen.

Das OGM bietet auch den Vorteil, Daten abzufragen, indem es native Abfragen der Sprache unserer spezifischen NoSQL-Datenbank zusammen mit der Java Persistence Query Language (JPQL) verwendet, die auch als Java Persistence API (JPA) bezeichnet wird.

Der Hauptvorteil der Verwendung von OGM ist die Konsistenz der Java Persistence API über NoSQL- und relationale Datenspeicher hinweg. Das Hibernate OGM kann aufgrund zweier Schlüsselschnittstellen, GridDialect und DatastoreProvider, eine Abstraktion über verschiedene NoSQL-Datenspeicher bereitstellen.

Aus diesem Grund enthält jeder neue von Hibernate OGM unterstützte NoSQL-Datenspeicher die Implementierung der Schnittstellen DatastoreProvider und GridDialect.

Stand heute unterstützt Hibernate OGM zwar nicht alle NoSQL-Datenspeicher, kann aber mit vielen von ihnen arbeiten, darunter Infinispan (Schlüsselwert), Neo4j (Grafik) und MongoDB (Dokument).

Verwenden Sie Hibernate OGM, um Hibernate mit MongoDB zu integrieren

Wir müssen Folgendes einrichten, um Hibernate OGM für die Integration von Hibernate mit MongoDB zu verwenden.

  1. Java (wir verwenden Java 18.0.1.1).
  2. MongoDB-Server (wir verwenden MongoDB 5.0.8).
  3. Code Editor oder Java IDE (wir verwenden Apache NetBeans IDE 13).
  4. Abhängigkeiten mit Maven oder Gradle ([wir verwenden Maven]).

Hier erstellen wir eine Klasse namens Student, die als Entity behandelt wird, und die Eigenschaften der Klasse Student werden als field-Namen in MongoDB verwendet. Wir verwenden Annotationen, um Java-Klassen Entitäten und Eigenschaften Feldern zuzuordnen.

Lassen Sie uns zuerst die erforderlichen Dateien dafür vorbereiten. Schreiben Sie die Datei pom.xml (diese Datei enthält alle erforderlichen Abhängigkeiten):

<?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>

Schreiben Sie die Datei persistence.xml (Hier konfigurieren wir die angegebene JPA-Persistenzeinheit):

<?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>

Stellen Sie sicher, dass Sie die Datei persistence.xml im Verzeichnis src/main/resources/META-INF haben. Andernfalls können Fehler auftreten.

Erstellen Sie die Klasse Student.java (diese Klasse wird als Entität und ihre Variablen als Felder in MongoDB abgebildet):

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;
  }
}

Sie werden vielleicht bemerken, dass wir die Annotationen @Entity und @Id verwendet haben, um der MongoDB mitzuteilen, die eine Entität für diese Klasse erstellt, und sie als Student zu benennen, wobei der Primärschlüssel id wäre. Sie können alle JPA-Annotationen hier finden.

Java-Hauptklasse erstellen:

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();
  }
}

Hier ist ein Screenshot, um den korrekten Speicherort aller Dateien in Java Project zu erfahren.

Verwenden Sie hibernate ogm, um hibernate mit mongodb zu integrieren - alle Dateien

Führen Sie nun das Programm aus. Sie können die folgende Ausgabe beobachten, um zu sehen, wie wir ausführen und sicherstellen, dass alles gut funktioniert.

Ausgabe:

Verwenden Sie hibernate ogm, um hibernate mit mongodb zu integrieren - endgültige Ausgabe

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