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

Annnotationについて その2

Java(JavaEE)をやりだして半年ぐらいたつんですが、個人的に鬼門だとおもっていたのが下記内容です。 MVCではないコンポーネントの考え方 クラスを使ったジェネリクスの使い方(型パラメータなど) …

no image

cakePHPでの直SQL

今回はCakePHPにて直のSQLを書く方法を。 cakePHPにて大概の処理はもともと備わっているコマンドでなんとかなりますが、まれに直SQLを書いたほうがらくなこともあります。 書き方その1 [c …

no image

Git→Jenkinsの連携 その2

以前、このエントリーでGitとjenkinsの連携に関して書いたんですが、今回jenkinsとgitのソースが別環境にあるケースの構築をしたのでメモしておきます。 Contents1 Jenkinsで …

no image

データ構造の基礎知識 後編 木構造

データベースの学習をしていたときの復習です。 データ構造の基礎知識 前編 メモリとポインタ、配列と連結リスト データ構造の基礎知識 中編 ハッシュ 今回はもう少し複雑な「木構造」について考えてみます。 …

no image

型情報の取得・活用について

Javaで抽象度の高い実装を行うときに必要となる型情報の活用法について。 できるとできないとでプログラムの応用範囲が変わってくるのでメモっときます。 こちらのエントリーと合わせて読むといいと思います。 …