X

An Oracle blog about WebLogic Channel

「JPA入門」レポート

WebLogic勉強会 通信

WebLogic Serverファンの皆様、こんにちは、WebLogic Server勉強会通信です。
2014年10月29日に開催された
「第50回WebLogic Server勉強会@東京」

「はじめてのJava EEアプリケーション開発シリーズ」(全4回)の最終回

「第4回 JPA入門」(10月29日)
をレポートします。
岡田さんがJPA (Java Persistence API)の特長、O/Rマッピング、EJBからの
JPAの利用方法などを解説しました。第1回から3回までの資料

「第1回 Java EE&WebLogic Server入門」(5月27日)


「第2回 JSF入門」(6月24日)


「第3回 EJB&CDI入門」(8月27日)

と併せて「はじめてのJava EEアプリケーション開発シリーズ」を総復習してください。
(日本オラクル Fusion Middleware事業統括本部 佐々木 政和)

JPA入門

2014年10月29日に
「第50回WebLogic Server勉強会@東京」
が開催され、
日本オラクル オラクルユニバーシティの岡田 大輔さんが、
JPA (Java Persistence API)の特長、O/Rマッピング、EJBからの
JPAの利用方法などを解説しました。JPAはJavaアプリケーションのデータベースアクセスをシンプルに、
効率良く実装するためのO/Rマッピングの仕様です。ここではポイントを中心にレポートします。

JPA (Java Persistence API)とは

JPA 2.0は Java EE 6 で使用可能な標準ORマッピング・フレームワークです。
ORマッピングはJavaのオブジェクトとRDBのデータをマッピングして相互運用するしくみを示し、
Java SE 環境でも Java EE 環境でも使用することが可能です。
Java SEの場合はアプリケーション管理の永続性が使用できます。
Java EEの場合は、アプリケーション管理の永続性および
コンテナ管理の永続性が使用可能です。

アプリケーション開発者の視点でJDBCとJPA(ORマッピング)のプデータベースアクセス
ロジック(プログラミング)を見て見ましょう。JDBCを使用した例は、SQLを組み立てて
データベースにリクエストを送り、返ってきたデータをバリューオブジェクトに挿入する
ロジックになります。一方JPAを使用した例は、エンティティとRDBとのデータ変換をEntityManager APIで
行うため大幅にコードが削減されています。JPAがエンティティからDBアクセスロジックを
処理するのでアプリケーションはデータベースを意識する必要はありません。

JPAはいくつかの構成要素から構成されます。
EntityManagerはエンティティの操作(CRUD)を行うためのAPIを提供します。EntityManagerは
データソースやEntityManagerのトランザクション・タイプなどを指定する永続性ユニット(persistence.xml)の
設定に
基づいて、
EntityManagerのインスタンスを生成するEntityManagerFactoryファクトリクラスから生成されます。

persistence.xml はEntityManagerが使用する
永続性ユニットの名前、トンランザクション・タイプ、
永続性プロバイダ、
データベース接続設定 (Java EEアプリケーションの場合はデータソース名)、
永続性ユニットが管理するエンティティクラス
のような永続化のための構成情報を含みます。

永続性ユニットのトランザクション・タイプ(transaction-type)は、
EntityManagerがJTAトランザクションを使用するか、リソース・ローカル・トランザクションを使用するかを指定します。
Java EE環境ではJTAがデフォルトで、Java SE環境ではRESOURCE_LOCALがデフォルトです。
(インストール先の環境により異なるので注意)

エンティティクラスを作成しよう!

左がエンティティクラスで実際のオブジェクトで、右がデータベースです。エンティティクラス名と
データベースのテーブル名に相当します。
エンティティクラスは永続化されるデータをあらわすクラスで、EntityManagerによって管理されます。
POJO(Plain Old Java Object)として実装します。
クラスには @Entity 注釈を指定してエンティティクラスであることを示します。
永続ストアのキー(主キー)に関連付けられた一意のIDを持ちます。主キーには@Id注釈を指定します。
エンティティの要素(POJOのフィールド)にアクセスするためにアクセサ・メソッドやJPQLなどを
使って問い合わせすることができます。

主キー

オブジェクトを識別するためのキーを指定します。自動生成の仕組みを使用することが可能です。
SEQUENCEを使用した例。

マッピングのオーバーライド


