仕様として、Java Persistence APIは永続性に関係しており、javaオブジェクトがそれらを作成したアプリケーション-プロセスよりも長生きする すべてのJavaオブジェクトを永続化する必要はありませんが、ほとんどのアプリケーションは主要なビジネスオブジェクトを永続化します。 JPA仕様では、どのオブジェクトを永続化するか、およびそれらのオブジェクトをJavaアプリケーションでどのように永続化するかを定義できます。
それ自体では、JPAはツールやフレームワークではありません; むしろ、任意のツールまたはフレームワークによって実装できる一連の概念を定義します。 JPAのobject-relational mapping(ORM)モデルはもともとHibernateに基づいていましたが、それ以来進化してきました。 同様に、jpaはもともとリレーショナル/SQLデータベースでの使用を意図していましたが、一部のJPA実装はNoSQLデータストアでの使用のために拡張されています。 NoSQLでJPAをサポートする一般的なフレームワークは、Jpa2.2のリファレンス実装であるEclipseLinkです。
JPAとHibernate
それらの絡み合った歴史のために、HibernateとJPAは頻繁に融合されています。 しかし、Javaサーブレット仕様のように、JPAは多くの互換性のあるツールやフレームワークを生み出してきました。
Gavin Kingによって開発され、2002年初頭にリリースされたHibernateはJAVA用のORMライブラリです。 Kingは永続性のためのエンティティbeanの代替としてHibernateを開発しました。 このフレームワークは非常に人気があり、当時必要であったため、そのアイデアの多くは最初のJPA仕様で採用され、成文化されました。今日、Hibernate ORMは最も成熟したJPA実装の1つであり、依然としてJavaのORMの一般的なオプションです。 Hibernate ORM5.3.8(この記事の執筆時点での現在のバージョン)はJPA2.2を実装しています。 さらに、Hibernateのツールファミリーは、Hibernate Search、Hibernate Validator、Hibernate OGMなどの一般的なツールを含むように拡張されています。Java ORMとは何ですか?
実行は異なりますが、すべてのJPA実装はある種のORM層を提供します。 JPAおよびJPA互換のツールを理解するには、ORMを十分に理解する必要があります。
オブジェクトリレーショナルマッピングは、開発者が手動で行うことを避ける正当な理由があるタスクです。 Hibernate ORMやEclipseLinkのようなフレームワークは、そのタスクをライブラリまたはフレームワーク、ORMレイヤーに成文化します。 アプリケーションアーキテクチャの一部として、ORM層は、リレーショナルデータベース内のテーブルや列と対話するためのソフトウェアオブジェクトの変換 Javaでは、ORM層はJavaクラスとオブジェクトを変換して、リレーショナル-データベースに格納および管理できるようにします。デフォルトでは、永続化されるオブジェクトの名前がテーブルの名前になり、フィールドが列になります。 表が設定されると、各表の行はアプリケーション内のオブジェクトに対応します。 オブジェクトマッピングは設定可能ですが、デフォルトはうまく動作する傾向があります。
図1は、アプリケーション開発におけるJPAとORM層の役割を示しています。
Java ORMレイヤーの設定
JPAを使用するように新しいプロジェクトを設定するときは、データストアとJPA 選択したデータベース(SQLまたはNoSQL)に接続するようにデータストアコネクタを構成します。 また、HibernateやEclipseLinkなどのフレームワークであるJPAプロバイダを含めて構成します。 JPAを手動で設定することはできますが、多くの開発者はSpringのすぐに使えるサポートを使用することを選択します。 手動およびSpringベースのJPAのインストールとセットアップのデモについては、以下の”JPAのインストールとセットアップ”を参照してください。
Javaでのデータ永続性
プログラミングの観点から、ORM層はアダプタ層です: これは、SQLとリレーショナルテーブルの言語にオブジェクトグラフの言語を適応させます。 ORM層を使用すると、オブジェクト指向開発者は、オブジェクト指向のパラダイムを離れることなく、データを維持するソフトウェアを構築できます。JPAを使用する場合は、データストアからアプリケーションのデータモデルオブジェクトへのマップを作成します。 オブジェクトの保存方法と取得方法を定義する代わりに、オブジェクトとデータベース間のマッピングを定義し、JPAを呼び出してそれらを永続化します。 リレーショナル・データベースを使用している場合、アプリケーション・コードとデータベース間の実際の接続の多くは、JAVA Database Connectivity APIであるJDBCによって処理されます。
仕様として、jpaはオブジェクトとデータベース間のマッピングを定義するために使用するメタデータ注釈を提供します。 各JPA実装は、JPA注釈のための独自のエンジンを提供します。 JPA仕様には、jpaシステムとの接触の重要なポイントであるPersistanceManager
EntityManager
も用意されています(ビジネ
このすべてをより具体的にするには、ミュージシャンをモデル化するための単純なデータ-クラスであるリスト1を検討してください。
リスト1。 リスト1のMusician
クラスは、Javaの単純なデータ-クラスを使用してデータを保持します。 Nameフィールドなどのプリミティブデータを含めることができます。 また、mainInstrument
performances
などの他のクラスとの関係を保持することもできます。p>
Musician
の理由はデータを含めることです。 このタイプのクラスは、DTOまたはデータ転送オブジェクトと呼ばれることがあります。 DTOはソフトウェア開発の一般的な機能です。 多くの種類のデータを保持していますが、ビジネスロジックは含まれていません。 データオブジェクトの永続化は、ソフトウェア開発におけるユビキタスな課題です。
JDBCを使用したデータの永続性
Musician
クラスのインスタンスをリレーショナルデータベースに保存する1つの方法は、JDBCライブラ JDBCは抽象化層であり、基礎となるデータベースの実装を考慮せずにアプリケーションがSQLコマンドを発行できるようにします。リスト2は、JDBCを使用してMusician
クラスを永続化する方法を示しています。
リスト2。 JDBCレコードを挿入する
リスト2のコードはかなり自己文書化されています。 georgeHarrison
オブジェクトはどこからでも来ることができます(フロントエンド送信、外部サービスなど)。)、およびそのIDとnameフィールドが設定されています。 次に、オブジェクトのフィールドを使用して、SQLinsert
PreparedStatement
クラスはJDBCの一部であり、SQLクエリに値を安全に適用する方法を提供します。)
JDBCは手動設定に付属の制御を可能にしますが、JPAと比較して面倒です。 データベースを変更するには、まず、Javaオブジェクトからリレーショナル-データベース内の表にマップするSQLクエリを作成する必要があります。 その後、オブジェクト署名が変更されるたびにSQLを変更する必要があります。 JDBCでは、SQLの保守はそれ自体がタスクになります。ここでは、JPAを使用してMusician
クラスを永続化します。
リスト3。 JpaでGeorge Harrisonを永続化する
Musician georgeHarrison = new Musician(0, "George Harrison");musicianManager.save(georgeHarrison);
リスト3は、リスト2の手動SQLを単一の行session.save()
に置き換え、JPAにオブジェクトを永続化するよ それ以降、SQL変換はフレームワークによって処理されるため、オブジェクト指向のパラダイムを離れる必要はありません。
Jpaのメタデータ-アノテーション
リスト3の魔法は、jpaのアノテーションを使用して作成された構成の結果です。 開発者は注釈を使用して、どのオブジェクトを永続化すべきか、およびどのように永続化すべきかをJPAに通知します。
リスト4は、単一のJPAアノテーションを持つMusician
クラスを示しています。
リスト4。 Jpaの@Entityアノテーション
@Entitypublic class Musician { // ..class body}
永続オブジェクトはエンティティと呼ばれることがあります。 @Entity
Musician
ようなクラスにアタッチすると、このクラスとそのオブジェクトを永続化する必要があることをJPAに通知
Jpaの設定
ほとんどの最新のフレームワークと同様に、JPAは、業界のベストプラクティスに基づいてデフォルトの設定をフレームワークが提供する規約によるコーディング(設定上の規約とも呼ばれます)を採用しています。 一例として、Musician
という名前のクラスは、デフォルトでMusicianという名前のデータベーステーブルにマップされます。
従来の設定は時間の節約になり、多くの場合、十分に機能します。 JPA設定をカスタマイズすることもできます。 例として、JPAの@Table
Musician
クラスを格納するテーブルを指定できます。
リスト5。 Jpaの@Tableアノテーション
@Entity@Table(name="musician")public class Musician { // ..class body}
リスト5は、エンティティ(Musician
musician
テーブルに永続化するようにjpaに指示します。
Primary key
JPAでは、主キーはデータベース内の各オブジェクトを一意に識別するために使用されるフィールドです。 主キーは、オブジェクトを参照したり、他のエンティティに関連づけたりするのに便利です。 オブジェクトをテーブルに格納するたびに、その主キーとして使用するフィールドも指定します。リスト6では、Musician
の主キーとして使用するフィールドをJPAに示します。
リスト6。 主キーの指定
@Entitypublic class Musician { @Id private Long id;
この場合、JPAの@Id
id
Musician
の主キーとして指定しました。 デフォルトでは、この設定では、フィールドがテーブルの自動インクリメントに設定されている場合など、主キーがデータベースによって設定されることを前提としています。
JPAは、オブジェクトの主キーを生成するための他の戦略をサポートしています。 また、個々のフィールド名を変更するための注釈もあります。 一般的に、JPAは必要な永続性マッピングに適応するのに十分な柔軟性があります。クラスをデータベーステーブルにマップし、その主キーを確立すると、データベース内でそのクラスを作成、取得、削除、および更新するために必要なすべてのものが session.save()
を呼び出すと、主キーフィールドがnullであるか、既存のエンティティに適用されるかに応じて、指定されたクラスが作成または更新され entityManager.remove()
を呼び出すと、指定されたクラスが削除されます。
Jpaのエンティティ関係
単純にプリミティブフィールドを持つオブジェクトを永続化することは、方程式の半分に過ぎません。 JPAには、エンティティを相互に関連させて管理する機能もあります。 テーブルとオブジェクトの両方で、四つの種類のエンティティ関係が可能です:
- 一対多
- 多対一
- 多対多
- 一対一
- 一対一
各タイプのリレーションシップは、エンティティが他のエンティティとどのように関 たとえば、Musician
Performance
List
Set
などのコレクションによって表されるエンテ
Musician
Band
Musician
Band
クラスのコレクションを意味する。 (各ミュージシャンが単一のバンドでのみ演奏すると仮定します。p>
Musician
BandMates
Musician
Musician
Quote
Quote famousQuote = new Quote()
。
リレーションシップタイプの定義
JPAには、リレーションシップマッピングタイプごとに注釈があります。 リスト7は、Musician
Performance
s.
の間の一対多の関係に注釈を付ける方法を示しています。
リスト7。 一対多の関係に注釈を付ける
注意すべきことは、@JoinColumn
Musician
エンティティにマップされるかをJPAに指示することです。 各パフォーマンスは、この列によって追跡される単一のMusician
に関連付けられます。 JPAがMusician
Performance
をデータベースにロードすると、この情報を使用してオブジェクトグラフを再構成します。
jpaでの戦略のフェッチ
データベース内の関連エンティティをどこに配置するかを知ることに加えて、JPAはそれらをどのようにロードす フェッチ戦略は、関連するエンティティのロード方法をJPAに指示します。 Jpaフレームワークは、オブジェクトの読み込みと保存時に、オブジェクトグラフの処理方法を微調整する機能を提供する必要があります。 たとえば、Musician
bandMate
george
をロードすると、Musicianテーブル全体がデー
必要なのは、関連するエンティティの遅延ロードを定義する機能です。 注釈を使用してフェッチ戦略をカスタマイズすることができますが、JPAのデフォルト設定は変更なしですぐに動作することがよくあります。
- One-to-many:Lazy
- Many-to-one:Eager
- One-to-one:Eager
JPAのインストールとセットアップ
最後に、jpaのインストールとセットアップについて簡単に見ていきます。javaアプリケーション。 このデモでは、Jpaリファレンス実装であるEclipseLinkを使用します。JPAをインストールする一般的な方法は、プロジェクトにJPAプロバイダを含めることです。 リスト8は、EclipseLinkを依存関係としてMavenpom.xml
ファイルに含める方法を示しています。
リスト8。 リスト9に示すように、EclipseLinkをMaven依存関係としてインクルードする必要があります。
リスト9。 MySqlコネクタのMaven依存関係
mysqlmysql-connector-java5.1.32
mysqlmysql-connector-java5.1.32
次に、データベースとプロバイダについてシステムに伝える必要があります。 これは、リスト10に示すように、persistence.xml
ファイルで行われます。
リスト10。 永続性。xml
この情報をシステムに提供するには、プログラムを含む他の方法があります。 この方法で依存関係を保存すると、コードを変更せずにアプリケーションを更新するのが非常に簡単になるため、persistence.xml
ファイルを使用するこ
JpaのSpring構成
Springを使用すると、JPAのアプリケーションへの統合が大幅に容易になります。 例として、アプリケーションヘッダーに@SpringBootApplication
注釈を配置すると、Springはクラスを自動的にスキャンし、指定した構成に基づいて必要に応じてEntityManager
を挿入するように指示します。
リスト11は、アプリケーションに対してSpringのJPAサポートが必要な場合に含める依存関係を示しています。
リスト11。 MavenでSpring JPAサポートを追加する
結論
データベースを扱うすべてのアプリケーションは、永続性コードを分離することを唯一の目的とするア この記事で見てきたように、Java Persistence APIでは、さまざまな機能とJava object persistenceのサポートが紹介されています。 単純なアプリケーションでは、JPAの機能のすべてを必要としない場合があり、場合によってはフレームワークの設定のオーバーヘッドがメリットを得られな しかし、アプリケーションが成長するにつれて、JPAの構造とカプセル化は本当に彼らの維持を獲得します。 JPAを使用すると、オブジェクトコードが簡単になり、Javaアプリケーションのデータにアクセスするための従来のフレームワークが提供されます。
Java Persistence APIおよび関連技術についての詳細
- JDBCとは何ですか?JDBCとは何ですか?JDBCとは何ですか?JDBCとは何ですか?JDBCとは何ですか? Javaデータベース接続の概要:データベースへの接続、SQLクエリの発行などのためのJavaの低レベルAPIを知ることができます。
- JPAとHibernateを使用したJava persistence,Part1:エンティティとリレーションシップ:Java8とHibernate ORMを使用したエンティティとリレーションシップのモデリングを開始します。
- JPAとHibernateを使用したJava永続性、パート2: Java8とHibernate ORMでの多対多の関係と継承関係のモデリングを実践的に実践します。
- 状態依存の動作の実装:Javaの状態パターンと状態依存の古典的な紹介。
- HibernateでのEager/Lazy Loading:Hibernateでeagerとlazy loadingを適用する方法。
- JPA2.2には、CDIの改善、日付と時刻APIとのより良いアライメント、
@Repeatable
アノテーションのサポートなど、JPA2.2の仕様更新の概要が含まれています。 - 次のプロジェクトにJPAを使用する必要がありますか?:あなたが決めるのに役立つ重要な質問。