Hibernate OGMのガイド

1概要

このチュートリアルでは、http://hibernate.org/ogm/[Hibernate Object/Grid Mapper(OGM)]の基本について説明します。

Hibernate OGMは、NoSQLデータストア用のJava Persistence API(JPA)サポートを提供します。 NoSQLは、さまざまなデータストレージを包括する包括的な用語です。たとえば、キーバリュー、ドキュメント、列指向、グラフ指向のデータストアなどです。

2. Hibernate OGMのアーキテクチャ

Hibernateは伝統的にリレーショナルデータベース用のObject Relational Mapping(ORM)エンジン を提供しています。 Hibernate OGMエンジンは、NoSQLデータストアをサポートするように機能を拡張しています これを使用する主な利点は、リレーショナルデータストアとNoSQLデータストア全体でJPAインターフェイスが一貫していることです。

Hibernate OGMは、 DatastoreProvider GridDialect の2つの主要なインターフェイスにより、多数のNoSQLデータストアを抽象化することができます。したがって、それがサポートするそれぞれの新しいNoSQLデータストアには、これらのインターフェースの実装が付属しています。

  • 現時点では、すべてのNoSQLデータストアをサポートしているわけではありませんが、InfinispanとEhcache(Key-Value)、MongoDBとCouchDB(document)、Neo4j(graph)などの多くのデータストアと連携できます。

  • また、https://www.baeldung.com/transaction-configuration-with-jpa-and-spring[トランザクションを完全にサポートする]であり、標準のJTAプロバイダと連携できます。明示的な設定さらに、Java SE環境ではNarayanaのようなスタンドアロンのJTAトランザクションマネージャを使用できます。

3セットアップ

このチュートリアルでは、必要な依存関係を引っ張ってHibernate OGMと連携するためにMavenを使用します。 MongoDB も使用します。

明確にするために、チュートリアル用にそれらを設定する方法を見てみましょう。

3.1. Mavenの依存関係

Hibernate OGMとMongoDBを使用するために必要な依存関係を見てみましょう。

<dependency>
    <groupId>org.hibernate.ogm</groupId>
    <artifactId>hibernate-ogm-mongodb</artifactId>
    <version>5.4.0.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.narayana.jta</groupId>
    <artifactId>narayana-jta</artifactId>
    <version>5.9.2.Final</version>
</dependency>

ここではMavenを通して必要な依存関係を引き出しています。

トランザクションマネージャ](JTAの実際のプロバイダ)

3.2. 持続性ユニット

また、Hibernateの__persistance.xmlに** データストアの詳細を定義する必要があります。

<persistence-unit name="ogm-mongodb" transaction-type="JTA">
    <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
    <properties>
        <property name="hibernate.ogm.datastore.provider" value="MONGODB"/>
        <property name="hibernate.ogm.datastore.database" value="TestDB"/>
        <property name="hibernate.ogm.datastore.create__database" value="true"/>
    </properties>
</persistence-unit>

ここで提供した定義に注意してください。

  • 属性transaction-typeの値が“ JTA”であること

EntityManagerFactory) のJTAエンティティマネージャが必要です。 ** Hibernate OGMの場合は HibernateOgmPersistence です。

  • DBに関連するいくつかの追加の詳細情報(これらは通常異なる

異なるデータソース間)

設定はMongoDBが実行中で、デフォルトでアクセス可能であることを前提としています。

そうでない場合は、https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html single/# configuring__mongodb[必要に応じて詳細を記入してください]。これまでの記事の1つに、https://www.baeldung.com/java-mongodb[MongoDBのセットアップ]も含まれています。

4エンティティ定義

基本について説明したので、次にエンティティを定義しましょう。 以前にHibernate ORMまたはJPAを使ったことがあれば、これ以上の追加はありません 。これがHibernate OGMの基本的な前提です。 JPAの知識だけで、さまざまなNoSQLデータストアを扱うことができます。

このチュートリアルでは、単純なオブジェクトモデルを定義します。

それはそれらの関係と共に Article Author および Editor クラスを定義します。

Javaでも定義しましょう。

@Entity
public class Article {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String articleId;

    private String articleTitle;

    @ManyToOne
    private Author author;

   //constructors, getters and setters...
}
@Entity
public class Author {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String authorId;

    private String authorName;

    @ManyToOne
    private Editor editor;

    @OneToMany(mappedBy = "author", cascade = CascadeType.PERSIST)
    private Set<Article> authoredArticles = new HashSet<>();

   //constructors, getters and setters...
}
@Entity
public class Editor {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String editorId;

    private String editorName;
    @OneToMany(mappedBy = "editor", cascade = CascadeType.PERSIST)
    private Set<Author> assignedAuthors = new HashSet<>();

