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/