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