skillup

技術ブログ

Database Java

JPAまとめ

投稿日:

JPAわけわかんねーと思い、触りはじめてから3か月ぐらいたちます。

いまだに細かい部分はよくわかっていないことは多いのですが、全体像というか何となくどういうものかはわかり始めてきたいのでまとめたいと思います。

JPAとは

一言でいうとO/Rマッピングツールであり、下記のような特徴があります。

  • RDB(リレーショナルデータベース)とJavaのPOJO(普通のクラス)の自動変換を行う
  • 上記の仕様からJavaのクラスがそのまま使える
  • SQL文を書く必要がない
  • データベースの規格に依存しない

通常のプログラムではプログラムにSQLを書いてデータベースとアクセスすることが一般的でした。

ところがJPAでは1テーブルをエンティティというPOJOで管理し、これがそのままテーブルに対応します。

エンティティ

下記がエンティティとテーブルの対応例です。

MySQLのテーブルを作成するSQL

上記テーブルから生成したエンティティ(IDEから自動生成することが可能です。)

複雑なSQLをかかずともエンティティを操作するだけで、SELECT,INSERT,UPDATE,DELETEに相当する作業ができます。

プライマリーキーの性質などもエンティティにアノテーションを付けるだけ表せますし、IDEを使えば、データベースからエンティティを自動生成できます。

(SQLに似たJPQLを使用できますので従来の通り、SQL文チックなものを書くことは可能です。SQLでできることは大抵JPQLでもできますがJPQLではlimit句が使えません・・・(涙))

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

エンティティがテーブルだとするとそのエンティティを管理し、SELECT,INSERT,UPDATE,DELETEに相当する指示をだすのがエンティティマネージャーです。

通常のプログラムではデータベースの接続やCRUD系の処理を1つのクラスに書いておくことが一般的ですが、それに相当します。(実際のDBとのアクセスはJPAそのものが行います。)

上記のように追加と取得だけ書いてみましたが非常に簡単にかけるのが特徴です。

いろいろカスタマイズするとわからんことが多くて大変ですが・・・

ちなみにエンティティマネージャーの命令ですが、下記のようなものが一般的です。

persist

管理対象としてエンティティに追加

merge

管理対象となっているエンティティとマージ

find

エンティティの取得

remove

管理対象の中から指定したエンティティを削除

detach

管理対象から除外

よくあるミスがpersiste=insert,merge=updateですね。

persistというのはエンティティマネージャーの管理下に入っただけでこの瞬間にinsertはされていないです。

たとえば

idとname,ageのテーブルがあったとして

というコードを書いた場合、新規にinsertされるレコードのnameはhogeではなくfooです。

実際にコミットされた時点で初めてinsertが行われます。あくまで管理対象となる、ということだけ覚えておきましょう。

ちなみにJavaEEとして動かす場合は、コミット、ロールバックなどはすべてアプリケーションサーバーが自動で行います。

また永続化という言葉の意味がよくわからなかったのですが、これはメモリなど揮発性の高い記録媒体への記録ではなく、ファイルやDBなど,プログラム終了後もデータが失われないような場所へのデータ保存を指します。

下記のリンクなどでは詳細な説明やエンティティマネージャーが行うことなどを図解入りで紹介しており、理解に役立ちました。

https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DataAccessJpa.html

http://d.hatena.ne.jp/ryoasai/20110731/1312128474

http://yoshio3.com/2011/12/19/java-persistence-api-for-begineers/

http://juzow.hatenablog.com/entry/20121017/1350480972

-Database, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

SQL 集計関数の利用

先日同様、ある程度複雑な問題のSQLに関して。出典はSQL実践入門。 問題 下記のようなテーブル(テーブル名)で より古い年のデータが存在しない場合 NULL 直近の年のデータより売り上げが伸びた場合 …

no image

SQL基礎 ウィンドウ関数

SQLの基礎(主にSELECT)を whereはレコードに対しての集計、havingはレコードの集合に対しての集計 ビューは一時的なselect文なのでサブクエリとほぼ等価 条件分岐で出力項目を変えた …

no image

CASE式のすすめ

SQL実践入門を7割がたぐらい終えたところで同著者の方の「達人に学ぶSQL徹底指南書」を学習しようと思っています。 この方の著書は気づいたら結構読んでましたね。 Contents1 CASE式での注意 …

no image

JavaEEとは?

JavaEEのブログといいつつ、JavaEEについて全然書いていませんでした・・・ ちょっとJavaEEについて書かせていただきます。 Contents1 そもそもJavaとは?1.1 Javaの定義 …

no image

データベース設計のアンチパターン リトライ+バッチ分割+バッチの再利用不可

Contents1 リトライ1.1 デメリット1.2 対策2 バッチ分割2.1 デメリット2.2 対策3 バッチ再利用不可3.1 デメリット3.2 対策 リトライ ※OLTP=オンライントランザクショ …