おしりんブログ

新人PGおしりんの色々まとめるよブログ

JSFときどきJPA

JSF編長いよ~

JPAとかJSF関係ないしね…
JPAについてまとめたら、多分まとめおわる…と思う


おっ
無駄にコマンドプロンプトからテキスト作成したり
開いてみたりしていまする。練習練習~


JPAとはJava Persistence APIのことで、
関係データベースのデータを扱うJava SEおよびJava EE
アプリケーションを開発するためのJavaフレームワークのこと。


わたしは今までJavaとDBをつなげる際、
JDBCしか使ったことなかった、ていうかJDBCしか
架け橋的な存在はないと思ってたんだけど、

今回のプロジェクトでJPAっていう
別の接続方法があることを知りました。

 


JPAを使うメリットとしては、

・プログラムの中にSQL文が混じりこまず、可読性が高まる

フレームワークを提供してくれるO/Rマッパーの存在が
 プログラムをよりオブジェクト指向化してくれる
 
JDBC で開発者が考慮し実装しなければならない多くの機能を
 JPAフレームワーク自身で既に実装しているので、
 開発者はそれらを再利用、もしくはコンテナに任せることができる
 
統合開発環境と連携する事で、
 基本的なCRUD操作のひな形まで自動生成してくれるため
 より安全にスケールするアプリケーションを
 コード量少なく短時間で開発することができる


つまり、JPAを使用する場合、開発生産性が大幅に向上する。
ということらしい。


…うわ。なんかまとめるの時間かかりそう。


つぎ、JPAの構成要素。
JPAでは、EntityManagerインスタンスを生成し、DBに対する操作をおこなう。

で、このEntityManagerは
EntityManagerFactoryからインスタンスを生成するんだけど、

EntityManagerFactoryのインスタンスを生成するためには、
persistence.xmlというXML設定ファイル中に
PersistenceUnitを定義しなくてはならない。


で、実際にDBの操作を行う時は、
DBテーブルにたいしてJava オブジェクトにマッピングした、
Entity クラス(@Entity アノテーションを付加したクラス)を利用する。

EntityクラスではDBのカラム名をフィールドとして記述することで
DBとマッピングさせるよ。


ちなみにEntityクラスは@Entityのアノテーションを付加した
単なる普通のJavaオブジェクトなので、
JPAによって管理されていない状態では、単なるJava のオブジェクトとして扱う。
(例 new ShioEntity() でインスタンスを生成した直後の状態)


管理状態とは、Persistence Contextによって管理されている状態を指し、
すべてのEntityはPersistence Contextによって管理されている。
この状態の時にEntityManagerを使ってDBに永続化等を行う事ができる。

例 EmpEntity emp = new EmpEntity();←単なるオブジェクト
  em.persist(emp);←管理状態にあるオブジェクト


あと、EntityManagerの管理は
アプリケーションサーバ等のコンテナ上で管理する方法と、
アプリケーションで管理する方法の二種類があるんだけど、
今回のPではコンテナ上で管理していたよ。


コンテナ上でEntityManagerを生成する方法は、
@PersistenceContextアノテーションを付加し
persistence.xmlに定義したPersistenceUnit名を指定し、
EntityManagerにインジェクションする。

ここでインジェクションされたEntityManagerはコンテナ上で動作するため、
トランザクション管理等もコンテナ側で行なってくれる。

つまり、トランザクション管理のコードを明示的に記載しなくても、
EntityManager#persist()を実行した際に
何らかの例外が発生した場合は、コンテナが自動的にロールバックしてくれる。


ウオー各種設定すら間違わなければなかなかに便利ですな。


で、最後にDBへの問い合わせ言語について。
ここで2.3日前の記事で書いた、JPQLさんが登場。


JPQLはデータベースを検索・更新したり,データベースが持っている
集合関数などの機能を利用したりするためのクエリ言語。

SQLがテーブルを対象としたクエリ言語であるのに対して,
JPQLはエンティティクラスを対象としたJPA仕様で定義されている。だよ。


通常のSQLはカラムを指定して問い合わせを実施するけど、
JPQLではEntityを使用して問い合わせをおこなう。


で、肝心のJPQLの書き方については…
また明日~
まとめきれなかった~。ねむ。


今回のプ略ではクエリ文だけ外で定義してたんだけど、
どんな風に定義してたのか忘れちゃったから、明日確認してきまする。

 

最後に、今回の記事でめっちゃどころではなくめっちゃ参考にしたサイト
JPAを一回でも触ったことがあれば、めっちゃ分かりやすいサイト。
ありがとうございました。
http://yoshio3.com/2011/12/19/java-persistence-api-for-begineers/