はじめに
このチュートリアルでは、Hibernate と Java Persistence API (JPA) について、それらの相違点に焦点を当てながら説明します。
まず、JPA とは何か、どのように使用されるのか、そしてその背後にある中核的な概念について説明します。
そして、Hibernate と EclipseLink がどのように組み合わされるかを見ていきます。
Object-Relational Mapping
JPA に入る前に、ORM としても知られるオブジェクト リレーショナル マッピングの概念を理解することが重要です。 通常、永続化されるオブジェクトの名前がテーブルの名前になり、そのオブジェクト内の各フィールドがカラムになります。 テーブルがセットアップされると、各行はアプリケーションのレコードに対応します。
JPA 入門
Java Persistence API (JPA) は、Java アプリケーションのリレーショナル データ管理を定義する仕様です。 この API は、アプリケーション内のどのオブジェクトを永続化するか、そしてどのように永続化するかを定義する一連の概念をマッピングします。
ここで重要なのは、JPA は単なる仕様であり、動作するには実装が必要だということです。 Entity
javax.persistence.Entity クラスは、どのオブジェクトがデータベースに永続化されるかを定義しています。
さらに、選択されたすべてのエンティティは、@Idアノテーションで示される主キーを定義する必要があります。 GeneratedValueアノテーションとともに、レコードがデータベースに永続化されるときに主キーが自動的に生成されることを定義します。
@Entitypublic class Car { @GeneratedValue @Id public long id; // getters and setters}
JPA によって記述されるエンティティの簡単な例を見てみましょう。 フィールドの永続性
JPAのもう1つの中核となる概念は、フィールドの永続性です。 Javaでオブジェクトがエンティティとして定義されると、その中のすべてのフィールドは自動的にエンティティテーブル内の異なる列として永続化されます。
永続化されたオブジェクト内にデータベースに永続化したくないフィールドがある場合、@Transientアノテーションでフィールドを一時的と宣言することができます。 リレーションシップ
次に、JPAはアプリケーション内の異なるデータベーステーブル間のリレーションシップをどのように管理すべきかを指定します。 これまで見てきたように、JPAはアノテーションを使用してこれを処理します。
- @OneToOne
- @OneToMany
- @ManyToOne
- @ManyToMany
これがどう動くかを見てみましょう。
@Entitypublic class SteeringWheel { @OneToOne private Car car // getters and setters}
上の例では、SteeringWheel クラスは、先ほどの Car クラスとの 1 対 1 のリレーションシップを記述しています。
3.4. Entity Manager
最後に、javax.persistence.EntityManager クラスは、データベースとの間のオペレーションを指定します。 EntityManagerは、データベースに永続化される一般的なCreate、Read、Update、Delete(CRUD)操作を含みます。
JPA Implementations
JPA 仕様では、どのように、何を永続化すべきかを定義しているので、今度は必要なコードを提供する実装プロバイダを選択する必要があります。 そのようなプロバイダーがなければ、JPA に準拠するために関連するすべてのクラスを実装する必要があり、それは大変な作業です。
プロバイダーはたくさんあり、それぞれに長所と短所があります。 どれを使用するかを決定する際には、以下の点を考慮する必要があります。
- Project maturity – プロバイダーはどのくらいの期間存在し、どのくらいよく文書化されているか。
- サブプロジェクト – プロバイダーは、私たちの新しいアプリケーションに役立つサブプロジェクトを持っているか。
- コミュニティ サポート – 重大なバグが発生したときに助けてくれる人はいるか。
- ベンチマーク – 実装はどの程度のパフォーマンスなのか?
異なる JPA プロバイダーのベンチマークについて深く掘り下げることはしませんが、JPA Performance Benchmark (JPAB) にはこの点に関する貴重な洞察が含まれています。
それでは、JPA のトップ プロバイダーについて簡単に説明します。
Hibernate
Hibernate は、その中核は JPA の実装を提供するオブジェクト-リレーション マッピング ツールです。 Hibernate は、このプロジェクトを支援する巨大なコミュニティを持つ、最も成熟した JPA 実装の 1 つです。
この記事の前半で見た javax.persistence クラスのすべてを実装し、さらに JPA を超える機能 (Hibernate ツール、検証、および検索) を提供します。 これらの Hibernate 固有の API は便利ですが、JPA の基本機能のみを必要とするアプリケーションでは必要ありません。
Hibernate が @Entity 注釈で何を提供するかを簡単に見てみましょう。 これにより、エンティティの永続性を細かく調整することができます。 たとえば、@Entityの機能を拡張するHibernateが提供するいくつかのアノテーションを見てみましょう。
- @Table – エンティティ用に作成されたテーブルの名前を指定できます
- @BatchSize – テーブルからエンティティを取得する際のバッチサイズを指定します
JPAが指定しない、大規模アプリケーションで有用ないくつかの追加機能も注目すべきポイントです。
Hibernate および Java 永続化の詳細については、当社の Spring 永続化チュートリアル シリーズに移動してください。
EclipseLink
EclipseLink は Eclipse Foundation によって構築され、オープンソースの JPA 実装を提供します。 さらに、EclipseLink は、Java Architecture for XML Binding (JAXB) などの他の多くの永続性標準をサポートします。
簡単に言えば、JAXB はオブジェクトをデータベース行に永続化するのではなく、それを XML 表現にマッピングします。 先に見たように @BatchSize に対するアノテーションはありませんが、EclipseLink は Hibernate にはない他のオプションを提供しています。
例:
- @ReadOnly – 永続化するエンティティを読み取り専用にする
- @Struct – データベース ‘struct’ 型にマップするクラスを定義する
EclipseLink の機能については、EclipseLink with Spring ガイドに目を通してください。
まとめ
この記事では、Java Persistence API (JPA) について見てきました。