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

DB負荷調査のセオリー

DB負荷などで見ておきたいことのまとめなど。(今のプロジェクトではSQLServerを使っていますが、他のデータベースでも同じかと思います。) 参考URL SQLServer: 現在実行中クエリのリア …

no image

MySQLの大文字、小文字問題について

MySQLでテーブルを作る際にカラムに重複を許さない制約(unique)を振ることがあると思います。 数字の場合は問題ないのですが、文字列の場合、なんと英語の大文字と小文字が区別されません。 つまりa …

no image

文字列変換系処理まとめ

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

no image

Messageプロパティの設置方法

JavaEEに限らず、エラーメッセージなどは通常、プログラムの中に書くのではなく、できればエラーメッセージファイルの中で管理するのが望ましいでしょう。 またJSF側の名称の表示なども直接xhtmlの中 …

no image

StreamのMap処理

Javaのstreamですが知れば知るほどいろいろな機能がありますね。 基本的にプログラムって配列(コレクション含む)とオブジェクトの処理が中心になるので、配列の処理をいかにうまくできるかは非常に大事 …

アーカイブ