1. 序章

このチュートリアルでは、HibernateとJava Persistence API(JPA)について、それらの違いに焦点を当てて説明します。

まず、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 クラスは、以前のCarクラスとの1対1の関係を表しています。

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

最後に、 javax.persistence.EntityManagerクラスは、データベースとの間の操作を指定します。 EntityManagerには、データベースに対して永続化される一般的な作成、読み取り、更新、および削除(CRUD)操作が含まれています。

4. JPAの実装

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

選択できるプロバイダーはたくさんあり、それぞれに長所と短所が表示されます。 使用するを決定するときは、次の点のいくつかを考慮する必要があります

  1. プロジェクトの成熟度– プロバイダーはどのくらいの期間存在し、どの程度文書化されていますか?
  2. サブプロジェクト– プロバイダーには新しいアプリケーションに役立つサブプロジェクトがありますか?
  3. コミュニティサポート– 重大なバグが発生したときに私たちを助けてくれる人はいますか?
  4. ベンチマーク– 実装のパフォーマンスはどの程度ですか?

さまざまなJPAプロバイダーのベンチマークについては詳しく説明しませんが、 JPAパフォーマンスベンチマーク(JPAB)には、これに関する貴重な洞察が含まれています。

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

5. Hibernate

基本的に、 Hibernateは、JPAの実装を提供するオブジェクトリレーショナルマッピングツールです。  Hibernateは最も成熟したJPA実装の1つであり、プロジェクトを支援する巨大なコミュニティがあります。

これは、この記事の前半で見た javax.persistence クラスのすべてを実装し、JPAを超える機能を提供します– Hibernateツール、検証[ X193X]、およびsearch。 これらのHibernate固有のAPIは便利な場合がありますが、基本のJPA機能のみを必要とするアプリケーションでは必要ありません。

@Entityアノテーションを使用してHibernateが提供するものを簡単に見てみましょう。

@ org.hibernate.annotations.Entityは、JPAコントラクトを実行しながら、JPA仕様を超える追加のメタデータを追加します。これにより、エンティティの永続性を微調整できます。 たとえば、@ Entity:の機能を拡張するHibernateによって提供されるいくつかのアノテーションを見てみましょう。

  1. @Table を使用すると、エンティティ用に作成されたテーブルの名前を指定できます
  2. @BatchSize テーブルからエンティティを取得するときのバッチサイズを指定します

また、JPAで指定されていない、より大規模なアプリケーションで役立つ可能性のあるいくつかの追加機能にも注目する価値があります。

  1. @ SQLInsert、@ SQLUpate、@SQLDeleteアノテーションを使用したカスタマイズ可能なCRUDステートメント
  2. ソフト削除のサポート
  3. @Immutableアノテーションが付いた不変エンティティ

HibernateとJavaの永続性についてさらに深く掘り下げるには、Spring永続性チュートリアルシリーズに進んでください。

6. EclipseLink

EclipseFoundationによって構築されたEclipseLinkは、オープンソースのJPA実装を提供します。 さらに、EclipseLink は、Java Architecture for XML Binding(JAXB)などの他の多くの永続化標準をサポートしています。

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

次に、同じ @Entity アノテーションの実装を比較すると、EclipseLinkが異なる拡張機能を再び提供していることがわかります。 前に見たように@BatchSize の注釈はありませんが、EclipseLinkはHibernateが提供しない他のオプションを提供します。

例えば:

  1. @ReadOnly –永続化するエンティティが読み取り専用であることを指定します
  2. @ Struct –データベースにマップするクラスを定義します’struct’ type

EclipseLinkが提供するものの詳細については、EclipseLink withSpringに関するガイドをご覧ください。

7. 結論

この記事では、 Java Persistence API、つまりJPAについて見てきました。

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