1.はじめに

このチュートリアルでは、HibernateとJava Persistence API(JPA)の違いを中心に説明します。

JPAとは何か、その使用方法、およびその背後にある中核的な概念** を調べることから始めます。

それでは、HibernateとEclipseLinkがどのように関係しているのかを見ていきましょう。

2.オブジェクトリレーショナルマッピング

JPAに飛び込む前に、オブジェクトリレーショナルマッピング(ORMとも呼ばれる)の概念を理解することが重要です。

オブジェクトリレーショナルマッピングは、単に

Javaオブジェクトをデータベーステーブルに直接永続化するプロセス

です。通常、永続化されているオブジェクトの名前がテーブルの名前になり、そのオブジェクト内の各フィールドが列になります。テーブルが設定されると、各行はアプリケーションのレコードに対応します。

3. JPAの紹介

Java Persistence API(JPA)は、Javaアプリケーションにおけるリレーショナルデータの管理を定義する仕様です。 APIは、アプリケーション内のどのオブジェクトを永続化するか、およびそれらをどのように永続化するかを定義する一連の概念をまとめたものです。

ここで注意することが重要です。

JPAは仕様にすぎず、機能するには実装が必要です

それでは、実装でカバーしなければならないJPAの中心的な概念について説明しましょう。

3.1. エンティティ


  • javax.persistence.Entity

    クラスは、どのオブジェクトをデータベース** に永続化するかを定義します。永続エンティティごとに、JPAは選択されたデータベース内に新しいテーブルを作成します。

さらに、選択されたすべてのエンティティは、

__ @ Id


アノテーションで示される主キーを定義する必要があります。


@ GeneratedValue

__アノテーションとともに、レコードがデータベースに永続化されたときに主キーが自動的に生成されるように定義します。

JPAによって記述されたエンティティの簡単な例を見てみましょう。

@Entity
public class Car {

    @GeneratedValue
    @Id
    public long id;

   //getters and setters

}

覚えておいて、これは現在アプリケーションに影響を及ぼさないでしょう – JPAはいかなる実装コードも提供していません。

3.2. フィールド持続性

  • JPAのもう1つの中心的な概念はフィールド永続性です。 Javaのオブジェクトがエンティティとして定義されると、その中のすべてのフィールドは自動的にエンティティテーブル内の異なる列として永続化されます。

永続化されたオブジェクト内にデータベースに永続化したくないフィールドがある場合は、

__ @ Transient

__アノテーションを使用してフィールドを一時的に宣言できます。

3.3. 関係

次に、** JPAは、アプリケーション内で異なるデータベーステーブル間の関係を管理する方法を指定します。これまで見てきたように、JPAはこれをアノテーションで処理します。覚えておく必要がある4つの関係アノテーションがあります。


  1. @ OneToOne


  2. @ OneToMany


  3. @ ManyToOne


  4. @ ManyToMany

これがどのように機能するのかを見てみましょう。

@Entity
public class SteeringWheel {

    @OneToOne
    private Car car

   //getters and setters
}

上の例では、

__ SteeringWheel


classは、以前の


Car

__classとの一対一の関係を表しています。

3.4. エンティティマネージャ

最後に、

__https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html[javax.persistence.EntityManager]クラスは、データベースとの間の操作を指定します。



EntityManager__には、https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#persist-java.lang.Objectの一般的な作成、読み取り、更新、削除(CRUD)操作 が含まれています。 – データベースへの[永続化]。

4. JPAの実装

JPA仕様では、永続化する方法と内容を定義しているので、必要なコードを提供する実装プロバイダを選択する必要があります。そのようなプロバイダがなければ、JPAに準拠するためにすべての関連クラスを実装する必要があるでしょう。

から選ぶべきたくさんのプロバイダーがあります、それぞれがそれ自身の賛否両論を示しています。

どちらを使用するかを決定するときは、

