Hibernate OGMのガイド

Hibernate OGMのガイド

1. 概要

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

Hibernate OGMは、NoSQLデータストアのJava Persistence API(JPA)サポートを提供します。 NoSQLは、さまざまなデータストレージを網羅する包括的な用語です。 たとえば、これには、キー値、ドキュメント、列指向およびグラフ指向のデータストアが含まれます。

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

リレーショナルデータベースの場合はHibernate traditionally offers an Object Relational Mapping (ORM) engineHibernate OGM engine extends its functionality to support NoSQL datastores.これを使用する主な利点は、リレーショナルデータストアとNoSQLデータストア間でのJPAインターフェースの一貫性です。

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

現在のところ、すべてのNoSQLデータストアをサポートしているわけではありませんが、InfinispanとEhcache(キー値)、MongoDBとCouchDB(ドキュメント)、Neo4j(グラフ)などの多くのデータストアと連携できます。

It also fully supports transactions and can work with standard JTA providers.まず、これは、明示的な構成なしでJavaEEコンテナーを介して提供できます。 さらに、Java SE環境ではNarayanaのようなスタンドアロンのJTAトランザクションマネージャーを使用できます。

3. セットアップ

このチュートリアルでは、Mavenを使用して、HibernateOGMを操作するために必要な依存関係を取得します。 MongoDBも使用します。

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

3.1. Mavenの依存関係

HibernateOGMとMongoDBを操作するために必要な依存関係を見てみましょう。


    org.hibernate.ogm
    hibernate-ogm-mongodb
    5.4.0.Final


    org.jboss.narayana.jta
    narayana-jta
    5.9.2.Final

ここでは、Mavenを介して必要な依存関係を取得しています。

3.2. 永続性ユニット

また、休止状態のpersistance.xmldefine datastore detailsを実行する必要があります。


    org.hibernate.ogm.jpa.HibernateOgmPersistence
    
        
        
        
    

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

  • 属性transaction-typeの値は「JTA」です(これは、EntityManagerFactory)からJTAエンティティマネージャーが必要であることを意味します

  • Hibernate OGMの場合はHibernateOgmPersistenceであるプロバイダー

  • DBに関連するいくつかの追加の詳細(これらは通常、異なるデータソース間で異なります)

この構成では、MongoDBが実行されており、デフォルトでアクセス可能であると想定しています。 そうでない場合は、常にprovide details as necessaryを使用できます。 以前の記事の1つでは、setting up MongoDB in detailについても説明しています。

4. エンティティ定義

基本を終えたので、いくつかのエンティティを定義しましょう。 If we worked with Hibernate ORM or JPA before, this has nothing more to add。 これがHibernate OGMの基本的な前提です。 promises to let us work with different NoSQL datastores with just the knowledge of JPAです。

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

image

ArticleAuthor、および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
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 assignedAuthors = new HashSet<>();

    // constructors, getters and setters...
}

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

  • それらをJPAエンティティとして確立するための@Entity

  • @Idは、UUIDを持つエンティティの主キーを生成します

  • エンティティ間の双方向関係を確立するための@OneToManyおよび@ManyToOne

5. オペレーション

エンティティを作成したので、エンティティに対していくつかの操作を実行できるかどうかを見てみましょう。 最初のステップとして、いくつかのテストデータを生成する必要があります。 ここでは、Editor、いくつかのAuthor、およびいくつかのArticle.を作成します。また、それらの関係も確立します。

その後、操作を実行する前に、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を再度使用してデータを検索し、標準のアサーションを実行しています。 このテストを実行すると、データストアのインスタンスが作成され、エンティティが永続化され、エンティティが取得されて検証されます。

繰り返しますが、just used JPA to persist the entities along with their relationshipがあります。 同様に、we use JPA to load the entities backとそれはすべて正常に機能します。これは、データベースの選択肢が従来のリレーショナルデータベースではなくMongoDBである場合でも同様です。

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

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

バックエンドをNeo4j, which happens to be a popular graph-oriented datastoreに変更します。

まず、Maven dependency for Neo4jを追加しましょう。


    org.hibernate.ogm
    hibernate-ogm-neo4j
    5.4.0.Final

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


    org.hibernate.ogm.jpa.HibernateOgmPersistence
    
        
        
        
    

要するに、これらはNeo4jに必要な非常に基本的な構成です。 これはdetailed further as requiredにすることができます。

まあ、それはほとんどやらなければならないことです。 Neo4jでバックエンドデータストアと同じテストを実行すると、かなりシームレスに機能します。

バックエンドを、たまたまドキュメント指向のデータストアであるMongoDBからグラフ指向のデータストアであるNeo4jに切り替えたことに注意してください。 And we did all this with minimal changes and without needing any changes in any of our operations

7. 結論

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

いつものように、例のコードはover on GitHubで利用できます。