skillup

技術ブログ

Database Java

JPAまとめ

投稿日:2015年6月22日 更新日:

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など,プログラム終了後もデータが失われないような場所へのデータ保存を指します。

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

5.2. データベースアクセス(JPA編)

JPAを使ったデータアクセスでポイントとなる永続コンテキストについて

JPAについて調べてみた

-Database, Java
-,

執筆者:


comment

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

関連記事

no image

PostgreSQLについて

本日はポスグレ(PostgreSQL)について。 自分はほとんどMySQLだったので、主にMySQLとの比較について書いていきます。 Contents1 アーキテクチャの違い1.1 MySQL1.2 …

no image

Javadocに関して

業務で社内で使うクラスライブラリを作成中です。 他人に使ってもらうものなのでコメントやドキュメント周りの整備が必要になり、javadocをしっかり作りたいと思っています。 Contents1 java …

no image

SQL結合 サブクエリに関して

今回はサブクエリに関してです。 もちろんSQL実践入門を読み進めています。 SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。 以下 …

no image

データベースによるテストデータ作成

テスト環境を作る際に、テストデータを作るのが面倒・・・なんかライブラリでもないかな・・と思っていたんですが、MySQLでいろいろと簡単にできます。 数字 [crayon-6100b413c8da204 …

no image

テストのダミーデータ作成

データベースに大量のデータを作りたいときにいつもあああやhoge,aaaですとデータという感じがしないですし、抽出や集計ができません。 なるべく自然に近いデータが欲しいのですが、簡単に作れる方法があり …