   //constructors, getters and setters...
}

エンティティクラスを定義し、それらにJPA標準のアノテーションを付けました。

  • @ Entity - それらをJPAエンティティとして確立します。

UUIDを持つエンティティの主キーを生成する** @ Id

双方向の関係を確立するための** @ OneToMany および @ ManyToOne

エンティティ間

5オペレーション

エンティティを作成したので、これらのエンティティに対して何らかの操作を実行できるかどうかを確認しましょう。最初のステップとして、テストデータをいくつか生成する必要があります。ここでは、 編集者 、いくつかの 作成者 、そしていくつかの__記事を作成します。また、それらの関係も確立します。

その後、操作を実行する前に、 EntityManagerFactoryのインスタンスが必要になります。 これを使用して EntityManager を作成できます。

これと共に、トランザクションの境界を処理するために TransactionManager を作成する必要があります。

以前に作成したエンティティを永続化して取得するためにこれらを使用する方法を見てみましょう。

private void persistTestData(EntityManagerFactory entityManagerFactory, Editor editor)
  throws Exception {
    TransactionManager transactionManager =
      com.arjuna.ats.jta.TransactionManager.transactionManager();
    transactionManager.begin();
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    entityManager.persist(editor);
    entityManager.close();
    transactionManager.commit();
}

ここでは、ルートエンティティを永続化するために EntityManager を使用しています。また、定義済みのトランザクション境界内でこの操作を実行しています。

これで、永続化したエンティティをロードしてその内容を確認する準備が整いました。これを検証するためにテストを実行できます。

@Test
public void givenMongoDB__WhenEntitiesCreated__thenCanBeRetrieved() throws Exception {
    EntityManagerFactory entityManagerFactory =
      Persistence.createEntityManagerFactory("ogm-mongodb");
    Editor editor = generateTestData();
    persistTestData(entityManagerFactory, editor);

    TransactionManager transactionManager =
      com.arjuna.ats.jta.TransactionManager.transactionManager();
    transactionManager.begin();
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    Editor loadedEditor = entityManager.find(Editor.class, editor.getEditorId());

    assertThat(loadedEditor).isNotNull();
   //Other assertions to verify the entities and relations
}

ここでは、もう一度 EntityManager を使用してデータを見つけ、それに対して標準のアサーションを実行します。このテストを実行すると、データストアをインスタンス化し、エンティティを永続化し、それらを取得して検証します。

繰り返しますが、 JPAを使用してエンティティをエンティティの関係と共に永続化しました 。同様に、 エンティティの読み込みに JPAを使用しています。データベースの選択が従来のリレーショナルデータベースではなくMongoDBであっても、すべて正常に機能します。

6.バックエンドの切り替え

バックエンドを切り替えることもできます。今、それをするのがどれほど難しいかを見てみましょう。

バックエンドをhttps://www.baeldung.com/java-neo4j[Neo4jに変更します。これはたまたま人気のあるグラフ指向のデータストアです]。

まず、https://search.maven.org/search?q=a:hibernate-ogm-neo4j[Neo4jの天国への依存]を追加しましょう。

<dependency>
    <groupId>org.hibernate.ogm</groupId>
    <artifactId>hibernate-ogm-neo4j</artifactId>
    <version>5.4.0.Final</version>
</dependency>

次に、 persistence.xml に関連する永続ユニットを追加する必要があります。

<persistence-unit name="ogm-neo4j" transaction-type="JTA">
    <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
    <properties>
        <property name="hibernate.ogm.datastore.provider" value="NEO4J__EMBEDDED"/>
        <property name="hibernate.ogm.datastore.database" value="TestDB"/>
        <property name="hibernate.ogm.neo4j.database__path" value="target/test__data__dir"/>
    </properties>
</persistence-unit>

要するに、これらはNeo4jに必要な非常に基本的な設定です。

これはhttps://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html single/# configuring__neo4j[必要に応じてさらに詳しく]にすることができます。

まあ、それが、やるべきことのほとんどです。バックエンドのデータストアとしてNeo4jで同じテストを実行すると、それはかなりシームレスに動作します。

バックエンドを、ドキュメント指向のデータストアであるMongoDBから、グラフ指向のデータストアであるNeo4jに切り替えたことに注意してください。 そして、私たちはこれらすべてを最小限の変更で、そして私たちのどの操作においても変更を必要とせずに行いました

7. 結論

この記事では、アーキテクチャーを含め、Hibernate OGMの基本について説明しました。その後、基本ドメインモデルを実装し、各種DBを使用して各種操作を行いました。

いつものように、例のコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate-ogm[GitHubで利用可能]です。