Kevin Sutterによるコメント: Java Persistence API 2.0 における更新

JSR-317 エキスパート・グループ (JSR-317) による JPA 2.0 仕様が完成に近づいています。そこでこの記事では、仕様の更新で加わった新たな概念と機能の一部を紹介します。また、これらの新機能を Apache OpenJPA プロジェクトで体験する方法についても説明します。Apache OpenJPA プロジェクトはオープンソースで堅牢、ハイ・パフォーマンス、そしてスケーラブルな JPA 仕様の実装です。この内容は IBM WebSphere Developer Technical Journal から抜粋したものです。

Kevin Sutter, Senior Software Engineer, IBM

Author photoKevin Sutter は、WebSphere Application Server 開発グループのシニア・ソフトウェア・エンジニアで、現在は WebSphere 対応の Java Persistence API 実装を指揮しています。彼は Apache OpenJPA プロジェクトの PMC コミッター兼メンバーでもあります。過去の職務として、JCA (J2EE Connector Architecture) および ObjectGrid (キャッシング・フレームワーク) を対象とした WebSphere ソリューションを指揮および設計した実績もあります。



2009年 9月 30日

さらなる改善を目指して

JPA (Java™ Persistence API) は Java EE (Java Platform Enterprise Edition) 5 で初めて、EJB (Enterprise JavaBean™) 3.0 仕様ファミリーの一部になりました。それ以来、JPA 1.0 は非常によく使われるパーシスタンス・フレームワークとなりました。この最初の仕様は非常に高い完成度で、十分な機能を持つものでしたが、必ず改善の余地があるものです。次期 JPA 仕様 (JPA 2.0) 策定の作業が現在、JSR 317 として行われています。

