JPA、HibernateとEclipseLinkの違いは何ですか

人々はJPA、HibernateまたはEclipseLinkに慣れていないとき、彼らはしばしばそれらの違い あなたが彼らの一人なら、心配しないでください。 それはそれが思われるよりもはるかに簡単です。

最初にJPA仕様を見てみましょう。Java Persistence API(JPA)JPAは、Java Persistence APIの略の略語です。 これはJava EEの一部であり、オブジェクト-リレーショナル-マッピングと永続オブジェクトの管理のためのAPIを定義する仕様です。 このAPIは、Java SEおよびJava EE環境で使用できます。

この仕様は現在バージョン2.2で利用可能です。 ドキュメントはhttps://jcp.org/en/jsr/detail?id=338でダウンロードできます。 API jarは、次のMaven座標で利用できます。

<dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version></dependency>

JPA自体は実装クラスを提供していません。 API jarには、永続化レイヤーを実装するために使用できる一連のインターフェイスが含まれています。 しかし、JPAを単独で使用することはできません。 仕様を実装するJPAプロバイダが必要です。 利用可能ないくつかのオプションがあります。 最も人気のあるものはHibernateとEclipseLinkです。 しかし、それについては後で詳しく説明します。

最近まで、JpaはJava Community Process(JCP)に従って専門家グループによって管理および開発されていました。 これは、OracleがすべてのJava EE仕様をEclipse Foundationに移行することを発表したときに変更されました。 現在、移行プロセスの途中にあり、新しい仕様プロセスがすぐに定義されます。

JPA仕様で定義されているもの

この仕様では、このサイトのチュートリアルとビデオで説明したほとんどの機能を定義しています。 すべての準拠したJPA実装で使用できます。

最も重要なもののいくつかを見てみましょう。

ブートストラップと基本的なエンティティマッピング

JPAの使用を開始する前に、jpaをプロジェクトに追加し、永続性ユニットを構成し、エ あなたはおそらくすでにそれを行う方法を知っています、そして私は私のHibernateの入門記事でそれを非常に詳細に説明しました。

だから、ここではこの部分をスキップして、より興味深い機能について話しましょう。

関連付けのマッピング

JPAでは、単純なエンティティ属性をデータベース列にマップできるだけでなく、データベーステーブル間の関連付けをエンテ

@Entitypublic class Review {...@ManyToOneprivate Book book;...}

これは、関連するエンティティをロードするためにエンティティのgetterメソッドを呼び出す必要があるため、エンティティモデルを非常 バックグラウンドでは、永続化プロバイダは、関連付けを取得および管理するために必要なすべてのデータベース操作を実行します。

これと同じくらい快適に使用できるため、この機能はパフォーマンスの問題を引き起こすことがよくあります。 エンティティ間の関連付けのモデル化を開始する前に、n+1選択の問題を回避するために、JPAのFetchTypesの効果を理解していることを確認してください。

JPQLとネイティブクエリ

JPAは、JPQLと呼ばれる独自のクエリ言語を定義しています。 これはSQLに似ていますが、データベースのテーブルモデルではなく、マップされたドメインモデルに基づいてクエリを定義できます。

次のコードスニペットは、単純なJPQLクエリを示しています。 アドホッククエリを定義するには、EntityManager emのcreateQueryメソッドを呼び出します。 ご覧のとおり、構文はSQLと非常によく似ています。 JPQLに慣れていない場合は、その構文と機能を詳細に説明したJPQLガイドをご覧ください。

TypedQuery<Book> q = em.createQuery("SELECT b FROM Book b WHERE b.id = :id", Book.class);q.setParameter("id", 1L);Book b = q.getSingleResult();

このようなクエリを実行すると、永続化プロバイダはJPQLステートメントを解釈し、それに対するSQLクエリを生成します。 これにより、永続化プロバイダはクエリをデータベース固有のSQL方言に適応させ、アプリケーションの移植性を向上させます。残念ながら、これは仕様によって定義されたクエリ機能、または永続化プロバイダによって独自にサポートされているクエリ機能にも制限されます。 この機能セットは、SQLが提供するものよりも大幅に小さく、独自のデータベース機能は含まれていません。しかし、それはJPAで高度なクエリや複雑なクエリを使用できないことを意味するものではありません。 これは漏れやすい抽象化として設計されており、ネイティブSQLクエリを実行することができます。 これらは永続化プロバイダによって解析されず、データベースでサポートされているすべての機能を使用できます。 しかし、これはデータベースの移植性に悪影響を与える可能性があることに注意してください。

ネイティブクエリの実行は非常に簡単です。 ネイティブSQLクエリを使用してEntityManagerのcreatenativequeryメソッドの代わりにcreateNativeQueryメソッドを呼び出すだけです。

Query q = em.createNativeQuery("SELECT * FROM book b WHERE id = :id", Book.class);q.setParameter("id", 1L);Book b = (Book) q.getSingleResult();

カスタムデータ型

JPA仕様では、ほとんどの標準型のマッピングが定義されていますが、それらに限定されていません。 Jpa2.1以降では、AttributeConverterを使用してカスタムデータ型を簡単にサポートできます。 AttributeConverterインターフェイスを実装し、@Converterアノテーションでクラスに注釈を付けるだけです。

AuthorStatus列挙型のカスタムマッピングを定義する属性コンバータの例を次に示します。前にも述べたように、プロジェクトでJPA仕様を使用する場合は、Jpaプロバイダが必要です。 これは、仕様で定義されているインターフェイスを実装します。 最も人気のあるものはEclipseLinkとHibernateです。JPAが提供する標準化されたAPIの利点の1つは、実行時に実装を追加するだけで、コードを変更せずに別のAPIに置き換えることができることです。 標準化されたAPIにより、EclipseLinkとHibernateは互換性があります。では、なぜ異なる実装が必要なのですか?

JPA実装は独立したチームによって管理され、アプリケーションとテクノロジのスタックに最適なパフォーマンスまたはサポートを提供するものを選 それらはまた付加的な、標準外機能性の提供によって彼ら自身を区別する。 これは、多くの場合、技術革新を推進するために使用されます。 今日の人気のある独自の機能は、JPA標準への次の追加への最初のステップかもしれません。 これらの独自の機能のいずれかを使用すると、明らかに、特定のJPA実装を置き換えることがはるかに困難になります。EclipseLinkはJPAのリファレンス実装であり、JPAバージョン2.2を実装しています。 プロジェクトにEclipseLinkを追加する最も簡単な方法は、次のMaven座標を使用することです。P>

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.1</version></dependency>

興味深い独自の機能

Jpa標準で定義されている機能に加えて、EclipseLinkは次のようないくつかの興味深い独自の機能も提供しています:

  • データベース変更イベントの処理
  • 複数のデータベース内のテーブルにエンティティをマップする複合永続化ユニット
  • マルチテナンシーのサポート

Hibernate

HibernateはRed HatのJPA仕様の非常に一般的な実装です。 JPA2.2で定義されているほぼすべての機能を実装しており、すぐに完全に準拠したバージョンをリリースする予定です。次のMaven依存関係は、プロジェクトにHibernateを追加します。

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.1.11</version></dependency>

興味深い独自の機能

EclipseLinkと同様に、Hibernateは次のような興味深い独自の機能を提供しています。

  • 自然Idの拡張サポート
  • 主キーで複数のエマルチテナント

コメントを残す

メールアドレスが公開されることはありません。