Java標準ORMであるJPAとは【初心者向け】

Java標準ORMであるJPAとは【初心者向け】

JPAについて知りたい人「Javaでデータベースアクセス方法でJPAを使いたいです。JPAについて、何ができるか教えて下さい」


そんな方向けです。

JPAについて知らない人がJPAでできることを知ることを目的としています。
また、Springフレームワークでも使用されているものなので、Springフレームワークを使用している方の知見が増えれば幸いです。


構成は以下です。

著者情報

ちなみにですが、私は5年以上IT系エンジニアとして働いており、主にJavaを主戦場にしています。Webアプリケーションと業務系のアプリケーションの経験を持つごく普通のエンジニアです。

JPA( Java Persistence API )とは

Java標準のORM(Object-Relational Mapping)です。

ORMは、Javaで言うオブジェクトとデータベースのマッピングを行う役割を持ちます。

JPAがどのようにしてデータベースへのアクセスを可能にしているかと言うと、EntityとEntityManagerを使用することで実現しています。

Entity

データベース上のデータをマッピングするJavaのオブジェクトをEntityと呼びます。

Entityはメモリ上のJavaオブジェクトであり、EntityManagerを通してデータベースと同期されます。

JPAではEntityクラスかどうか(@Entity)や、マッピングに必要な情報(@idや@Columnなど)を付加するための様々なアノテーションが提供されています。

EntityManager

Entityとデータベースの同期を取る役割を持つのがEntityManagerです。

EntityManagerにはPersistence Contextと呼ばれる、Entityを管理するための領域があり、データベースアクセスをする場合はPersistence Context内のEntityを取得したり、新規でEntityを登録する必要があります。

上記によって、EntityManagerがEntityの状態を追うことができ、適切なタイミングでデータベースと同期を取ることができます。

EntityManagerにはEntityの状態を変更したり、データベースと同期をとるAPIが用意されています。

  • EntityManagerに対する操作したタイミングでデータベースには反映されず、トランザクションがコミットもしくは強制的に同期(flush)されたタイミングでPersistence Contextに蓄積したEntityへの変更がデータベースへ反映される
  • Persistence Contextはトランザクション単位

JPAでできること、メリット

JPAでできることや、メリットは以下です。

  • Entityには4つの状態が存在する
  • テーブル間の関連をEntity同士の参照関係としてマッピングできる
  • JPAによるJPQLを用いたデータアクセスを用いると性能を向上できる
  • 当然ながら排他制御を行う機能もあります


順に説明します。

【メリット①】Entityには4つの状態が存在する

Entityの状態は以下です。

  • new状態:新規に作成したインスタンスがPersistence Contextに未登録の状態
  • 管理状態:Persistence Contextに登録された状態、同期有効
  • 分離状態:Persistence Contextから切り離された状態、戻すことが可能
  • 削除済み状態:データベースから削除される予定の状態、データベースが削除されるまで続く


詳しくは書きませんが、EntityManagerのAPIを使用することで上記の状態を変更することができます。

【メリット②】テーブル間の関連をEntity同士の参照関係としてマッピングできる

データベースではテーブル間の関連を外部キーを用いると思います。

そのため、データベースと同様にJPAではEntity間の関連をアノテーションを使用することでマッピングすることができます。(@OneToOne、@OneToMany、@ManyToOneなど)

関連元のプロパティにアクセスするだけで、関連しているEntityのデータを取得できるのがJPAの大きなメリットになります。

余談

余談ですが、関連しているEntityのデータを取得するためのSQLが発行されるタイミングが2通りあり、指定可能です。

Lazyフェッチ:関連Entityのプロパティへアクセスされたタイミング

Eagerフェッチ:本体Entityに対してEntityManagerのAPIが実行されたタイミング

【メリット③】JPAによるJPQLを用いたデータアクセスを用いると性能を向上できる

詳しくは後日記載します。

【メリット④】当然ながら排他制御を行う機能もあります

Webアプリケーションでは複数のトランザクションが同時に実行されることが大半かと思います。

トランザクションとは、
複数の更新(INSERT、UPDATE、DELETEとか)の塊のことです。トランザクションを終了するにはCOMMIT(確定)もしくはROLLBACK(削除)の実行が必要です。


複数のトランザクションが存在するということは排他制御について考慮する必要があります。

JPAでは楽観ロックと悲観ロックを両方サポートされています。もちろん悲観ロックでは共有ロックと排他ロックもサポートされてます。

  • 楽観ロックとは、更新対象のデータが取得時と更新時で同じかどうか確認して、同じであれば更新、異なればエラーにする
  • 悲観ロックとは、トランザクション開始直後に更新対象となるレコードのロックを取得し、ロックされたレコードはトランザクションが終了するまで更新されない


この点に関しては、データベースを扱う上で必須になってくるのでアプリケーション開発のときには非常に便利だと感じました。

まとめ

JPAについての説明は以上になります。

個人的には下記の内容が開発する上で
開発の工数を大幅に削減でき、コースコードの読みやすさも向上するので非常に便利だと感じました。

  • SQLを記載しないで、DBとJavaオブジェクトを連携できる
  • DBを扱う上で重要となる排他制御についてサポートされている


開発をする上で参考になれば幸いです。


人気記事①:
【厳選4冊+α】Spring Framework初心者におすすめな本

人気記事②:現役エンジニアがおすすめするプログラミングスクール5社:無料あり