JPA エキスパート・グループは JPA 2.0 仕様の最終決定に向け、懸命の作業を続けています。この仕様の公開最終ドラフト (Public Final Draft # 2) が最近公開されており、最終的な JPA 2.0 仕様は 2010年 11月 16日に入手可能となる予定です。

「コメント行」コラムの 1 つの記事で JPA 2.0 仕様の新機能のすべてを紹介することはできません。そこでこの記事では新機能を簡単に紹介し、次にこれらの新機能をじかに体験するための方法として、Apache OpenJPA プロジェクトの利用についても説明します。


パーシスタンス

先ほど触れたように、最初の JPA 仕様は機能的に完成度の高いものでした。JPA 2.0 で導入された新機能の多く、特に O/R (object/relational) マッピングやドメイン・モデリングなどの領域での新機能は、「例外に近い」ケースに対応するためのものです。そうしたシナリオはレガシー・アプリケーションやレガシー・スキーマが原因で業界に存在していますが、通常の日常的なシナリオではありません。それ以外の重要な新機能、例えば Criteria API や、Bean 検証フレームワークの統合などは、これまでの JPA のパーシスタンス機能を強化したものとなっています。

では、これらの各機能を詳しく調べてみましょう。

  • O/R マッピングとドメイン・モデリング
    • JPA 2.0 に追加された新機能のいくつかは、O/R マッピングとドメイン・モデリングに関するものです。embeddables の定義と使い方が拡張され、embeddables のコレクション、ネストされた embeddables、他のエンンティティーとの関係を含む embeddables などが含まれるようになりました。もちろん、JPQL (Java Persistence Query Language) も更新され、こうした embeddableに関する強化をサポートしています。
    • JPA 2.0 では Access タイプ (@Access) も拡張され、パーシスタンス・タイプごとに、さらには個々の属性ごとに Access タイプを指定できるようになりました。これらの変更により、エンティティーの定義や、そうしたエンティティーを使用する関連アプリケーションの設計における柔軟性が向上します。
    • JPA 2.0 では、従来の OneToMany、ManyToOne、ManyToMany といったマッピングのサポートに加え、ElementCollections に対するマッピングのサポートが強化されています。こうしたマップ・コレクションの強化と関連して、MapKeyColumn、MapKeyClass、MapKeyJoinColumn 用のアノテーションもサポートされるようになりました。この点についても JPQL は更新され、これらの新しい構成体をサポートしています。
    • JPA 2.0 でのドメイン・モデリングに関するもう 1 つの新機能として、派生 ID (derived identity) を定義できるようになりました。これにより、ある 1 つのエンティティーの ID を別のエンティティーから派生させることができ、親子関係を作ることができます。JPA 2.0 仕様には派生 ID のシナリオについて数ページに渡る記述があります (セクション 2.4)。
  • JPA ランタイム

    JPA の基本的な API である EntityManagerFactoryEntityManagerQuery はいずれも、JPA 2.0 用に更新する必要がありました。幸いなことに、これらの更新はすべて上位互換性があるため、アプリケーションの観点からも JPA プロバイダーの観点からも、1.0 からの移行は非常にスムーズです。これらの API の更新は多くの場合、Metamodel API や Criteria API といった JPA 2.0 の重要な新機能を利用するために行われています (そうした新機能については、このすぐ後に説明します)。しかしそれ以外にも触れておく価値のあるランタイム機能として、次のようなものがあります。

    • JPA 2.0 の新機能の 1 つがペシミスティック LockManager の導入です。JPA 1.0 ではオプティミスティック・ロックのセマンティクスのみが定義されていましたが、実際のエンタープライズ・レベルのアプリケーションでは、もっと厳格なペシミスティック・ロック機能が必要になることがあります。ペシミスティック・ロックのセマンティクスを適用するためには、個々の EntityManager メソッドまたは Query メソッドの LockModeType を指定します。(Apache OpenJPA には以前、openjpa.LockManager プロパティーと ReadLockMode ヒントがあり、それらを使うと OpenJPA の中でペシミスティック・ロックのセマンティクスを詳細に構成することができました。)
    • ランタイムに関しての JPA 2.0 におけるもう 1 つの更新として、(キャッシュが利用可能な場合) JPA プロバイダーの Level2 キャッシュにアクセスできるようになりました。JPA 2.0 でも、JPA プロバイダーが実際に Level2 キャッシュを提供する必要はなく、また Level2 キャッシュのプラグイン方法や利用方法が JPA 2.0 に定義されているわけでもありません。ただしキャッシュを利用できる場合には、この新しい API と、関連アノテーションにより、Level2 キャッシュの内容を容易に管理することができます。(ところで、Apache OpenJPA は Level2 キャッシュのプラグインを提供しており、サードパーティーのキャッシュ実装が利用できるようになっています。)
  • Metamodel API と Criteria API

    JPA 2.0 に関して最も大きな話題になっている機能の 1 つが、Metamodel API と Criteria API の組み合わせです。Criteria API を利用すると、オブジェクト・ベースのクエリー・グラフを使ってプログラムでクエリーを作成することができます。Criteria API は JPQL を置き換え、また JPQL よりも動的です。つまりストリング・ベースのクラスとメソッドを使って JPQL の作成と操作を行う代わりに、Criteria API を使うことでプログラムによってクエリーの作成と操作ができるようになったのです。

    しかし Criteria API の真の強みは、タイプ・セーフであることです。そのため、実行時でないとエラーが検出できない標準的な JPQL 構成体に比べ、コンパイル時という大幅に早い段階で、エラーを検出することができます。タイプ・セーフ機能の根幹となるのが Metamodel API と Metamodel インターフェースです。Metamodel APIを使うと、パーシスタンス・ユニットのメタモデル情報に動的にアクセスすることができます。これらのメタモデル構成体は、静的に生成することも動的に生成することもできます。

  • Bean の検証

    Bean の検証をサポートしている点は JPA 2.0 のもう 1 つの重要な特徴であり、これは、コンテナー管理による環境とアプリケーション管理による環境の両方を対象としています。Bean の検証を利用すると、JSR-303 仕様で定義されたアノテーションと XML 制約、検証グループ、グループ・シーケンスを基に、オプションとしてエンティティーを検証することができます。PrePersist、PreUpdate、PreRemove に対する従来の JPA ライフサイクル・イベントを Bean 検証フレームワークへの入り口として利用することができます。また JPA プロバイダーは TraversableResolver も提供する必要があります。TraversableResolver を提供することで、管理対象オブジェクトの属性やエンティティー関係を取得するための計画が確実に実行されるようにします。


Apache OpenJPA

こうした JPA 2.0 のすばらしい新機能を、どのようにしたら体験できるのでしょう。JPA 2.0 仕様をオープンソースで開発するための作業が Apache OpenJPA プロジェクトであり、このプロジェクトは WebSphere Application Server の JPA ソリューションの基礎となっています。

OpenJPA 2.0 のロードマップを見るとわかるように、この開発作業は 2008年 12月から活発に行われています。いくつかの反復作業とマイルストーンが定義され、実現されてきました。最も新しく優れたバージョンが欲しい場合には、Nightly Driver も入手可能です。JPA 2.0 の Nightly Driver は十分な回帰テストが実施されているため、これらのドライバーを開発用に使う場合、安定性について心配する必要はありません。より確実なものが欲しい場合には、マイルストーン・ドライバーも作成されています。最新のマイルストーン・ドライバーは JPA 2.0 仕様の Early Access バージョンをベースにしています。JPA 2.0 Proposed Final Draft #2 が公開されれば、別のマイルストーン・ドライバーが作成されます。入手時期についての最新情報は OpenJPA のホームページまたは News ページを見てください。

OpenJPA 2.0 初期ドライバーで何が可能なのか

Apache OpenJPA Roadmap にドキュメント化された内容はどれも、開発用の資料として有用です。新しい機能が統合されるごとに、その新機能に対応する JUnit テストと関連ドキュメントも更新され、統合されています。おそらく、JPA 2.0 仕様、OpenJPA 実装、テスト・ケース、ドキュメントなどを調べることで、JPA 2.0 の新機能を試すための十分な背景情報を得られるはずです。

JPA 2.0 エキスパート・グループの動きを追ってきた人であれば、この仕様が常に変化していることをご存知でしょう。JPA 2.0 エキスパート・グループは仕様や関連 API を毎週のように変更しています。最終バージョンの公開日が近づくにつれ、その頻度は大幅に低下しているものの、このようにほとんど連続して変更が行われているため、OpenJPA 実装がエキスパート・グループの議事録と完全には同期しない可能性もあることに留意してください。そうした相違は最終仕様が JPA エキスパート・グループから公開されるまで発生する可能性があります。

OpenJPA コミュニティーでは、JPA 2.0 の新機能を試したユーザーからの意見を歓迎しています。潜在的なバグを見つけた場合や、誤った仕様解釈を見つけた場合、あるいはドライバーに関してその他のフィードバックがある場合は、ぜひ User メーリング・リストや Dev メーリング・リストに投稿してください。そうした意見を聞くことは有益です。当然ですが、明らかなバグを見つけた場合には、遠慮せず JIRA Issue を作成してください。OpenJPA 2.0 リリースを可能な限り完成度の高いものにするため、OpenJPA コミュニティーではユーザーからの早期のフィードバックを歓迎しており、また奨励しています。


パフォーマンスとデータベースのサポート

パフォーマンスは常に懸念事項として挙げられるものであり、特に OpenJPA 1.2.x のように安定したランタイム・ベースに今回のように多くの新機能が導入される場合にはなおさらですが、心配はありません。今回の新機能のパフォーマンス面や、これらの新機能が JPA 1.0 の既存機能に及ぼす影響は、常に監視されています。単にパフォーマンス低下を避けるのではなく、既存のコード・ベースのパフォーマンスを改善することも今回の目標の 1 つとなっています。もちろん、新機能のパフォーマンスの測定や監視も行われています。

また、データベース・サポートを絶えず改善し拡張することにも関心が注がれています。もちろん、IBM の立場としては、IBM DB2®、Informix®、Derby、さらには solidDB® に関しても、最高のサポートを目指しています。OpenJPA は Oracle と Microsoft® SQL Server もサポートしています。最近コミットされたバージョンでは、PostgreSQL とMySQL のサポートも改善されています。OpenJPA のドキュメントには、データベース・サポートの範囲に関しても概説されています。これら主要なデータベースに対しては、すべての新機能に確実に対応するよう、完全な OpenJPA 2.0 テスト・バケットが継続して実行されています。


まとめ

この記事が、JPA 2.0 および関連の Apache OpenJPA 2.0 実装に対して皆さんの興味をかき立てるものであったことを祈ります。JPA 2.0 全体としての作業は進行中ですが、仕様については最終バージョンの目標である 11 月に向けて固まりつつあります。そして JPA 2.0 仕様が最終決定され、公開されると間もなく、JPA 2.0 仕様に完全準拠した OpenJPA 2.0 のリリースが入手可能となるはずです。

参考文献

学ぶために

製品や技術を入手するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=517759
ArticleTitle=Kevin Sutterによるコメント: Java Persistence API 2.0 における更新
publish-date=09302009