デフォルトはテーブル名とエンティティクラス名は同じ名前とみなされます。大文字小文字は区別しません。 ウィザードでマッピングを指定して異なる名前を使用することも可能です。

時刻処理

エンティティ側での日付や時刻を扱う場合は@Temporal注釈でSQL型とマッピングします。

一時フィールド

小計のようなデータベースに持つ必要が無いフィールドの使用方法
永続の対象からはずしたいフィールド
Transientを使用してカスタマイズすることが可能です。
デフォルトと違う場合に指定します。(デフォルトが何かを知る必要がある)

EntityManagerの取得

Java EEの場合はCDIが使用できるので、@PersisitenceContextを使用できます。

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

状態管理の説明
新規作成の場合はEntitiyManagerに対してpersistを呼び出すことで管理対象になりデータベースにマッピングされます。

- 永続化(em.persist(entity);)
データベースにエンティティを永続化します。(SQLのINSERT文に相当)

- 検索(em.find(Product.class, custId);)
主キーに基づいてエンティティを検索します。(SQLのSELECT文に相当)

- 更新
管理対象エンティティをsetterメソッドで更新すると変更が永続ストアに反映されます。(SQLのUPDATE文に相当)
管理対象ではない(デタッチ状態)エンティティを更新する場合は、mergeメソッドで管理対象エンティティを取得します。(em.merge(entity);)

- 削除(em.remove(em.merge(entity));管理状態にしてからmergeを実行する例)
管理対象エンティティを削除すると変更が永続ストアに反映されます。(SQLのDELETE文に相当)

オブジェクトに対する問い合わせ

主キー以外の操作を行うような場合にエンティティに対する問い合わせ言語として
SQLに似たJPQL(Java Persistence Query Language)を
使用することができます。バージョンを重ねるごとにJPQLで使用できる機能は拡張されています。
複雑な問い合わせはまとめて実行するのがお勧め。

プログラムの中からJPQLの問い合わせをしたい場合は、QueryクラスまたはTypedQueryクラスを使用することができます。
Queryは型指定されていない問い合わせのため、問い合わせ結果にアクセスするには必要に応じてキャストを行います。
TypedQueryは作成時に型指定されるので、問い合わせ結果はエンティティ型で返されます。

JPQLは、JDBCのPreparedStatementのようにパラメータ付きも使用できます。
名前付きパラメータの代わりに位置パラメータ (?1) も使用できます

名前付き問い合わせ

エンティティ・クラスで@NamedQuery属性を使用してあらかじめ問い合わせを宣言
しておき、それを呼び出す側(EJBなどから)はcreateNamaedQueryで呼び出して使用する方法です。
NamedQueryの名前は自由ですが、慣習としてエンティティの名前ドット問い合わせの名前を使用します。

問い合わせを利用する場合はgetResultlistまたはgetSingleResultを使用します。
getSingleResultは単一結果が返ります。複数、または結果が無かった場合は例外が
スローされます。

NativeQuery と Criteria API

NativeQueryを使用すると問い合わせをJPQLでは無くSQLを直接記述することができます。
型の安全性を高めるためにJPA 2.0から追加された機能としてCriteria APIがあります。
Criteria APIを使用することで実行時ではなく、コンパイル時にエラーを検出できます。

まとめ




2014年10月29日に開催された
「第50回WebLogic Server勉強会@東京」

「はじめてのJava EEアプリケーション開発シリーズ」(全4回)の最終回

「第4回 JPA入門」(10月29日)
のポイントをまとめて見ました。
第1回から3回までの資料

「第1回 Java EE&WebLogic Server入門」(5月27日)


「第2回 JSF入門」(6月24日)


「第3回 EJB&CDI入門」(8月27日)

も参考に「はじめてのJava EEアプリケーション開発シリーズ」を総復習してください。

次回(12月18日)のWebLogic Server勉強会@東京は、初心者向けのOracle WebLogic Server入門セッションです。ソフトウェアのインストールからアプリケーションを動かすために必要なOracle WebLogic Serverの各種設定方法を解説します。また、5月から10月まで全4回で開催された「はじめてのJava EEアプリケーション開発シリーズ」で作成したプログラムを使用してJava EEアプリケーションのデプロイメント方法をステップ・バイ・ステップで説明します。皆様のPC環境で動作させることができます。ご参加をお待ちしています。

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.