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

SQL 更新系に関して

SQL実践入門、残り2章になりましたが、いやーむずいっす。 今回は9章を進めていますがSQLはもともと検索を主な用途として発展したため、SELECT文の使用がメインになります。 ですが、UPDATE文 …

no image

文字列変換系処理まとめ

Javaで文字列の変換(全角、半角など)の処理のまとめです。 ブログに記事として書こうと思ったのですが、丸々コピペになってしまうので、それじゃあ元リンクを紹介したほうがいいかなと思い、今日は基本的にリ …

no image

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

本日はSQLコーディングに関して。 ここら辺は実際にプログラムを書く際に重要になってくるネタ。 Contents1 バインド変数1.1 デメリット1.2 対策2 直積により組み合わせが爆発する2.1 …

no image

Optionalについて その1

Streamに続いて、Java8で新搭載された機能がOptional です。 Javaではnullの処理をいちいちしなくてはいけないのがいろいろと面倒ですが、Optionalの機能をうまく使うことで可 …

no image

JavaSEでのCDI

以前、JavaSEでもCDIを使ってみたい!と思ったのですが、以前は探し方が悪かったのか情報を見つけ出すことができませんでした。 が、昨日ちょっと検索したらちょっと情報があり、無事実装できたのでメモし …

アーカイブ