以下の点をいくつか考慮する必要があります。

  1. プロジェクトの成熟度 – __

    プロバイダはどのくらいの期間使用されているか

よく文書化されている?
。サブプロジェクト – __

プロバイダーは私たちのために

便利なサブプロジェクト** を持っていますか

新しいアプリ?

。コミュニティサポート –

私たちが終わったときに私たちを助けてくれる人は誰でもいます**

重大なバグ

。ベンチマーク –



実装は** どの程度パフォーマンスが高いですか?

さまざまなJPAプロバイダのベンチマークについては詳しく説明しませんが、http://www.jpab.org/[JPA Performance Benchmark(JPAB)]にこれに関する貴重な洞察が含まれています。

邪魔にならないように、JPAのトッププロバイダーのいくつかを簡単に見てみましょう。

5.休止状態

基本的に、

HibernateはJPA

の実装を提供するオブジェクトリレーショナルマッピングツールです。

Hibernateは、周りで最も成熟したJPA実装

の1つであり、巨大なコミュニティがプロジェクトを支援しています。

これは、この記事の前半で見たすべての

__javax.persistence

__classを実装し、JPA以外の機能も提供します –

Hibernate tools

、http://hibernate.org/validator/[検証]、およびhttp://hibernate.org/search/[search]。これらのHibernate固有のAPIは便利かもしれませんが、基本的なJPA機能のみを必要とするアプリケーションでは必要ありません。

Hibernateが

@ Entity

アノテーションで提供するものを簡単に見てみましょう。

JPA契約を満たしている間、


__ @ org.hibernate.annotations.EntityはJPA仕様を超えた追加のメタデータを追加します。


そうすることでエンティティ永続性を微調整できます。たとえば、https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-hibspec-entity[Hibernateによって提供される

の機能を拡張するいくつかの注釈を見てみましょう。 @エンティティ

:]


  1. @ Table

    – __作成するテーブルの名前を指定することを許可します.

エンティティ



@ BatchSize



はエンティティーを取得するときの


バッチサイズ


を指定します。

table__から

JPAが規定していない追加の機能のいくつかに注目することも価値があります。これは、大規模なアプリケーションでは有用なことがわかります。


  1. __

    @ SQLInsert、@ SQLUpate、およびカスタマイズ可能なCRUDステートメント

@SQLDelete____アノテーション
。ソフト削除のサポート


  1. __ @不変

    __アノテーションを持つ不変エンティティ

HibernateとJavaの永続性についてもっと深く知りたい場合は、https://www.baeldung.com/persistence-with-spring-series[Spring永続性チュートリアルシリーズ]をご覧ください。

Eclipse Foundationによって構築されたhttp://www.eclipse.org/eclipselink/[Eclipseリンク]は、オープンソースのJPA実装を提供します。さらに、EclipseLink

は、XMLバインディングのためのJavaアーキテクチャー(JAXB)

など、他の多くの永続標準をサポートしています。

簡単に言うと、オブジェクトをデータベースの行に永続化するのではなく、JAXBがそれをXML表現にマッピングします。

次に、同じ

@ Entity

アノテーション実装を比較すると、EclipseLinkが再びhttp://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/annotations

ref.htm#CACGCEIJ[異なる拡張機能]を提供していることがわかります。前に見たように@

__BatchSizeに対するアノテーションはありませんが、

EclipseLinkはHibernateにはない他のオプションを提供しています

例えば:

  1. __ @ ReadOnly – 永続化されるエンティティが読み取り専用であることを指定します

  2. @__Struct – データベースにマッピングするクラスを定義します

EclipseLinkが何を提供しなければならないかについてもっと読むために、私達のhttps://www.baeldung.com/spring-eclipselink[Spring with EclipseLinkのガイド]に向かってください。

7.まとめ

この記事では、Java Persistence API(JPA)について説明しました。

最後に、HibernateやEclipseLinkとどう違うのかを調べました。