X

An Oracle blog about WebLogic Channel

JPA 2.0入門

WebLogic勉強会 通信

WebLogic Serverファンの皆様、こんにちは、WebLogic Server勉強会通信です。

3月21日に開催された「第34回WebLogic Server勉強会@東京」の前半の「JPA2.0入門」(日本オラクル株式会社 Fusion Middleware事業統括本部 松林晶)セッションをレポートします。JPA(Java Persistence API)はJavaのアプリケーションのデータベースアクセスをシンプルに、効率良く実装するためのO/Rマッピングの標準仕様です。JPA2.0は1.0からさらに詳細な機能強化がされています。ここでは、当日の資料を使いながら初心者向けにJPA2.0の概要を紹介します。(日本オラクル Fusion Middleware事業統括本部 佐々木 政和)

JPAとは


JPAはJava Persistence APIの略です。永続化およびオブジェクトとリレーショナルのマッピング管理用のJava APIの仕様です。Java EE環境に限らず、Java SEでも利用可能です。
JPA 2.0の仕様書は2009年12月10日付けの「JSR-000317 JavaTM Persistence 2.0 (Final Release)」で公開されています。これまでJavaのアプリケーションでデータベースをアクセスする場合はJDBCを使用してSQLでアクセスする必要がありました。
その場合、SQLを意識したプログラミングが含まれることになります。JPAの技術的な目的は、Javaアプリケーション開発者に対してJavaドメインモデルを使用してリレーショナルデータベースを管理するためのオブジェクト/リレーショナル
マッピング機能を提供することです。JPAは下図のようにJavaのアプリケーションとデータベースの間に存在する
O/Rマッパーの役割を担います。具体的には、データベースのテーブルのレコードとJavaのオブジェクト間の
相互変換を行います。それにより、アプリケーション開発者がJavaのオブジェクトにアクセスすると、
その結果データベースへの操作が行われます。

JPA vs. JDBC


JPAを使用したアプリケーションのプログラミングがどうなるか、JDBCアプリケーションと比較してみると一目瞭然です。
このことから、JPAを使用したメリットとしてアプリケーションの開発生産性が高まることが分かります。単純にコーディング量が
少なくなることで開発工数を削減できるだけでなく、JPAフレームワークを活用することで開発プロジェクトチーム全体での
プログラミングの統一性が保たれ保守性に優れたアプリケーション開発が実現できます。

JPAの構成要素


JPAは、下記の要素から構成されます。

エンティティ(Entity)の役割

エンティティクラスはJPAの中心になるクラスです。リレーショナルデータベースのテーブルをオブジェクトモデルとして表したもので、下記の図のようにPOJOで実装します。オブジェクトとデータベースの関係をマッピングするための情報をJPAフレームワーク(JPAプロバイダー=WebLogic Server)に対して与える必要があるので、POJOにアノテーションを付加する方法を使用します。この例ではCustomerクラスとCUSTOMERテーブルの関連付けを行うために@Entity, @Idというアノテーションを付加しています。

エンティティのライフサイクル


まず、エンティティのライフサイクルを理解することが重要です。下図の中央部分の
永続コンテキスト(Persisitence Context)に管理されている状態を「管理状態」といい、
それ以外は「デタッチ状態」といいます。つまり、「管理状態」はJPAプロバイダーがデータベースとの
関連を適切に処理する状態であり、「管理状態」のエンティティオブジェクトに加えた変更は
JPAフレームワークを通じてデータベースに反映されます。

エンティティのライフサイクルのサンプル


この例では、初めにnew myEntityでmyEntityインスタンスを作成しています。
この時点では、「管理状態」ではなく単にHeap上にオブジェクトを生成しただけにすぎません。
データベースと連携するために、persistメソッドを呼び出しています。この
persistメソッドを呼び出すことで新しく作成したオブジェクトは「管理状態」に置かれます。
結果的にJPAプロバイダー(Weblogic Server)はデータベースにレコードが無ければ作成します。
このように管理状態に置かれると、データベースへの挿入、追加、削除が可能になります。
tx.commit()でトランザクションがコミットされた後は「デタッチ状態」になります。
「デタッチ状態」のEntityに変更を加えた場合、この例ではcustomerはJava Heap上に存在しますが
JPAの「管理状態」から外れているために実際のデータベースには反映されません。
「デタッチ状態」でcustomerに対する操作を行った場合はmerge()で同期することができます。

コンテナ管理とアプリケーション管理のエンティティマネージャ


コンテナ管理のエンティティマネージャとアプリケーション管理のエンティティマネージャの2種類があります。
コンテナ管理のエンティティマネージャでは、永続コンテキストのライフサイクルはアプリケーションに透過的でJTAトランザクション制御を含み自動的に管理されます。永続コンテキストのライフサイクルは@PersistenceContextアノテーションまたはpersistence-context-refデプロイメントデスクリプタを使用して宣言されます。デフォルトはtransaction-scoped persistenceです。
アプリケーションは、インジェクトするか、またはJNDIネームスペース上で直接Lookupしてコンテナ管理のエンティティマネージャを
取得します。


アプリケーション管理のエンティティマネージャが使用されているときは、アプリケーションはエンティティマネージャライフサイクルを管理するため、永続コンテキストを取得したり破壊したりするために直接EntityManagerFactoryと会話します。

データ操作および管理用のAPI

JPQL(Java Persistence Query Language)とは

4種類のクエリ方法

まとめ


当日の勉強会では、後半JPA 2.1のトピックスの紹介がありました。
Java EE 7に含まれるJPA 2.1ではJPQL/Criteria APIの強化として
ストアドプロシージャサポート、バルク更新、ON句サポートなどが
予定されています。ぜひ、「JPA2.0入門」の資料をご覧ください。
なお、WebLogic ChannelではJPA関連の技術情報、特にWebLogic Server 12c上で実際にJPAアプリを動かす流れを説明している資料が下記にアップされていますので、併せてご活用ください。



[連載] WebLogic Server 12cでJava EE 6を動かしてみよう!(4) JPA 第1回




[連載] WebLogic Server 12cでJava EE 6を動かしてみよう!(4) JPA 第2回


Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.