...

Feature Pack for OSGi Applications and JPA 2.0

by user

on
Category: Documents
68

views

Report

Comments

Transcript

Feature Pack for OSGi Applications and JPA 2.0
Feature Pack for OSGi and JPA 2.0
Feature Pack for
OSGi Applications and JPA 2.0
(JPA)
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Agenda
‰ Feature
€
Pack for OSGi and JPA 2.0 概要
このFeaturePackの概要について説明します。
‰ JPA概要
€
そもそもJPAとか何か、O/Rマッピングの概念も含めて説明します。
‰ JPA開発の流れ
€
JPAの開発の流れと、各ステップで使用する機能を説明します。
‰ JPAの機能
€
開発の流れで列挙した個々の機能を詳解します。
WebSphere Application Server v7 Feature Pack Guide
2
1
Feature Pack for OSGi and JPA 2.0
Feature Pack for OSGi Applications and Java Persistence API 2.0 概要
3
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Feature Pack 概要
‰
IBM WebSphere Application Server V7 Feature Pack
for OSGi Applications and Java Persistence API
(JPA) 2.0
€
€
JPA 2.0の新機能に対応
2010年5月29日公開
WebSphere Application Server v7 Feature Pack Guide
4
2
Feature Pack for OSGi and JPA 2.0
特徴
‰ JPA
2.0対応
€
悲観的ロックのサポート
€
キャッシュ仕様の追加
JPQL (Java Persistence Query Language) の強化
Bean Validation(JSR-303)のサポート
コレクションのサポート強化
組み込みオブジェクトのサポート強化
Criteria APIの追加
„
€
€
€
€
€
サポートしている実装もあったが、JPAとしての正式サポートは2.0から
‰ OpenJPAをベースにIBMによる機能拡張を提供
€
€
€
€
開発生産性の大幅な改善
Java Persistence Query language (JPQL) 拡張および機能改善
高性能実装
データベース・アクセス最適化のプログラマチック制御 (フェッチ・グループ、フェッ
チ・プラン、およびアクセス・インテント)
5
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Feature Pack 導入
‰ 前提条件
€
€
€
WAS v7.0 Fix Pack 9 以上
Java SDK 1.6.0 SR7 Cumulative Fix for WAS v7.0 Fix Pack 9 以上
WAS v7.0 Fix Pack 9は以下からダウンロード可能
„
http://www-01.ibm.com/support/docview.wss?uid=swg24025883
‰ 導入手順については、OSGi資料の導入手順を参照してください。
WebSphere Application Server v7 Feature Pack Guide
6
3
Feature Pack for OSGi and JPA 2.0
JPA概要
7
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
O/RマッピングとJPA
‰
O/Rマッピングとは?
€
€
‰
Javaの世界では、データは揮発性
永続化のためにはデータストア(DB)に格納する必要がある
しかしながら・・・
€
Javaの世界では、データはオブジェクトモデル
„
„
€
DBの世界では、リレーショナルモデル
€
このモデルの違い ⇒ インピーダンス・ミスマッチ
„
‰
クラス(オブジェクト)/ クラス図 / 継承の概念あり / 参照 / ゲッタ・セッタ / 配列・コレクション・マップ
検索や更新の効率性は考慮されていない
テーブル / ER図 / 継承の概念なし / 正規化・非正規化 / 外部キー
O/Rマッパーは、このインピーダンスミスマッチを解消するもの
€
SQLで検索したデータをオブジェクトに格納したり、オブジェクトの内容をSQLでDBに格納したり
する
O/R Mapping
1 AA 1,000
Application
3 CC 3,000
Application Server
WebSphere Application Server v7 Feature Pack Guide
UPDATE
2 BB 2,000
SELECT
1 AA 1,000
2 BB 2,000
3 CC 3,000
Database Server
8
4
Feature Pack for OSGi and JPA 2.0
O/Rマッピング
‰
O/R マッピングの方法は2種類
€
€
‰
自前マッピング(作りこみ)
自動マッピング(ツール等の使用)
自前マッピング
€
直接JDBCパターン
„
„
€
DAOパターン
„
„
„
„
‰
ロジックにデータアクセスをハードコードしてしまう
DBが変わるとビジネスロジックも変更
JDBCアクセス専用のDAOクラスからDBにアクセス
ビジネスロジックに変更が入らない
通常、DAOクラスとDTOクラスを作成する
DTOは対象の1行を表現するもの(FieldとアクセサをもったJavaBeans)
自動マッピング
€
€
EJB2.XのCMPエンティティBean
O/Rマッピング フレームワーク
JPA:POJOベースの自動マッピングアーキテクチャー
9
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPA適用検討にあたって
JPA適用で嬉しい事
1.
‰
‰
‰
‰
‰
‰
エンティティはPOJOなので、特殊なルールに縛られない!
POJOなので、継承や多態性が利用できる
ビジネス層で生成したPOJOは、そのままプレゼンテーション層で利用できる
JDBCコードの記述が要らない。マッピングも自動、開発生産性向上
強化されたJPQLクエリで、複雑検索もOK
JPAはEEとは独立した仕様なので、SE環境でも動く
考えねばならぬこと
2.
‰
‰
‰
データ操作の自由度
パフォーマンスやオブジェクトとデータの同期
作りやすさ・使いやすさ
WebSphere Application Server v7 Feature Pack Guide
10
5
Feature Pack for OSGi and JPA 2.0
JPA全体像
エンティティ・マネージャー
エンティティ・マネージャー
パーシスタンス・ユニット
パーシスタンス・ユニット
パーシスタンス・プロバイダー
パーシスタンス・プロバイダー
EntityManager
エンティティ
エンティティ
@Entity
Employee
クライアント・プログラム
getEmp_Id()
emp_Id=111111
setEmp_Id()
name=Nakajima
setName()
@Id
getEmp_Id() emp_Id
name
getName()
setEmp_Id()
getName()
setPhone()
getPhone()
phone
setPhone()
getPhone() phone=1804-1111
setName()
EMPLOYEE表
パーシスタンス・コンテキスト
パーシスタンス・コンテキスト
EMP_ID
NAME
PHONE
111111
Nakajima
1084-1111
222222
Hirabayashi
1804-2222
333333
Yamaguchi
1803-3333
11
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:パーシスタンス・プロバイダー
‰
JPAのコア
„
„
€
JPAの実装
コンテナーから呼び出され、全ての処理の派生元となる
FeaturePack for JPA2.0で提供しているのは、
以下の2つ
„
JPA for WebSphere Application Server パーシスタン
ス・プロバイダー
„
Apache OpenJPA パーシスタンス・プロバイダー
z
z
€
com.ibm.ws.persistence.persistenceProviderImpl
org.apache.openjpa.persistence.persistenceProviderImpl
persistence.xmlファイルで使用するパーシスタン
ス・プロバイダーを指定する
„
„
<provider> エレメントにパーシスタンス・プロバイダー指定し
ていない場合は、WASで設定しているデフォルトのパーシス
タンス・プロバイダーが使用される
IBM拡張機能を使用する場合は、「JPA for WebSphere
Application Server パーシスタンス・プロバイダー」を選択す
る。
WebSphere Application Server v7 Feature Pack Guide
12
6
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:エンティティ・マネージャー ファクトリー
‰ エンティティ・マネージャーの生成もと
„
„
€
エンティティ・マネージャーを生成する
どのパーシスタンス・ユニットを使用するか決定する
EntityManagerFactory の生成
„
インジェクション方式
@PersistenceUnitでパーシスタンスユニット
@PersistenceUnitでパーシスタンスユニット
を指定
を指定
@PersistenceUnit(unitName="FPforJPA")
@PersistenceUnit(unitName="FPforJPA")
protected
protected EntityManagerFactory
EntityManagerFactory emf;
emf;
„
Persistence クラス利用方式
private
private EntityManagerFactory
EntityManagerFactory emf
emf ==
Persistence.createEntityManagerFactory("FPforJPA");
Persistence.createEntityManagerFactory("FPforJPA");
Persistence.createEntityManagerFactory
Persistence.createEntityManagerFactory
の引数でパーシスタンスユニットを指定
の引数でパーシスタンスユニットを指定
13
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:パーシスタンス・ユニット
‰ パーシストの定義を行う論理的な範囲
„
€
persistence.xmlファイルでパーシスタンス・ユニットの設定を行う
„
€
トランザクションの設定や、接続先のDBなどの設定が及ぶ範囲
<persistence-unit> エレメントに設定を行う
EntityManagerFactory によって、参照される
WebSphere Application Server v7 Feature Pack Guide
14
7
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:エンティティ
‰ エンティティは「永続化可能なJavaオブジェクト」
„
€
通常のJavaクラス(POJO)に@Entityアノテーションを付与して作成
„
„
€
具体的にはDBの表に相当するオブジェクト
書かなくてはいけないコードを最小化
インスタンス変数により永続化状態が表される
制約事項
„
„
引数なしコンストラクタを持つ
主キー(に相当するフィールド)を持つ
インスタンス化・
レコードとの関連付け @Entity
Employee
EMPLOYEE表
EMP_ID
NAME
PHONE
setEmp_Id()
111111
Nakajima
1084-1111
name
setName()
222222
Hirabayashi
1804-2222
phone
setPhone()
333333
Yamaguchi
1803-3333
@Id
getEmp_Id() emp_Id
getEmp_Id() emp_Id=111111
getName() name=Nakajima
setEmp_Id()
setName()
getName()
getPhone() phone=1804-1111
setPhone()
getPhone()
getter
getter
変数
変数
setter
setter
15
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:エンティティ 例
package
package yam.test.entities;
yam.test.entities;
import
import java.io.Serializable;
java.io.Serializable;
import
import javax.persistence.*;
javax.persistence.*;
Entity独自のインターフェースのimplement不要
Entity独自のインターフェースのimplement不要
@Entity
@Entity
public
public class
class Employee
Employee implements
implements Serializable
Serializable {{
@Id
@Id
private
private int
int emp_Id;
emp_Id;
private
private String
String name;
name;
@Entityを指定
private
@Entityを指定
private String
String phone;
phone;
public
public Employee()
Employee() {{
}}
public
public int
int getEmp_Id()
getEmp_Id() {{
return
return this.emp_Id;
this.emp_Id;
}}
public
void
setEmp_Id(int
public void setEmp_Id(int emp_Id)
emp_Id) {{
this.emp_Id
this.emp_Id == emp_Id;
emp_Id;
}}
public
public String
String getName()
getName() {{
return
return this.name;
this.name;
}}
public
void
setName(String
public void setName(String name)
name) {{
this.name
this.name == name;
name;
}}
public
public String
String getPhone()
getPhone() {{
return
return this.phone;
this.phone;
}}
public
void
setPhone(String
public void setPhone(String phone)
phone) {{
this.phone
this.phone == phone;
phone;
}}
表の列に相当するフィールド定義
表の列に相当するフィールド定義
表の列操作のための
表の列操作のための
アクセッサーメソッド定義
アクセッサーメソッド定義
}}
WebSphere Application Server v7 Feature Pack Guide
16
8
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:エンティティマネージャー
‰ Entityを操作するためにJPAが提供するインターフェース
€
€
javax.persistence.EntityManager
クライアント・プログラムから使用されるfaçadeインターフェース
„
€
クライアントはEntityManagerを介してEntityを操作
従来Entity Bean毎にあったhomeインターフェースに相当
„
Entity毎に作成する必要は無い
EntityManagerを介し
永続化状態の取得を依頼
EntityManager
レコードとの関連付け @Entity
Employee
クライアント・プログラム
setEmp_Id()
setName()
@Id
getEmp_Id() emp_Id
getName() name
setPhone()
getPhone()
phone
setPhone()
getEmp_Id() emp_Id=111111
getName() name=Nakajima
setEmp_Id()
getPhone() phone=1804-1111
setName()
Employeeの
インスタンスを取得
17
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:パーシスタンス・コンテキスト
‰ エンティティインスタンスの集合
€
Persistence Contextの中でEntityManagerにより個々のEntityインスタン
スのライフサイクルが管理される
„
@PersistenceContextアノテーションでEntityManagerと関連付けて使用する
EntityManager em1
クライアント・プログラム
EntityManager : em1
PersistenceContext
employee
emp_Id=111111
employee
emp_Id=222222
@Entity
Employee
EntityManager em2
PersistenceContext
クライアント・プログラム
EntityManager : em2
employee
emp_Id=555555
employee
emp_Id=777777
WebSphere Application Server v7 Feature Pack Guide
@Id
getEmp_Id() emp_Id
getName() name
setEmp_Id()
phone
setPhone()
getPhone()
setName()
18
9
Feature Pack for OSGi and JPA 2.0
コンポーネント解説:エンティティ・マネージャー/パーシスタンス・コンテキスト 例
EmpTaskImpl
package
package jpatest.sessions;
jpatest.sessions;
import
import java.util.List;
java.util.List;
import
import javax.ejb.Stateless;
javax.ejb.Stateless;
import
import javax.persistence.EntityManager;
javax.persistence.EntityManager;
import
import javax.persistence.PersistenceContext;
javax.persistence.PersistenceContext;
import
import jpatest.entities.Employee;
jpatest.entities.Employee;
@Stateless
@Stateless
public
public class
class EmployeeTaskImpl
EmployeeTaskImpl implements
implements EmployeeTask
EmployeeTask {{
@PersistenceContext
@PersistenceContext
EntityManager
EntityManager em;
em;
}}
@PersistenceContextを指定して
@PersistenceContextを指定して
EntityManagerを取得
EntityManagerを取得
public
public Employee
Employee findEmployee(int
findEmployee(int emp_Id)
emp_Id) {{
Employee
Employee employee
employee == (Employee)
(Employee) em.find(Employee.class,
em.find(Employee.class, emp_Id);
emp_Id);
return
return employee;
employee;
}}
EntityManagerのfindメソッドでEntityを取得
EntityManagerのfindメソッドでEntityを取得
19
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPA開発の流れ
WebSphere Application Server v7 Feature Pack Guide
20
10
Feature Pack for OSGi and JPA 2.0
開発ツールについて
‰ FeaturePack
€
€
for JPA2.0 が提供するもの
FeaturePack for JPA2.0は、ランタイムを提供するものであり、開発環境ま
では提供していない
従って、開発ツールは別途用意する必要あり
‰ 開発ツールの選択
€
選択肢1:RAD7.5
„
JPA 1.0 での開発をサポート、RAD内でエンティティクラス作成、DDL作成などを行える
€
選択肢2:RAD8.0
€
選択肢3:その他
„
„
JPA 2.0での開発をサポート、 RAD内でエンティティクラス作成、DDL作成などを行える
Eclipseを使用
z
z
„
必要なライブラリをロードして開発を行う
JPA関連開発支援ツールなし
Eclipse+Dali
z
z
必要なライブラリをロードして開発を行う
DaliでJPA関連開発支援ツールを提供
21
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
開発アプローチ
‰ EntityとDBのマッピング・アプローチ
€
TopDown
„
€
Product
PRODUCT
Product
PRODUCT
Order
ORDER
Bottom Up
„
€
Entityクラスから、DB表のスキーマ(DDL)を自動生成
既存の表から、Entityクラスを生成
Meet in the Middle
„
Entityクラスと、既存のDBをマッピング
WebSphere Application Server v7 Feature Pack Guide
22
11
Feature Pack for OSGi and JPA 2.0
開発の流れ 各ステップ必要とされる機能
:JPA2.0およびOpenJPA2.0での機能追加/機能強化
:IBM拡張機能
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
カスケード
ストラテジー
キー/複合キー
フェッチ
ストラテジー
ステップ2:設定ファイルの作成
persistence.xml
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
例外
JPQL
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
23
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPA機能解説
WebSphere Application Server v7 Feature Pack Guide
24
12
Feature Pack for OSGi and JPA 2.0
JPA機能解説
ステップ1
ステップ1:エンティティの作成
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
25
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
エンティティ / エンティティ・マネージャー
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
WebSphere Application Server v7 Feature Pack Guide
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
26
13
Feature Pack for OSGi and JPA 2.0
エンティティ・マネージャーの役割
エンティティオブジェクトに対して、CRUD
(Create/Read/Update/Delete)操作を行う
エンティティオブジェクトのライフサイクル管理を行う
1.
2.
€
€
€
エンティティマネージャーが管理するエンティティオブジェクトはパーシスタンス・
コンテキスト = DBの内容をメモリ上にキャッシュしたもの
パーシスタンス・コンテキストは、ある意味キャッシュであるが、DBと同期が取
れることを保証しているキャッシュ
エンティティオブジェクトは一意
„
ひとつのパーシスタンス・コンテキスト内では、同じデータベースの行=データを表すエンティティ
オブジェクトはひとつのみ
27
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
エンティティ・マネージャーの種類
‰
コンテナ管理のエンティティ・マネージャー
€
‰
アプリケーション管理のエンティティ・マネージャー
€
€
‰
JavaEE(EJBコンポーネント内)で使用する場合は、このタイプ
JavaEE(Webコンポーネント内)やJavaSE環境で使用する場合は、このタイプ
このタイプでは、エンティティマネージャーは、エンティティマネージャーファクトリーから生
成する
エンティティマネージャーの取得
„
€
1.
2.
€
以下のいずれかの方法で取得します。
コンテナ管理
コンテナによるインジェクション
JNDI Lookup
アプリケーション管理
1.
エンティティマネージャーファクトリーを取得(以下のいずれか)
1.
2.
3.
2.
コンテナによるインジェクション
JNDI Lookup
javax.persistence.Persistence インターフェースのcreateEntityManagerFactoryメソッド
EntityManagerFactory.createEntityManager()で取得
WebSphere Application Server v7 Feature Pack Guide
28
14
Feature Pack for OSGi and JPA 2.0
エンティティ・マネージャーの役割:1. エンティティオブジェクトの操作
エンティティの操作
動作
DBに対する操作
find
SELELCT
結果、エンティティオブジェクトが返される
persist
INSERT
newしたエンティティを渡すと、MANAGED状態になる
remove
DELETE
MANAGED状態のオブジェクトを渡すと、REMOVEDになる。
REMOVEDは、次のフラッシュのタイミングで、テーブルからDELETEされる
merge
UPDATE
/INSERT
DETACHED状態のオブジェクトを渡すと、そのコピーがMANAGED状態に
なる。次のフラッシュのタイミングでUPDATEされる。NEW状態のものを渡す
と、INSERTされる
refresh
MANAGED状態のエンティティを渡すと、テーブルからデータをもってきてリフ
レッシュする
flush
その時点のパーシスタンスコンテキスト内の全オブジェクトの内容がテーブルに
反映される
clear
その時点のパーシスタンスコンテキスト内の全オブジェクトがDETACHED状
態になる
29
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
エンティティ・マネージャーの役割:2. エンティティオブジェクトのライフサイクル管理
Entityクラスのnew
new
永続化状態を持たず、Persistence
永続化状態を持たず、Persistence Contextとの関連付けも行われていない
Contextとの関連付けも行われていない
INSERT
em.persist()
SELECT / UPDATE
em.find(),
Query.xxx
永続化状態を持ち、Persistence
永続化状態を持ち、Persistence Contextと関連付けられている
Contextと関連付けられている
em.remove()
managed
DELETE
em.clear()
tx.commit()/rollback()
em.merge()
detached
WebSphere Application Server v7 Feature Pack Guide
em.persist()
removed
永続化状態を持ち、Persistence
永続化状態を持ち、Persistence Contextと関連付けられているが
Contextと関連付けられているが
データベースからのremoveが予定されている
データベースからのremoveが予定されている
永続化状態を持っているが、Persistence
永続化状態を持っているが、Persistence Contextと関連付けられていない
Contextと関連付けられていない
30
15
Feature Pack for OSGi and JPA 2.0
エンティティの作成(TopDownの場合)
‰ 準備作業
€
€
JPA開発可能な開発ツールを準備
ワークスペース上に新規プロジェクトを作成
„
„
„
€
€
エンタープライズ・アプリケーション・プロジェクト
Webプロジェクト
ユーティリティ・プロジェクト(JPAプロジェクト)
エンティティクラスを作成する
DB/表の作成
„
RAD 8 では、JPAツールでDDLの生成が可能
WebSphere Application Server v7 Feature Pack Guide
31
Feature Pack for OSGi and JPA 2.0
エンティティの作成(BottomUpの場合)
‰ 準備作業
€
€
€
DB/表の作成
JPA開発可能な開発ツールを準備
ワークスペース上に新規プロジェクトを作成
„
„
„
€
エンタープライズ・アプリケーション・プロジェクト
Webプロジェクト
ユーティリティ・プロジェクト(JPAプロジェクト)
エンティティの作成
„
RAD 8 では、JPAツールでエンティティの生成が可能
WebSphere Application Server v7 Feature Pack Guide
32
16
Feature Pack for OSGi and JPA 2.0
エンティティの作成例
‰ 基本的なEntityの作成例(Product)
package
package jpatest.entities;
jpatest.entities;
//
// import省略
import省略
public
public String
String getSku()
getSku() {{
return
return sku;
sku;
}}
public
public void
void setSku(String
setSku(String sku)
sku) {{
this.sku
this.sku == sku;
sku;
}}
public
public double
double getPrice()
getPrice() {{
return
return price;
price;
}}
public
public void
void setPrice(double
setPrice(double price)
price) {{
this.price
this.price == price;
price;
}}
Product
@Entity
@Entity
@Table(name="PRODUCT",schema="JPATEST")
@Table(name="PRODUCT",schema="JPATEST")
public
public class
class Product
Product implements
implements Serializable
Serializable {{
@Id
@Id
private
private int
int prod_Id;
prod_Id;
private
private String
String prod_name;
prod_name;
private
private String
String sku;
sku;
private
private String
String description;
description;
private
private double
double price;
price;
public
public int
int getProd_Id()
getProd_Id() {{
return
return prod_id;
prod_id;
}}
public
public void
void setProd_Id(int
setProd_Id(int prod_id)
prod_id) {{
this.prod_id
this.prod_id == prod_id;
prod_id;
}}
public
public String
String getProd_name()
getProd_name() {{
return
return prod_name;
prod_name;
}}
public
public void
void setProd_name(String
setProd_name(String prod_name)
prod_name) {{
this.prod_name
this.prod_name == prod_name;
prod_name;
}}
public
public String
String getDescription()
getDescription() {{
return
return description;
description;
}}
public
public void
void setDescription(String
setDescription(String description)
description) {{
this.description
this.description == description;
description;
}}
}}
33
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
エンティティの基本アノテーション
‰
エンティティの基本アノテーション
€
@Entity
„
クラスがEntityであることを指定するアノテーション
z
z
€
name
access
JPQLなどで指定されるEntityの名前。デフォルトはクラス名。
コンテナが永続化属性へアクセスする方法を示す。AccessType=PROPERTY
(デフォルト)もしくはFIELD。
@Table
„
Entityのプライマリー表を指定するマッピング・アノテーション
z
z
z
z
name
catalog
schema
uniqueConstraints
€
@Id
€
@Column
„
„
表名
カタログ名
スキーマ名
ユニーク制約の指定。トップダウンでDDL生成時に使用。
フィールドがプライマリー・キー列であることを指定するアノテーション
Entityクラスのフィールドから表の列を指定するマッピング・アノテーション
z
z
z
z
z
z
z
name
unique
nullable / insertable / updatable
columnDefinition
length
precision
scale
WebSphere Application Server v7 Feature Pack Guide
列名
ユニークネス。true/falseで指定。デフォルトfalse
NULL / INSERT / UPDATE可否。全てデフォルトtrue。
カラム定義。トップダウンでDDL生成時に使用。
Stringカラムの長さ。デフォルト255
Decimalカラムの精度(総桁数)。デフォルト0
Decimalカラムの位取り(小数点右側の桁数)。デフォルト0
34
17
Feature Pack for OSGi and JPA 2.0
【Tips】永続的フィールドの設定方法
‰ (参考)永続的フィールドの設定方法
€
@Entity : access=AccessType.PROPERTY / FIELD
„
PROPERTYの場合
z
z
„
@Idアノテーションはプライマリー・キー・フィールドを取得するgetterメソッドに付与
パーシスタンスランタイムはアクセッサーメソッド(getter/setter)を介して属性にアクセス
FIELDの場合
z
z
@Idアノテーションはプライマリー・キー・フィールドに付与
パーシスタンスランタイムはEntityのインスタンス変数に直接アクセス
35
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【Tips】フィールドとカラムの特殊なマッピング
‰
以下のフィールド定義には注意が必要
€
時間型のマッピング
„
java.util.Data
z
z
z
TemporalType.DATE
TemporalType.TIME
TemporalType.TIMESTAMP
€
列挙型のマッピング
€
Lob型のマッピング
„
„
„
€
java.sql.Date
java.sql.Time
java.sql.Timestamp
定型から選択する形式の列挙型は、@Enumerated アノテーションを付与
バイト配列/ストリーム、巨大文字列などは、DB上のLOB型のカラムに格納、マッピングのためには、@Lob
アノテーションを使用する
バイト型の場合、java.sql.Blob、文字列型データの場合、java.sql.Clobにマッピングされる。
マッピングしないフィールド
„
マッピングしない場合は、@Transient アノテーションを付与
WebSphere Application Server v7 Feature Pack Guide
36
18
Feature Pack for OSGi and JPA 2.0
【Tips】エンティティとDBの同期
‰ DBとの同期タイミング
€
€
同期はフラッシュを行うことで実施される
フラッシュはトランザクションのコミット段階で行われる
„
トランザクションのコミット
z
€
EntityTransactionのcomit()メソッドの実行
JPA以外でデータ操作を行う処理に切り替える場合は、明示的なフラッシュ
を行う必要がある。
„
例えば、JDBCコードなどで直接DBアクセスをする場合、フラッシュを行ってデータの整合性を
確保しておく。
37
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【図解】エンティティとDBの同期
‰ データベースにいつ同期されるか?
€
トランザクションコミット時
クライアント
…
public void updateAccount(int account_Id,double withdraw) {
Account account = (Account)em.find(Account.class.account_Id);
double currentAmount = account.getAmount();
account.setAmount(currentAmount - withdraw);
account.setDate(currentTimestamp);
}
CMTの
1UOW
JPADB
UPDATE
UPDATE JPATEST.ACCOUNT
JPATEST.ACCOUNT SET
SET amount
amount == ?,
?, date=
date= ?? WHERE
WHERE account_Id
account_Id
€
EntityManagerのflush()メソッド実行時
クライアント
…
public void updateAccount(int account_Id,double withdraw) {
Account account = (Account)em.find(Account.class.account_Id);
JPADB
double currentAmount = account.getAmount();
CMTの
account.setAmount(currentAmount - withdraw);
1UOW
em.flush(account);
account.setDate(currentTimestamp);
UPDATE
UPDATE JPATEST.ACCOUNT
JPATEST.ACCOUNT SET
SET amount
amount == ?? WHERE
WHERE account_Id
account_Id == ??
}
UPDATE
UPDATE JPATEST.ACCOUNT
JPATEST.ACCOUNT SET
SET date
date == ?? WHERE
WHERE account_Id
account_Id == ??
WebSphere Application Server v7 Feature Pack Guide
38
19
Feature Pack for OSGi and JPA 2.0
【図解】エンティティとDBの同期
‰ データベースからいつ同期されるか?
€
参照系メソッド実行時
€
EntityManagerのrefresh()メソッド
„
EntityManagerのfind()やQueryのgetResultList()など
クライアント
…
public void updateAccount(int account_Id,double withdraw) {
Account account = (Account)em.find(Account.class.account_Id);
double currentAmount = account.getAmount();
SELECT
SELECT
// 色々な処理
JPADB
em.refresh(account);
double refreshedAmount = account.getAmount();
if (currentAmount == refreshedAmount) {
account.setAmount(currentAmount - withdraw);
}
}
39
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
リレーションシップ
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
WebSphere Application Server v7 Feature Pack Guide
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
40
20
Feature Pack for OSGi and JPA 2.0
リレーションシップとは
‰ リレーションシップとは
„
„
€
二つのエンティティ間の関連のこと
エンティティのリレーションシップには、ディレクション (方向性) と カーディナリティ (多重性)とい
う概念がある
カーディナリティー
„
„
二つのエンティティクラス間のリレーションシップにおいて、自分と相手のエンティティオブジェクト
をそれぞれいくつずつ保持するか、という考え方
以下の4つのパターン(自分 - 相手 )
z
z
z
z
€
One-to-One
Many-to-One
One-to-Many
Many-to-Many
ディレクション
„
単方向
z
„
あるエンティティクラスが、別のエンティティクラスへのリレーションシップをフィールドとして定義しているが、相
手のエンティティクラスは自分へのリレーションを保持していないパターン
双方向
z
あるエンティティクラスが、別のエンティティクラスへのリレーションシップをフィールドとして定義しており、相手
のエンティティクラスも自分へのリレーションを保持しているパターン
41
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【図解】リレーションシップ
‰ エンティティの関係
€
カーディナリティー
„
€
テーブル間の関係と同様、エンティティに4種類の関係を定義可能
Employee
TravelProfile
@OneToManyアノテーション
Department
Employee
多対一
@ManyToOneアノテーション
Employee
Address
多対多
@ManyToManyアノテーション
Employee
Project
z
一対一
@OneToOneアノテーション
z
一対多
z
z
ディレクション
„
単方向と双方向の関係がある
z
単方向
Entity AがEntity Bを参照するが、Entity BはEntity Aを参照しない
Employee
TravelProfile
所有側
z
双方向
Entity AがEntity Bを参照し、Entity BはEntity Aを参照する
Department
非所有側
WebSphere Application Server v7 Feature Pack Guide
Employee
所有側
42
21
Feature Pack for OSGi and JPA 2.0
リレーションシップ:エンティティの主従関係
‰ 主側(OWNING
„
„
€
双方向 / One-to-One
„
対応するテーブル定義によって決まる
外部キーを保有しているテーブルが 主側、
„
外部キーによって参照されるテーブルが従側
„
€
双方向 / Many-to-One および 6. 双方向 / One-to-Many
„
„
€
SIDE)と従側(INVERSE SIDE)
リレーションシップが双方向の場合のみの考え方
@JoinColumn設定を行う際に留意する必要がある
双方向 / One-to-One のケースと同じで、外部キーを保有しているテーブルが 主側、外部
キーによって参照されるテーブルが従側
リレーショナルモデルでは必然的にMany側が 外部キーを保持しているテーブル (=主)となる
双方向 / Many-to-Many
„
どちらも主側、従側にもなれる
43
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
リレーションシップの設定
‰ @JoinColumnアノテーションとmappedBy属性
€
主 / 従 の関係があり、テーブルを結合する必要がある場合、
„
主側では、
z
z
z
1. @JoinColumnアノテーションを付与する。
2. さらに、name属性で、対象テーブルの外部キーカラム名を指定し、
3. referencedColumnName属性で、結合先のテーブルの参照先カラム名を指定する。
○
„
省略すると、nameで指定した列と同一列指定
従側では、
z
1. @XToXアノテーションの、mappedBy属性で、主側のフィールド名を指定する。
@ManyToOne
@ManyToOne
@JoinColumn(name="ORDER_ID")
@JoinColumn(name="ORDER_ID")
private
private Order
Order order_Id;
order_Id;
@OneToMany(mappedBy="order_Id",
@OneToMany(mappedBy="order_Id",
targetEntity
targetEntity == com.ise.jpa.entities.OrderItem.class)
com.ise.jpa.entities.OrderItem.class)
private
private Set<OrderItem>
Set<OrderItem> orderItemCollection;
orderItemCollection;
OrderItem
WebSphere Application Server v7 Feature Pack Guide
Order
44
22
Feature Pack for OSGi and JPA 2.0
【Tips】Many to Manyの場合の注意点
‰
Joinテーブル
„
„
„
ManyToManyの場合、クラス上はコレクションで複数のデータを持てるが、繰り返しが許され
ないテーブルでは、二つのテーブル間の関係のみを表すジョインテーブルが必要になる。
即ち、「多対多」を、「多対1+1対多」 の形式で表す
ジョインテーブルに関する情報は、@JoinTableアノテーションで設定する。
45
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【参考】関係アノテーションの属性
‰ @OneToMany
€
€
targetEntity
cascade
„
„
€
„
€
処理の種類:ALL、PERSIST、MERGE、REMOVE、REFRESH
複数指定も可能。
fetch
„
関係の対象となるEntityクラス
各処理を対象に派生させるか否か
FetchType.EAGER
FetchType.LAZY
mappedBy
関係Entity取得のストラテジー
このEntityを取得した際に関係Entityも取得する。
関係EntityはLazy Loadされる。デフォルト。
関係を保持するフィールドを指定
‰ @ManyToOne
€
€
€
€
targetEntity
cascade
fetch
optional
„
関係の対象となるEntityクラス
各処理を対象に派生させるか否か
関係Entity取得のストラテジー
関係がオプションであるか否か
falseの場合はnullで無い対象が必ず存在する。デフォルトtrue。
WebSphere Application Server v7 Feature Pack Guide
46
23
Feature Pack for OSGi and JPA 2.0
【参考】@JoinColumnアノテーションの属性
‰ @JoinColumn
€
€
€
€
€
€
name
referencedColumnName
unique
nullable / insertable / updatable
columnDefinition
table
外部キー・カラムの名前
対象表の参照カラム名
ユニークネス。true/falseで指定。デフォルトfalse
NULL / INSERT / UPDATE可否。全てデフォル
トtrue。
カラム定義。トップダウンでDDL生成時に使用。
外部キー・カラムのあるテーブル名
47
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
カスケード・ストラテジー / フェッチ・ストラテジー
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
WebSphere Application Server v7 Feature Pack Guide
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
48
24
Feature Pack for OSGi and JPA 2.0
フェッチストラテジー
‰
エンティティクラス内の永続化フィールドのfetch属性として、
javax.persistence.FetchType 列挙型で以下の2つを選択定義
€
€
‰
EAGER
€
‰
EAGER
LAZY
あるエンティティを検索する際に、関連するエンティティの値を全て最初のSQLで読み
込んでしまう方法
LAZY
€
€
あるエンティティを検索する際に、関連するエンティティの値を全て一度に読み込まず、
実際の値が必要になったときに始めてデータベースから読み込みを行う
エンティティのリレーションによって、デフォルト値が異なる。
„
以下のデフォルトはLAZYだが、それ以外はEAGER
z
z
@OneToMany
@ManyToMany
※関連先のエンティティがManyの場合、実際にどれ位のエンティティオブジェクトが関連づいているか不明なため。万が一大
量のエンティティが関連していた場合、必要のないものまでロードし、処理時間が余分にかかるのを防ぐため、デフォルトは
LAZYとなっている。
49
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【図解】フェッチストラテジー
‰
LAZYの場合
€
設定
@OneToMany(mappedBy="order_Id")
@OneToMany(mappedBy="order_Id")
private
private Set<OrderItem>
Set<OrderItem> orderItemCollection;
orderItemCollection;
€
検索時に発行されるSQL
SELECT
SELECT t0.date,
t0.date, t0.status,
t0.status, t0.totalprice
t0.totalprice FROM
FROM JPATEST.ORDER
JPATEST.ORDER t0
t0 WHERE
WHERE t0.order_Id
t0.order_Id == ?? optimize
optimize for
for 11 row
row
‰
EAGERの場合
€
設定
@OneToMany(mappedBy="order_Id",
@OneToMany(mappedBy="order_Id", fetch
fetch == FetchType.EAGER)
FetchType.EAGER)
private
private Set<OrderItem>
Set<OrderItem> orderItemCollection;
orderItemCollection;
€
検索時に発行されるSQL
SELECT
SELECT t0.date,
t0.date, t0.status,
t0.status, t0.totalprice,
t0.totalprice, t1.ORDER_ID,
t1.ORDER_ID, t1.orderItem_Id,
t1.orderItem_Id,
t2.prod_Id,
t2.prod_Id, t2.description,
t2.description, t2.price,
t2.price, t2.prod_Name,
t2.prod_Name, t2.sku,
t2.sku, t1.quantity,
t1.quantity, t1.subtotal
t1.subtotal
FROM
FROM JPATEST.ORDER
JPATEST.ORDER t0
t0
LEFT
OUTER
JOIN
JPATEST.ORDERITEM
t1
ON
t0.order_Id
=
t1.ORDER_ID
LEFT OUTER JOIN JPATEST.ORDERITEM t1 ON t0.order_Id = t1.ORDER_ID
LEFT
LEFT OUTER
OUTER JOIN
JOIN JPATEST.PRODUCT
JPATEST.PRODUCT t2
t2 ON
ON t1.PROD_ID
t1.PROD_ID == t2.prod_Id
t2.prod_Id
WHERE
WHERE t0.order_Id
t0.order_Id == ??
ORDER
ORDER BY
BY t1.ORDER_ID
t1.ORDER_ID ASC
ASC
WebSphere Application Server v7 Feature Pack Guide
50
25
Feature Pack for OSGi and JPA 2.0
カスケードストラテジー
‰ カスケードとは、エンティティオブジェクトに何らかの操作を行った場
合に、関連するオブジェクトにもその操作が自動的に反映される機
能
‰ リレーションシップを表す4つのアノテーションのcascade属性に、
CascadeType列挙型の配列で指定する。
€
€
€
€
€
CascadeType.ALL
CascadeType.PERSIST
CascadeType.REMOVE
CascadeType.MERGE
CascadeType.REFRESH
‰ 何も指定しない場合はカスケードは行われない
51
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
委譲・継承
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
WebSphere Application Server v7 Feature Pack Guide
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
52
26
Feature Pack for OSGi and JPA 2.0
委譲と継承
‰ エンティティクラスの委譲や継承の仕組みを利用することでエンティ
ティクラスの再利用性を高めることができる。
‰
エンベッダブルクラス(委譲)
€
€
€
€
‰
エンベッダブルクラスをエンティティクラスに埋め込むことで、エ
ンティティクラスからエンベッダブルクラスの永続フィールド宣言
を利用して特定のテーブルにマップすることができる。
エンティティクラスと同様に永続フィールドを宣言可能
主キーは存在しないため、@Idアノテーションは記述不可
複数のエンティティクラスに同エンベッダブルクラスを埋め込み
可能
@Embedded
@Embeddable
マップドスーパークラス(継承)
€
€
€
€
エンティティクラスからエンベッダブルクラス継承することで、エ
ンティティクラスからエンベッダブルクラスの永続フィールド宣
言を利用して特定のテーブルにマップすることができる。
エンティティクラスと同様に永続フィールドを宣言可能
特定のテーブルを表すクラスではないので、@Table アノ
テーションは記述不可
複数のエンティティクラスの共通フィールドを抽出しマップド
スーパークラスとする
@MappedSuperclass
@AttributeOverride
53
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
継承のストラテジー
‰
‰
継承の場合、継承したエンティティをテーブルとどのように対応付けるかを考える必要があ
る。
親クラスにおいて、@Inheritanceアノテーションで指定する。
€
例) @ Inheritance(strategy = InheritanceType.SINGLE_TABLE)
€
SINGLE_TABLE
„
„
„
€
JOINED
„
„
„
€
エンティティクラスの継承階層にあるすべてのクラスを一つのテーブルにマップする方法
【強み】他2つ(JOINED、TABLE_PER_CLASS)に比べテーブル結合がないためパフォーマンス有利
【弱み】一方のエンティティにある制約が他方のエンティティにはない場合に制約を定義することできない
エンティティクラスの継承関係を同じ主キーをもつ複数のテーブルにマップする方法
【強み】SINGLETABLE戦略の問題を解消
【弱み】SINGLETABLE戦略より結合が必要なためオーバーヘッドの可能性あり
TABLE_PER_CLASS
„
„
„
エンティティクラスのクラス階層中の各クラスを別々のテーブルにマップする戦略方法
【強み】特になし
【弱み】重複記述の部分がある
WebSphere Application Server v7 Feature Pack Guide
54
27
Feature Pack for OSGi and JPA 2.0
キー・複合キー
ステップ1:エンティティの作成
エンティティ
マネージャー
エンティティ
リレーション定義
委譲と継承
キー/複合キー
カスケード
ストラテジー
フェッチ
ストラテジー
55
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
複合主キー
‰ 複合主キー
€
1つのテーブルに複数キーが存在する場合(2つのキーを合わせて初めてエン
ティティが特定できるケース)、テーブルをエンティティクラスとして表現するため
にエンティティクラス内の複数フィールドをキーとして扱う必要がある。
‰ 実装方法
€
€
主キークラス
エンベッデドIDクラス
WebSphere Application Server v7 Feature Pack Guide
56
28
Feature Pack for OSGi and JPA 2.0
複合主キー:主キークラスによる対応
主キークラス(Javabeanクラス)
‰
エンティティクラス内で@IdClassアノテーショ
ンを指定する
エンティティクラスの主キーとなるフィールドに
@Idを付与
主キークラスを作成、@IdClass
(value=XXXX.class)
主キークラスを、複数の主キーとなるフィール
ドを持つJavaBeanとして実装する
1.
2.
3.
4.
„
„
主キーフィールドの型を一致させる必要がある
一意性保証のためequals、hashCodeメソッドをオーバー
ライドすること
エンティティクラス
@Entity
@Table(name="PRODUCT",schema="DB2ADMIN")
@IdClass(value=ProductMKPK.class)
public class ProductMK implements Serializable {
@Id
private int prod_Id;
private String description;
private double price;
@Id
private String prod_Name;
private String sku;
・・・・・
}
public class ProductMKPK implements Serializable {
private static final long serialVersionUID = 1L;
private int prod_Id;
private String prod_Name;
以下の指定で、RADで自動生成し
てくれるので便利!
@Override
public int hashCode() {
・・・・
}
@Override
public boolean equals(Object obj) {
・・・・
}
}
主キークラス
57
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
複合主キー:エンベッデドIDクラスによる対応
‰
エンベッデドIDクラス
€
€
€
€
①エンティティクラスに@EmbeddedIdを付与
②エンベッデドIDクラス(エンベッダブルクラス)に@
Embeddableを付与、@Idは不要
※一意性保証のためequals、hashCodeメソッ
ドをオーバーライドすること
検索は以下の様に行う
ProductMK product =
em.find(ProductMK.class, new ProductMKPK(1, “JPABook”));
@Entity
@Table(name="PRODUCT",schema="DB2ADMIN")
public class ProductMK implements Serializable {
private ProductMKPK
private String description;
private double price;
@Embeddable
public class ProductMKPK implements Serializable {
・・・
//コンストラクタ
public ProductMKPK (int prod_Id, String prod_Name){
this.prod_Id = prod_Id;
this.prod_Name = prod_Name;
}
@Column
public int getProd_Id() {
return prod_Id;
}
public void setProd_Id(int prod_Id) {
this.prod_Id = prod_Id;
}
@Column
public String getProd_Name () {
return prod_Name;
}
public void setProd_Name(String prod_Name) {
this.prod_Name = prod_Name;
}
エンティティクラス
@Override
public int hashCode() {
・・・・
}
@Override
public boolean equals(Object obj) {
・・・・
}
@EmbeddedId
public ProductMKPK
・・・・・
}
}
主キークラス
WebSphere Application Server v7 Feature Pack Guide
58
29
Feature Pack for OSGi and JPA 2.0
JPA機能解説
ステップ2
ステップ2:設定ファイルの作成
ステップ2:設定ファイルの作成
persistence.xml
59
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPA設定ファイル(persistence.xml)
要素
属性
persistence
説明
peristence.xmlのルート。
version
JPA1.0 使用時には“1.0”、JPA2.0使用時には”2.0”を指定する。
name
パーシスタンス・ユニット名を指定する。ここで指定した名前が、@PersistenceUnitアノテーションのunitName属性
から参照される。
transaction-type
このパーシスタンス・ユニットのトランザクションタイプを指定する。”JTA”、”RESOURCE_LOCAL“から選択する。
パーシスタンス・ユニットの定義。
persistence-unit
provider
パーシスタンス・プロバイダーのクラス名を定義する。指定しなかった場合は、WASで定義されているデフォルトのプロ
バイダーが使用される。
jta-data-source
JTAトランザクションで使用されるデータソースのJNDI名を指定する。JavaSEでは使用無し。
non-jta-data-source
JTAトランザクション以外で使用されるデータソースのJNDI名を指定する。JavaSEでは使用無し。
mapping-file
マッピングをXMLファイルを使用して行う場合のファイルを指定する。アノテーションで行う場合は必要なし。
jar-file
エンティティ関連クラスを含むjarファイルを指定する。コンテナ管理のエンティティマネージャーを使用する場合は特に
指定する必要なし。
class
エンティティ関連クラスのクラス名を指定する。コンテナ管理のエンティティマネージャーを使用する場合は特に指定す
る必要なし。
exclude-unlisted-class
O/Rマッピング対象外のクラス名を指定する。
shared-cache-mode
キャッシュの振る舞いについて、ALL(全てキャッシュ), NONE(キャッシュしない), ENABLE_SELECTIVE(選択し
たもののみキャッシュ), DISABLE_SELECTIVE(選択したもののみキャッシュしない), UNSPECIFIED(プロバイ
ダーのデフォルト) から選択して指定する。指定しなかった場合は、 UNSPECIFIEDが適用される。
validation-mode
使用されるvalidationモードを指定する。AUTO, CALLBACK, NONE
properties
JPAエンジン固有のプロパティーを指定する。(※)
name
プロパティ名を指定する。
value
プロパティ値を指定する。
OpenJPA固有のプロパティはこちら → http://openjpa.apache.org/builds/2.0.1/apache-openjpa-2.0.1/docs/manual/manual.html#ref_guide_conf
WebSphere Application Server v7 Feature Pack Guide
60
30
Feature Pack for OSGi and JPA 2.0
【Tips】 DB接続と同期
‰
Entityが使用するデータベースはどこで指定するのか?
€
persistence.xmlで指定
App
App Server
Server
DB
DB Server
Server
EJB JAR
Order
Product
‰
persistence.xml
JNDI Namespace
<persistence-unit
name="JPATest">
<jta-data-source>
jdbc/JPADB
</jta-data-source>
</persistence-unit>
jdbc/JPADB
DB Name : JPADB
Server : db2node
Port
: 50000
JPADB
複数のDBをどう切り替えるか?
€
persistence unitで切り替え
persistence.xml
<persistence-unit
name="JPATest01">
<jta-data-source>
jdbc/JPADB01
</jta-data-source>
</persistence-unit>
クライアントA
@PersistenceContext(name="JPATest01", unitName="JPATest01")
EntityManager em01;
…
Employee employee = (Employee) em01.find(Employee.class,emp_Id);
<persistence-unit
name="JPATest02">
<jta-data-source>
jdbc/JPADB02
</jta-data-source>
</persistence-unit>
クライアントB
@PersistenceContext(name="JPATest02", unitName="JPATest02")
EntityManager em02;
…
Order order = (Order) em02.find(Order.class,order_Id);
JPADB01
JPADB02
61
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
設定ファイルの配置場所
‰
一般的な配置場所としては、META-INFの
下に配置
‰
Java EE (EJB)
‰
RADでは、JPAのエンティティをJPAプロジェク
トとして作成するため、以下の様な構成にな
る
EJB-JAR
├パッケージ
│ ├*.class
├META-INF
│ ├ejb-jar.xml
│ ├persistence.xml
‰
JavaEE(Web)
WAR-ROOT
├WEB-INF
│ ├classes
│ │ ├パッケージ
│ │ │ ├*.class
│ │ ├META-INF
│ │
├persistence.xml
│ ├lib
│ │ ├*.jar
│ ├web.xml
‰
EARとして
Exportとすると、
以下のような
構成になっている
JavaSE
任意のディレクトリ
├パッケージ
│ ├*.class
├META-INF
│ ├persistence.xml
WebSphere Application Server v7 Feature Pack Guide
62
31
Feature Pack for OSGi and JPA 2.0
JPA機能解説
ステップ3
ステップ3:クライアント・アプリケーションの作成
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
例外
JPQL
63
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
トランザクション
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
WebSphere Application Server v7 Feature Pack Guide
例外
JPQL
64
32
Feature Pack for OSGi and JPA 2.0
JPAトランザクション
‰
‰
‰
更新処理を行う場合、エンティティマネージャーはトランザクションに参加している
必要がある
トランザクションは以下の2種類
€
JTA(Java Transaction API)トランザクション
€
リソースローカルトランザクション
どちらが選択されるかは、パーシスタンス・ユニットの定義(persistent-unit)に
よって決定される。
€
JTAトランザクション
<persistence-unit name="JPATutorial“ transaction-type=“JTA”>
<jta-data-source>java:comp/env/JPAconn</jta-data-source>
・・・・・・
<persistence-unit name="JPATutorial">
€
リソースローカルトランザクション
<persistence-unit name="JPATutorial“ transaction-type=“RESOURCE_LOCAL”>
・・・・・・
<persistence-unit name="JPATutorial">
65
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JTAトランザクション
‰ JTAトランザクション
€
€
€
€
€
JTA(Java Transaction API)を使用する方法
persistence-unit の transaction-type に"JTA"を指定
jta-data-source にデータソースのJNDI名を指定する
JTAトランザクションを使用すると、その境界内で取得したエンティティマネー
ジャーーは自動的にそのJTAトランザクションに参加
境界外で取得したトランザクションマネージャーは、トランザクション境界内まで
持ち運び、joinTransactionメソッドを呼ぶことで参加できるようになる
JavaEEアプリケーションの実行スレッド
JavaEEアプリケーションの実行スレッド
EntityManager em = emf.createEntityManager();
UserTransaction.begin();
UserTransaction.begin();
JTAトランザクション
EntityManager em
= emf.createEntityManager();
UserTransaction.commit();
WebSphere Application Server v7 Feature Pack Guide
JTAトランザクション
em.joinTransaction();
UserTransaction.commit();
66
33
Feature Pack for OSGi and JPA 2.0
リソースローカルトランザクション
‰ リソースローカルトランザクション
€
€
€
€
リソースマネジャ(データベース)が持っているトランザクション管理機能を利用
する方法
persistence-unit の transaction-type に"RESOURCE_LOCAL"を指定
getTransactionでトランザクションを取得して、
javax.persistence.EntityTransactionインターフェースを通して利用する
提供されているメソッドは以下のとおり
„
„
„
„
„
„
void begin
void commit
void rollback
void setRollbackOnly
boolean getRollbackOnly
boolean isActive
67
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
エンティティマネージャーのライフサイクル
‰ 「コンテナ管理」のエンティティマネージャー
€
同一のJTAトランザクション内で取得したエンティティマネージャーは、同一の
エンティティマネージャー
‰ 「アプリケーション管理」のエンティティマネージャー
€
取得する度に異なるエンティティマネージャーが返される
‰ 従って、データの不整合や消失が起こらないように、どのエンティティ
マネージャーを使用しているのか意識する必要がある
アプリケーションの実行環境
エンティティ・マネージャーの種類
コンテナー管理の
エンティティ・マネージャー
アプリケーション管理の
エンティティマネージャー
選択可能なトランザクションタイプ
EJBコンテナー
Webコンテナー
Java SE
JTAトランザクション
○
○
N/A
JTAトランザクション
○
○
N/A
リソースローカルトランザクション
○
○
○
WebSphere Application Server v7 Feature Pack Guide
68
34
Feature Pack for OSGi and JPA 2.0
コールバックメソッドとエンティティリスナクラス
‰ コールバックメソッド
SQLを発行する前後でJPAエンジンによって呼び出されるメソッド
戻り値はvoidで引数なし
„
„
€
メソッド一覧
@PostLoad
@PrePersist
@PostPersist
@PreRemove
@PostRemove
@PreUpdate
@PostUpdate
„
„
„
„
„
„
„
SELECT発行後
INSERT発行前
INSERT発行後
DELETE発行前
DELETE発行後
UPDATE発行前
UPDATE発行後
‰ エンティティリスナ
コールバックメソッドを実装するための専用のクラス
コールバックメソッドをエンティティクラスとは別に定義することが出来る のでスッキリ
„
„
€
設定方法
@EntityListenersアノテーションを、コールバックの対象になるエンティティクラスに付与
„
69
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【図解】コールバックメソッドとエンティティリスナクラス
‰ コード例
エンティティクラス
@Entity
@EntityListeners(value = { EmployeeListeners.class })
@Table(name="EMPLOYEE",schema="DB2ADMIN")
public class Employee implements Serializable {
・・・・
}
エンティティリスナクラス
public class EmployeeListeners {
private static final long serialVersionUID = 1L;
@PostLoad
public void logAddition(Object pc) {
System.out.println("PostLoadを呼び出しました。");
}
}
WebSphere Application Server v7 Feature Pack Guide
70
35
Feature Pack for OSGi and JPA 2.0
機能解説:Query
‰ Entity永続化状態取得のためのインターフェース
€
€
Java Persistence Query Language (JPQL)を実行できる
以下の三種類がある
„
„
„
€
静的クエリー
動的クエリー
ネイティブ・クエリー
Entityに事前定義したクエリーの呼び出し
呼び出し側プログラムで整形したクエリーの実行
SQLの直接実行
新たに加わった機能
„
複数行の更新・削除 / JOIN / GROUP BY、HAVING、副照会・・・
„
名前付きパラメーターの使用
Queryインターフェースを介し
永続化状態取得を依頼
EntityManager
Query
レコードとの関連付け @Entity
Employee
select e from Employee e where e.phone like ‘1804%’
クライアント・プログラム
setEmp_Id()
setName()
@Id
getEmp_Id() emp_Id
getName() name
setPhone()
getPhone()
phone
setPhone()
getEmp_Id() emp_Id=111111
getName() name=Nakajima
setEmp_Id()
getPhone() phone=1804-1111
setName()
Query結果Employeeの
インスタンスを取得
71
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPQL
‰
JPQLとは
€
€
‰
JPQLの仕組み
€
€
€
€
‰
Java Persistence Query Language (JPQL) は、関係データベースに格納された
エンティティに対するクエリに使用される
文法的にはSQLに似ているが、データベースの表を直接操作するのではなく、エンティ
ティオブジェクトを操作するクエリ言語
JPQLの対象はエンティティクラス
JPQL文はJPAエンジンによって解釈される
JPAエンジンはエンティティクラスに記述されたアノテーション情報を元にクエリを発行
接続データベース固有のSQL文を組立てて発行する
JPQLによるネイティブクエリの利用
€
€
直接SQLを発行したい場合は、ネイティブクエリを使用可能
JPQLではネイティブクエリを利用する場合、SELECT,UPDATE,DELETEはできる
がINSERTはできない。なぜか?
„
INSERTはあくまでWHERE句を指定することのない1件毎の処理となるため、persist操作が実現してくれ
るため
WebSphere Application Server v7 Feature Pack Guide
72
36
Feature Pack for OSGi and JPA 2.0
JPQLによる検索
‰ JPQL
€
Queryインターフェースで使用されるEntity操作のための言語
„
SQLに似ているが、DBMSに依存しないポータビリティ
EJBQLの拡張
„
SELECT / UPDATE / DELETEがある
„
z
€
バルク更新やJOIN、GROUP BY、HAVING、副照会、名前付きパラメーターなど
例
select
select pp from
from Product
Product pp where
where p.price
p.price <=
<= 1000
1000
取得するオブジェクト
取得するオブジェクト
この場合「*」に相当
この場合「*」に相当
条件節
条件節
対象のEntity
対象のEntity
「p」は相対名
「p」は相対名
73
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Query 例
静的クエリー
静的クエリー
EntityにNamedQueryを定義
Employee
@Entity
@Entity
@Table(name="EMPLOYEE",schema=“JPATEST")
@Table(name="EMPLOYEE",schema=“JPATEST")
@NamedQuery(name="getMKEmployees",query="select
@NamedQuery(name="getMKEmployees",query="select ee from
from Employee
Employee ee where
where e.phone
e.phone like
like '1804%'")
'1804%'")
public
public class
class Employee
Employee implements
implements Serializable
Serializable {{
…
…
クライアントよりNamedQueryを指定して実行
…
…
public
public List<Employee>
List<Employee> findMKEmplStatic()
findMKEmplStatic() {{
Query
Query query
query == em.createNamedQuery("getMKEmployees");
em.createNamedQuery("getMKEmployees");
List<Employee>
List<Employee> employees
employees == query.getResultList();
query.getResultList();
return
return employees;
employees;
}}
…
…
EmpTaskImpl
動的クエリー
動的クエリー
クライアントよりQueryを作成して実行
EmpTaskImpl
…
…
public
public List<Employee>
List<Employee> findMKEmpDynamic()
findMKEmpDynamic() {{
String
String queryText
queryText == "select
"select ee from
from Employee
Employee ee where
where e.phone
e.phone like
like '1804%'";
'1804%'";
Query
Query query
query == em.createQuery(queryText);
em.createQuery(queryText);
List<Employee>
List<Employee> employees
employees == query.getResultList();
query.getResultList();
return
return employees;
employees;
}}
…
…
WebSphere Application Server v7 Feature Pack Guide
74
37
Feature Pack for OSGi and JPA 2.0
Criteria API
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
例外
JPQL
75
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Criteria APIとは?
‰
JPQLでの問題点
€
‰
JPQLでは、クエリーの文法はString型で指定しているので、文法のチェック
は行われずコンパイルは通っても実行時にエラーになるということがあった
Criteria API
€
€
€
€
€
JPA2.0で導入された新しいクエリの方法
Javaコンパイラーがコンパイル時に正当性を確認できる開発方法
MetaModel APIを使用してエンティティのMetamodelを作成する必要がある
JPQLの様に、文字列ベースでクエリーを組み立てるのではなく、オブジェクトベースの
javax.persistence.CriteriaQueryを組み立てる
実行時に動的にクエリーの組み立てが行われる
WebSphere Application Server v7 Feature Pack Guide
76
38
Feature Pack for OSGi and JPA 2.0
CriteriaQueryの作成手順 1/2
‰ エンティティメタクラスの作成
€
RADによる自動生成方法
„
„
プロジェクトのプロパティーから、Java Persistenceを選択
正規メタモデルのソース・フォルダーを選択
77
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
CriteriaQueryの作成手順 2/2
以下の流れでクエリーを組み立てる
‰
5.
EntityManagerからCriteriaBuilderを取得
CriteriaBuilderから、CriteriaQuery を生成
JPQLのFROMに相当するルートエンティティを作成
JPQLのWHEREに相当するCriteriaQueryのwhereメソッドで条件を指定
CriteriaBuilderのメソッドで詳細な条件を指定
6.
クエリーを実行
1.
2.
3.
4.
EntityManager
EntityManager em
em == getEntityManager();
getEntityManager();
[10/09/13
[10/09/13 14:26:59:546
14:26:59:546 JST]
JST] 0000001e
0000001e SystemOut
SystemOut
CriteriaQuery
CriteriaQuery == SELECT
SELECT ** FROM
FROM
OO EmployeeManager
EmployeeManager ::
CriteriaBuilder
①
CriteriaBuilder cb
cb == em.getCriteriaBuilder();
em.getCriteriaBuilder();
①
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: CriteriaBuilder
CriteriaBuilder == "+cb);
"+cb);
CriteriaQuery
②
CriteriaQuery cq
cq == cb.createQuery();
cb.createQuery();
②
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: CriteriaQuery
CriteriaQuery == "+cq);
"+cq);
Root<Employee>
③
Root<Employee> employee
employee == cq.from(Employee.class);
cq.from(Employee.class);
③
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: employee
employee == "+employee);
"+employee);
[10/09/13
OO EmployeeManager
[10/09/13 14:26:59:546
14:26:59:546 JST]
JST] 0000001e
0000001e SystemOut
SystemOut
EmployeeManager ::
CriteriaQuery1
CriteriaQuery1 == SELECT
SELECT ** FROM
FROM Employee
Employee ee WHERE
WHERE e.emp_Id
e.emp_Id == 101
101
cq.where(cb.equal(employee.get(Employee_.emp_Id),
cq.where(cb.equal(employee.get(Employee_.emp_Id), emp_Id_));
emp_Id_)); ④⑤
④⑤
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: CriteriaQuery1
CriteriaQuery1 == "+cq);
"+cq);
[10/09/13
OO EmployeeManager
[10/09/13 14:26:59:546
14:26:59:546 JST]
JST] 0000001e
0000001e SystemOut
SystemOut
EmployeeManager ::
query
query == SELECT
SELECT ** FROM
FROM Employee
Employee ee WHERE
WHERE e.emp_Id
e.emp_Id == 101
101
Query
Query query
query == em.createQuery(cq);
em.createQuery(cq);
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: query
query == "+query);
"+query);
List
List results
results == query.getResultList();
query.getResultList();
System.out.println("EmployeeManager
System.out.println("EmployeeManager :: results
results == "+results);
"+results);
⑥
⑥
return
return results;
results;
WebSphere Application Server v7 Feature Pack Guide
78
39
Feature Pack for OSGi and JPA 2.0
Bean Validation
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
例外
JPQL
79
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Bean Validation APIとは?
‰
Bean Validation API(JSR-303)登場の背景
€
€
€
‰
Bean Validation APIの特徴
€
€
€
‰
JPA2.0においては、Validationはオプショナル
Bean内でデータの検証を行うための標準化されたメソッドを提供
JPA 2.0, JCA 1.6, JSF 2.0など、Java EE 6の標準仕様と容易に統合可能
メリット
€
€
€
‰
多くのアプリケーションでは、ユーザーからの入力チェックを、カスタムコードで実装してい
た
カスタムコード実装では、コード量の増加および複数の層(プレゼンテーション層、ビジ
ネス層など)での重複実装の可能性に繋がる
これを解消するために、JavaBean内で標準化された形でデータの評価を行うために、
Bean Validationが登場
アプリケーションでValidation処理をコードする必要性を排除
Validationの重複の排除
JPAと容易に統合可能
FP for JPAにおけるBean Validation API
€
FPではBean Validation APIを提供していないため、別途構成が必要
WebSphere Application Server v7 Feature Pack Guide
80
40
Feature Pack for OSGi and JPA 2.0
FP for JPA でのBean Validation APIの構成
‰ Bean
Validation APIモジュールをダウンロードし、クラスパスに追
加
€
Hibernateなどからダウンロード可能
„
„
http://sourceforge.net/projects/hibernate/files/hibernate-validator/
validation-api-1.0.0.GA.jar
‰ JVMのシステムプロパティに、以下を設定
€
€
名前 :com.ibm.websphere.validation.api.jar.path
値
:配置したモジュール(validation-api-1.0.0.GA.jar)へのパス
‰ OSGiキャッシュクリアのために、コマンドラインから以下を実施
€
osgiCfgInit.[bat | sh] –all
81
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
Bean Validationの構成 – 3つのコンポーネント
‰
制約
€
€
‰
制約違反処理
€
€
‰
JavaBean内のフィールドのアノテーション もしくはMETA-INF/validation.xmlで指定
カスタムConstraintsも作成可能
Constraintに違反した場合、Exception が発生する
Exceptionをcatchする後処理のコードを記述する
評価
€
評価グループ
€
3つの評価モード(persistence.xmlで指定)
„
いつ、何を評価するかを規定
z
評価時の振る舞いを規定
„
Auto (デフォルト)
„
Callback
„
None
z
z
z
validation provider が利用可能である場合は自動でvalidationが行われる
常にvalidation が行われる。validation providerが利用不可能な場合はPersistenceExceptionが発生
Validationは行われない。 validation providerが利用不可能な場合でもPersistenceExceptionは発生しない
WebSphere Application Server v7 Feature Pack Guide
82
41
Feature Pack for OSGi and JPA 2.0
制約の設定
‰
制約の設定方法
€
アノテーションによる指定
€
制約アノテーションの一覧
„
フィールド/プロパティへのアノテーションとして指定する
„
@AssertTrue/AssertFalse(Boolean value)
„
@DecimalMax/DecimalMin(String value)
„
@Digits(int integer, int fraction)
„
@Future/Past()
„
@Max/Min(long value)
„
@Null/NotNull()
„
@Pattern(String regexp, Flag flags)
„
@Size(int min, int max)
z
z
z
z
z
z
z
z
Boolean
BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
Date, Calendar
BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
Object
String
String, Collection, Map, Array.length
83
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
例外
ステップ3:クライアントアプリケーションの作成
トランザクション
クエリー
クエリー
(DB2 PureQuery)
Bean Validation
Criteria API
WebSphere Application Server v7 Feature Pack Guide
例外
JPQL
84
42
Feature Pack for OSGi and JPA 2.0
例外
‰
JPAの例外
€ JPAではJPAエンジンにより以下の例外がスローされる。
€ いずれもPersistanceExceptionのサブクラスの非チェック例外
※SQLException のようなコンパイラによってcatchが強制されているわけではない
例外
説明
PersistenceException
永続プロバイダーからスローされる例外。
JPA例外のスーパークラス
TransactionRequiredException
トランザクションが要求されている
OptimisticLockException
楽観的ロックのコンフリクト発生
RollbackException
コミットが失敗した
EntityExistsException
エンティティがすでに存在する
EntityNotFoundException
エンティティが存在しない
NoResultException
Query.getSingleResult検索結果がない
NonUniqueResultException
Query.getSingleResultの結果が複数
85
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
JPA機能解説
ステップ4
ステップ4:その他設定
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
WebSphere Application Server v7 Feature Pack Guide
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
86
43
Feature Pack for OSGi and JPA 2.0
ロック・モード / 分離レベル / アクセス・インテント
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
87
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
アクセス・インテント
‰
アクセス・インテントとは?
€
‰
通常、persistence.xmlでの指定はアプリケーション単位で有効になるが、アプリケー
ションで指定したTaskName単位で分離レベルおよびロックレベルを指定する機能
(IBM拡張機能)
TaskNameとは?
€
€
アクセス・インテントの有効範囲を規定する単位
TaskNameの設定範囲は、
„
パーシスタンス・ユニット単位
„
トランザクション単位
„
照会インスタンス単位
z
z
z
‰
peristence.xmlのpersistence-unitのプロパティーとして設定
アプリケーションの中でTaskNameAccessor API を使用して設定
アプリケーションの中でTaskNameAccessor API を使用して設定
制約
€
ロック・モードがペシミスティックの場合に設定可能
JavaEEアプリケーションでのみ使用可能
照会以外のメソッドに対して設定可能
€
DB2でのみ使用可能
€
€
„
照会の場合は、照会ヒント・インターフェースで設定する
WebSphere Application Server v7 Feature Pack Guide
88
44
Feature Pack for OSGi and JPA 2.0
【参考】ロック・モードと分離レベル
‰
ロック・モード
€
オプティミスティック(楽観的)ロック
„
€
ペシミスティック(悲観的)ロック
„
„
‰
更新処理の開始時には排他ロックを取得せず、更新準備ができて実際のデータ更新時に対象データのタイムスタンプやバー
ジョンNoを取得し、開始時点との比 較により競合の有無を判断する手法
更新処理の開始時点から更新予定のデータに排他制御を掛け、排他が成功した場合に更新準備~実際の更新を行う手
法。
シンプルではあるが、ロック中は他のアクセスを排除するため、同時実行性が低い
分離レベル
„
„
トランザクションが複数同時に行われた場合に、どれほどの一貫性、正確性で実行するかを定義したもの
以下の4つがある
ISO標準
DB2 V9.7 でのレベル
説明
直列化
(SERIALIZABLE)
反復可能読み取り
(RR:Repeatable Read)
トランザクションが完全に実行を完了するまで、対象となったオブジェクトを完全
にロックし、ほかのトランザクションからのデータの挿入や更新を不可能にするモー
ド
再読み込み可能読み取り
(REPEATABLE READ)
読み取り固定
(RS:Read Stability)
トランザクションにおいて対象となるすべてのテーブルの対象データがトランザク
ション実行中に変更されないことを保証するモード
コミット済み読み取り
(READ COMMITTED)
カーソル固定 (デフォルト)
(CS:Cursor Stability)
コミット済みのデータしか読み取らないモード
非コミット読み取り
(READ UNCOMMITTED)
コミットされていない読み取り
(UR:Uncommited Read)
対象となるオブジェクトに対するトランザクションが完了していなくても、現在の最
新状態を読み取るモード
89
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【参考】OpenJPAにおけるロック・モード
‰
JPAにおけるロック・モード
„
„
€
org.apache.openjpa.kernel.LockManagerが制御
設定は、persistence.xmlの<openjpa.LockManager>プロパティで行う
指定可能項目は以下の4つ
„
mixed
z
z
„
オプティミスティック、ペシミスティック両方の振る舞いを許容する
どちらのモードが採られるかは、EntityManager もしくは Query のメソッドのプロパティーで指定する
pessimistic
z
z
z
ペシミスティック
SELECT FOR UPDATE ステートメントを付加
追加で、pessimisticであっても、VersionCheckOnReadLock およびVersionUpdateOnWriteLockversionオプショ
ンを付加することで、バージョンチェック/更新を行うように構成可能
○
„
version
z
z
z
z
„
<property name="openjpa.LockManager"
value="pessimistic(VersionCheckOnReadLock=true,VersionUpdateOnWriteLock=true)"/>
オプティミスティック
実際にデータが更新されていない場合でもバージョンの更新時にwriteロックがかかる
よって、分離レベルはread committed以上にする必要がある
(基本的には)ロックなしで読み取りの一貫性を確保する
none
z
ロックを行わない
WebSphere Application Server v7 Feature Pack Guide
90
45
Feature Pack for OSGi and JPA 2.0
【参考】OpenJPAにおける分離レベル
‰ JPAにおける分離レベル
„
„
JPAにおいては、デフォルトでJDBCドライバーの分離レベルに従う
デフォルトを変更するためには、persistence.xmlに設定を行う
z
€
<property name="openjpa.jdbc.TransactionIsolation" value="repeatable-read"/>
指定可能項目は以下の通り
„
default
„
none
„
read-committed
„
read-uncommitted
„
repeatable-read
z
z
z
z
z
„
JDBCの設定に従う。何も指定しなかった場合はこの設定が適用される
トランザクションの分離無し.
コミット済みのデータしか読み取らない
対象となるオブジェクトに対するトランザクションが完了していなくても、現在の最新状態を読み取る
トランザクションにおいて対象となるすべてのテーブルの対象データがトランザクション実行中に変更されな
いことを保証する
Serializable
z
トランザクションが完全に実行を完了するまで、対象となったオブジェクトを完全にロックし、ほかのトランザ
クションからのデータの挿入や更新を不可能にするモード
91
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
アクセス・インテントの設定
‰
設定
€
タスク名の設定
„
EJBの場合は、タスク名はトランザクションの開始時にデフォルトで自動的に設定される
z
„
€
Web コンテナーのコンテキストで JPA を使用している場合は、アプリケーションで TaskNameAccessor
API を使用して現在の実行スレッドに TaskName を設定する必要がある
persistence.xml にTaskNameに対応するインテントを指定
„
€
CMT セッション Bean でコンポーネントまたはビジネス・メソッドが呼び出されたとき、またはアプリケーションが BMT セッショ
ン Bean で sessionContext.getTransaction().begin() を呼び出したときに設定
<property name = "wsjpa.AccessIntent" value = "Tasks=' <taskName> { <entityName>
( <isolationLockValue> ) } ' "/>
ポイント
„
„
„
„
„
トークン間の空白は無視される
<isolation> および <readLock> コンテンツ以外は大/小文字を区別
<TaskName> は、com.acme.bean.MyBean.increment などの完全パッケージ修飾メソッド名のフォー
ムか、または MyProfile などの任意のユーザー定義のタスク名
<entityName> は、com.acme.bean.Entity1 などの完全パッケージ修飾クラス名のフォーム
ワイルドカード文字は「?」または「*」を <TaskName> および <entityName> で使用可能
z
„
„
„
“?” は任意の単一の文字を表し、「*」は 0 個以上の一連の文字列を表す
タスク定義では hintNames 分離および readLock が使用でき、その順番は関係なし
readLock の値が write の場合は、分離は repeatable-read または serializable にする必要がある
readLock の値が read の場合は、分離が read-uncommitted であれば無効となる
WebSphere Application Server v7 Feature Pack Guide
92
46
Feature Pack for OSGi and JPA 2.0
【参考】JPAにおけるデフォルトロックモード・分離レベル
‰ デフォルトで取得されるロックは?
€
ISOLATION LEVEL依存
クライアント
JPADB
…
public void updateAccount(int account_Id,double withdraw) {
Account account = (Account)em.find(Account.class.account_Id);
double currentAmount = account.getAmount();
SELECT
SELECT amount,
amount, date
date from
from JPATEST.ACCOUNT
JPATEST.ACCOUNT WHERE
WHERE account_Id
account_Id == ??
account.setAmount(currentAmount - withdraw);
account.setDate(currentTimestamp);
この間該当行にNSロックを取得している
}
UPDATE
UPDATE JPATEST.ACCOUNT
JPATEST.ACCOUNT SET
SET amount
amount == ?,
?, date
date == ?? WHERE
WHERE account_Id
account_Id == ??
‰ デフォルトのISOLATION
€
LEVELは?
V5.0以降のWASでは、データソースのデフォルトISOLATIONは
「TRANSACTION_REPEATABLE_READ」(DB2のRS)
Type
: Dynamic
Statementのイベントモニター
Operation: Execute
Section : 2
Creator : NULLID
パッケージ名「SYSXXNYY」のN部分を見る
パッケージ名「SYSXXNYY」のN部分を見る
Package : SYSSN300
00 == NC(コミットなし),
NC(コミットなし), 11 == UR,
UR, 22 == CS,
CS, 33 == RS,
RS, 44 == RR
RR
Consistency Token : SYSLVL01
この場合SYSSN300で「3」なのでISOLATIONはRS
Package Version ID :
この場合SYSSN300で「3」なのでISOLATIONはRS
Cursor
: SQL_CURSN300C2
Cursor was blocking: FALSE
Text
: UPDATE JPATEST.ACCOUNT SET amount = ? WHERE account_Id = ?
93
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
OpenJPA データ キャッシュ
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
WebSphere Application Server v7 Feature Pack Guide
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
94
47
Feature Pack for OSGi and JPA 2.0
データ / クエリー キャッシュ
‰ 概要
€
€
€
データ・ストアにアクセスする前に、キャッシュを確認
キャッシュへのデータの保管は、コミット時、およびデータのロード時に行われる
キャッシュの対象は、
„
„
データ
クエリー
‰ キャッシュの範囲
€
€
€
EntityManagerFactory から取得された全てのEntityManagerでキャッシュ
を共有
スタンドアロン環境では、キャッシュは、同一JVM内でのみ有効
分散環境においてキャッシュを共有するためには、イベント通知フレームワーク
を使用するか、または IBM® ObjectGrid などを統合する必要がある
‰ メリット
€
整合性は確保されるように出来ているので、コードの変更なしでパフォーマン
ス向上が期待できる
95
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
データキャッシュの設定 1/2
‰
設定
„
€
persistent.xml のプロパティ設定で行う
キャッシュ有効化
○
○
€
キャッシュサイズの設定
„
最大キャッシュサイズ:valueにCacheSize=サイズ を指定(デフォルトは1000、単位は個数)
„
オーバーフロー時のソフト参照設定:SoftReferenceSize =サイズを指定(デフォルト無制限)
○
z
<property name="openjpa.DataCache" value=true(CacheSize=5000)/>
無効化する場合は、0 を指定
○
€
<property name="openjpa.DataCache" value="true"/>
<property name="openjpa.RemoteCommitProvider" value="sjvm"/>
<property name="openjpa.DataCache" value="rue(CacheSize=5000 SoftReferenceSize=0)/>
無効化
„
時刻ベース
z
z
z
cronスタイルで時刻を設定する。
分、時間、月内の日付け、曜日 (日曜日の 1 で始まり、* (アスタリスク) 記号はすべての曜日を示す)
以下の例は、毎週日曜日の午後 3 時 45 分にキャッシュを削除
○
„
<property name="openjpa.DataCache" value="true(CacheSize=5000 SoftReferenceSize=0 EvictionSchedule='15,45 * *
1'")/>
期限ベース
z
キャッシュされてからの有効期限を指定。”+”に続き、分単位で指定する
○
<property name="openjpa.DataCache" value="true(CacheSize=5000 SoftReferenceSize=0 EvictionSchedule=‘+10'")/>
WebSphere Application Server v7 Feature Pack Guide
96
48
Feature Pack for OSGi and JPA 2.0
データキャッシュの設定 2/2
‰
設定
€
エンティティ個別の有効期限の設定
„
エンティティクラスに、@DataCacheアノテーションを追加し、ミリ秒単位で有効期限を指定
@Entity
@DataCache(timeout=10000)
public class Employee {
...
}
€
キャッシュ対象/非対象の設定
„
明示的にキャッシュ対象とするものは、Types で指定する
○
z
<property name="openjpa.DataCache" value="true(Types=foo.bar.FullTimeEmployee)"/>
明示的にキャッシュ対象外とするものは、 ExcludedTypesで指定する
○
<property name="openjpa.DataCache" value="true(ExcludedTypes=foo.bar.Person;foo.bar.Employee)"/>
97
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
【Tips】キャッシュの有効性検証
‰ 1つのエンティティに対して、key指定でfind操作を行った場合に、
キャッシュヒット/ミスでどれくらい差がでるのか?
€
5回の施行結果の平均でみると・・・
„
キャッシュヒット
„
キャッシュミス
z
z
€
93.6 msec
143.6 msec
1件の比較的軽めのオブジェクトで
さえ、1.5倍ほど処理時間が
かかっているため、可能であれば
積極的な使用を推奨
msec
160
キー指定による1件find結果
140
120
100
80
60
40
20
0
キャッシュヒット
WebSphere Application Server v7 Feature Pack Guide
キャッシュミス
98
49
Feature Pack for OSGi and JPA 2.0
クエリーキャッシュ
‰ 概要
€
€
照会結果(照会の実行で戻されたオブジェクト ID)をキャッシュ
実行時に使用される照会のプロパティーおよびパラメーターを基準にしてキー
を組み立て、キャッシュされている照会結果を検査し、キャッシュで検出される
と、キャッシュされて いる結果のオブジェクト ID が検索される
‰ ポイント
€
€
クエリーのアクセスパスにあるエンティティーが更新されると、クエリーのキャッシュ
は有効ではなくなる
エンティティーの更新の都度、クエリーキャッシュを走査するとパフォーマンス低
下に繋がるため、エンティティーの更新タイムスタンプを保持し、クエリーキャッ
シュのタイムスタンプと比較して、エンティティータイムスタンプの方が新しい場
合は、クエリーキャッシュを破棄
99
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
クエリーキャッシュ
‰ 設定
„
€
persistent.xml のプロパティ設定で行う
キャッシュ有効化
○
○
€
キャッシュサイズの設定
„
最大キャッシュサイズ:valueにCacheSize=サイズ を指定(デフォルトは100)
„
オーバーフロー時のソフト参照設定:SoftReferenceSize =サイズを指定(デフォルト無効)
○
z
<property name=" openjpa.QueryCache " value=true(CacheSize=100)/>
無効化する場合は、0 を指定
○
€
<property name="openjpa.QueryCache" value="true"/>
<property name="openjpa.RemoteCommitProvider" value="sjvm"/>
<property name=" openjpa.QueryCache " value="rue(CacheSize=100 SoftReferenceSize=0)/>
無効化
z
エンティティーの更新に伴うクエリーキャッシュの無効化をタイムスタンプ比較で行うために、以下を設定
○
<property name="openjpa.QueryCache" value="true(EvictPolicy='timestamp')"/>
WebSphere Application Server v7 Feature Pack Guide
100
50
Feature Pack for OSGi and JPA 2.0
WebSphere eXtreme Scaleとのキャッシュ統合
‰ WebSphere
€
€
€
eXtreme Scale(WXS)とは?
分散オブジェクトキャッシュ製品
Javaオブジェクトを分散して保管。JVM内でデータアクセスが完了するすため、
処理遅延が非常に少ないのと、スケール・アウト方式で拡張するため、高い
拡張性を保持しているのが特徴。
詳細は以下を参照
„
http://www.ibm.com/developerworks/wikis/display/extremescale/Home
‰ WXSを、JPAのサイドキャッシュとして利用可能
€
€
€
まず最初に対象データがWXSに
保管されているか確認
無ければオリジナルDBにアクセスする。
取得したデータはWXSにキャッシュとして保管
アプリケーションのコード変更無しで利用可能
JPAアプリケーション
JPADB
101
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
WebSphere eXtreme Scaleとのキャッシュ統合
‰ WXSの構成の方法には3つ
トポロジー・
タイプ
組み込みトポロジー
(EMBEDDED)
組み込みの区画化トポロジー
(EMBEDDED_PARTITION)
リモート・トポロジー
(REMOTE)
特長
各アプリケーションのプロセス内に
WXSサーバーを作成。キャッシュ・
データの量が少なく、1つのプロセスに
収まる場合に最も良く機能する。全
てのキャッ シュ読み取りがローカル・ア
クセスで非常に早い。
キャッシュ・データの量が多く、1つのプロ
セスに収まらない場合、データを複数の
プロセスに分割する。多くのキャッシュ読
み取りがリモートになるため、パ フォーマ
ンスは組み込みトポロジーほど高くない。
全てのキャッシュ・データを1つ以上の個
別のプロセスに保管する。大容量の
データを保管でき、アプリケーション・プロ
セスのメモリー使用を減らせる。全て の
キャッシュ・アクセスがリモートで行われる。
リモート構成は、アプリケーションから独
立して管理が必要。
イメージ図
詳細は、以下を参照
http://www.ibm.com/developerworks/jp/websphere/library/wxd/wxs71_cloud_datagrid/2.html
WebSphere Application Server v7 Feature Pack Guide
102
51
Feature Pack for OSGi and JPA 2.0
ロギング / 拡張トレース
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
103
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
IBM拡張トレース機能
‰ 概要
€
€
問題判別に役立つより詳細機能を拡張トレース として提供、WASのトレー
ス機能でJPA関連のトレースが取得できるというもの
IBM提供のパーシスタンス・プロバイダーのみで動作する
‰ 設定手順
€
トレース・エージェントを有効化する
„
„
€
汎用 JVM 引数 に以下を指定
-javaagent:<WASinstall path>/optionalLibraries/IBM/wsjpa/wsjpatrace.jar
以降、WASのトレース・オプションでJPA関連トレースが出力されるようになる。
WebSphere Application Server v7 Feature Pack Guide
104
52
Feature Pack for OSGi and JPA 2.0
取得可能カテゴリー
カテゴリー
該当するトレース・レベル
説明
JPA
OFF、 ALL、FINER、FINEST
JPA トレース・グループに拡張トレースを追加します。
openjpa.*
OFF、 ALL、FINER、FINEST
通常の OpenJPA トレース、および拡張トレースが有効である場合の OpenJPA のすべてのカ
テゴリーに対する拡張トレース。
openjpa.xtrace.*
OFF、 ALL、FINER、FINEST
拡張トレー スが有効である場合の OpenJPA のすべてのカテゴリーに対する拡張トレース。
openjpa.xtrace.Jdbc
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の OpenJPA JDBC クラスに対する拡張トレース。
openjpa.xtrace.Lib
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の OpenJPA ライブラリー・クラスに対する拡張トレース。
openjpa.xtrace.Persist
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の OpenJPA パーシスタンス・クラスに対する拡張トレース。
openjpa.xtrace.Kernel
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の OpenJPA カーネル・クラスに対する拡張トレース。
openjpa.xtrace.General
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の JDBC、ライブラリー、パーシスタンス、またはカーネルの各カ
テゴリーに含まれない OpenJPA クラスに対する拡張トレース。
openjpa.xtrace.ApiSpi
OFF、 ALL、FINER、FINEST
拡張ト レースが有効である場合の WsJPA、OpenJPA、および JPA に対して定義された、
公開 API/SPI インターフェースの拡張トレース。
105
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
IBM拡張 ツール群
ステップ4:その他設定
JPAアクセス・
インテント
XMLマッピング
WebSphere Application Server v7 Feature Pack Guide
OpenJPA
Data Cache
ロギング
JPA拡張トレース
便利ツール群
106
53
Feature Pack for OSGi and JPA 2.0
コマンドラインユーティリティー 1/2
‰ IBM実装のJPA2.0では、以下のユーティリティーを提供
„
€
RADV8提供のJPAツール群のコマンドライン版というイメージ
wsappid コマンド
„
複合主キーをIDクラスを実装して使用する場合(P57)、IDクラスの生成を自動を行うユー
ティリティー
z
€
wsenhancer コマンド
„
バイトコードをエンティティー・クラス・ファイルに挿入するためのユーティリティー。これにより、JPA
プロバイダーはエンティティーの状態を管理できるようになる。
z
€
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsappid.html
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsenhancer.html
wsmapping コマンド
„
エンティティー・オブジェクト・モデルをデータベース関係モデルにトップダウン方式でマッピングする
場合に有用なツール。エンティティークラス定義を読み込んでDB定義を自動的に実行する。
手動でのDB定義を行う必要が無くなり、省力化が図れる。
z
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsmapping.html
107
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
コマンドラインユーティリティー 2/2
‰ IBM実装のJPA2.0では、以下のユーティリティーを提供
„
€
RADV8提供のJPAツール群のコマンドライン版というイメージ
wsreversemapping コマンド
„
既存のデータベース・テーブルから、エンティティを生成するボトムアップ方式でマッピングを行う
場合に有用なツール。テーブル定義から、エンティティークラスを自動で生成する。コードを書く
必要が無くなり、省力化が図れる。
z
€
wsschema コマンド
„
データベース・スキーマと XMLファイルのマッチングを行うツール。データベース・スキーマをXML
形式で表示したり、XML スキーマをもとに既存データベースを構成したり出来る。
z
€
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsreversemapping.html
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsschema.html
wsdbgen コマンド
„
Java Persistence API (JPA) アプリケーションで pureQuery 機能を使用可能にするため
のユーティリティー。
z
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.mult
iplatform.doc/info/ae/ae/rejb_wsdbgen.html
WebSphere Application Server v7 Feature Pack Guide
108
54
Feature Pack for OSGi and JPA 2.0
IBM拡張
109
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
FPでのIBM拡張機能
‰ FPはOpenJPAをベースとして、以下の機能拡張が行われている
€
拡張されたトレースのサポート
„
€
€
€
「ロギング / 拡張トレース」を参照
バージョン ID の生成
ObjectGrid キャッシュ・プラグインのサポート
WebSphere 製品固有(アプリケーション開発およびデプロイメント用のツー
ル・セット)のコマンドおよびスクリプト
„
「IBM拡張 ツール群」を参照
€
翻訳済みメッセージ・ファイル
DB2® pureQuery フィーチャーを使用した静的 SQL のサポート
アクセス・インテントのサポート
€
XML マッピング
€
€
„
„
「ロック・モード / 分離レベル / アクセス・インテント」参照
「XMLマッピング」参照
WebSphere Application Server v7 Feature Pack Guide
110
55
Feature Pack for OSGi and JPA 2.0
OpenJPAとの相違点
‰ JPAプロバイダー
€
€
WebSphere Application Server の JPA プロバイダーは、
com.ibm.websphere.persistence.PersistenceProviderImpl
プロバイダーは、persistence.xmlで指定する。指定されていない場合は、
WAS管理コンソール内で設定する構成のデフォルトJPAプロバイダーが使用
される
‰ プロパティーの設定
€
€
€
openJPAのプロパティーは、接頭辞としてopenjpaが使用されるが、WAS
FP拡張のプロパティーに関しては、wsjpaが使用される
openjpaのプロパティーに関しては上記どちらを使用してもかまわないが、
WAS固有のプロパティーに関しては、wsjpaを使用する必要がある
WAS固有のプロパティーでopenjpa接頭辞を使用した場合は、警告メッ
セージが表示され、wsjpaとして処理される
111
WebSphere Application Server v7 Feature Pack Guide
Feature Pack for OSGi and JPA 2.0
参考資料
‰
IBM提供資料
€
InfoCenter:Feature Pack for OSGi Applications and JPA 2.0
„
€
InfoCenter:WebSphere eXtreme Scale Administration Guide
„
developerWorks:Integrating JPA and pureQuery: Leveraging DB2 static execution
for the Java Persistence API
€
developerWorks:Dynamic, typesafe queries in JPA 2.0
€
Forum:JPA 2.0 feature for IBM WebSphere Application Server V7 Feature Pack for
OSGi Applications and Java Persistence API 2.0 Open Beta
„
„
http://www.ibm.com/developerworks/websphere/techjournal/0812_wang/0812_wang.html
http://www.ibm.com/developerworks/java/library/j-typesafejpa/
http://www.ibm.com/developerworks/forums/forum.jspa?forumID=1843
OpenJPA
€
OpenJPA
„
‰
http://publib.boulder.ibm.com/infocenter/wxsinfo/v7r0/index.jsp?topic=/com.ibm.websphere.extremescale.ad
min.doc/welcome_admin.html
€
„
‰
http://publib.boulder.ibm.com/infocenter/wasinfo/fep/topic/com.ibm.websphere.jpafep.multiplatform.doc/info/
ae/ae/welcome_fepjpa.html
http://openjpa.apache.org/index.html
Hibernate
€
Bean Validation(Hibernate Validator)
„
http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html_single/
WebSphere Application Server v7 Feature Pack Guide
112
56
Fly UP