【コラム】

Java API、使ってますか?

51 EJBから独立したJava Persistence 2.0

51/60

JSR 317: Java Persistence 2.0

JSR 317: Java Persistence 2.0」はJavaオブジェクトの永続化のためのAPIで、JSR 220: Enterprise JavaBeans 3.0(EJB 3.0)の一部として標準化されていたJava Persistence API 1.0(JPA 1.0)の後継バージョンにあたる。2.0からはEJBから完全に独立したJSRとして仕様の策定が進められており、EJBのアップデートであるEJB 3.1とともにJava EE 6で採用される予定。

※ JSR 317の名称は「Java Persistence 2.0」だが、Early Draftでは従来と同じ「Java Persistence API 2.0」になっており、またスペックリードのLinda DeMichiel氏もJavaOneにおけるセッションで「Java Persistence API 2.0」の名称を使っていた。最終的にどちらが正式名称になるのはいまいちはっきりしない。

JPA 1.0はもともとEJB 3.0のリリース直前に単体のAPIとして分割された経緯があり、オプションの機能が多く、標準化が十分だとは言えなかった。そこで2.0では新機能の追加よりも既存機能の補完やオプション機能の標準化に重点を置いており、より柔軟な永続化を実現することが目標となっている。

Java Persistence 2.0の要点についてはこの記事を参照して欲しい。現在はJSR 317のEarly Draftが公開されたほか、JavaOneにおけるセッションなどによって同APIで拡張される機能のうちいくつかの概要が明らかになったので、今回はその主たるもの紹介したい。

コレクションのサポート強化

Java Persistence 2.0では@ElementCollectionというアノテーションが追加され、これによってコレクションで指定されたフィールドの値を主テーブルに関連付けられた"コレクションテーブル"に格納することができるようになる。たとえばリスト1のようなエンティティの場合、データベース上にはPERSONとは別にPERSON_NICKNAMEというコレクションテーブルが用意され、nickNameに格納されたデータはPERSON_NICKNAMEに永続化される。この例での場合、PERSON_NICKNAMEはPERSONに関連付けるPERSON_SSNと、nickNameのデータを表すNICKNAMESという2つのカラムを持つという。

リスト1 コレクションオブジェクトの永続化

@Entity
public class Person {
    @Id protected String ssn;
    protected String name;
    protected Date birthDate;

    @ElementCollection
    protected Set nickNames;
}

コレクションテーブルは@CollectionTableや@Columnなどのアノテーションによってカスタマイズできる。たとえばリスト2.2のようにすると、テーブル名はALIASES、カラム名はALIASになる。

リスト2 コレクションテーブルのカスタマイズ

@Entity
public class Person {
    @Id protected String ssn;
    protected String name;
    protected Date birthDate;

    @ElementCollection
    @CollectionTable(name="ALIASES")
    @Column(name="ALIAS")
    protected Set nickNames;
}

Embeddableタイプについてもコレクションがサポートされ、基本型と同様に@ElementCollectionアノテーションで指定できる。コレクションテーブルのカスタマイズは、@CollectionTableでテーブル名を指定できる点は同じだが、カラム名の指定は@AttributeOverrideというアノテーションを用いてリスト3のように行う。この例では、streetフィールドの値がHOME_STREETというカラムに格納される。

リスト3 Embeddableタイプのコレクション

@Entity public class RichGuy extends Person {
    @ElementCollection
    @AttributeOverride(name="street", column=@Column(name="HOME_STREET"))
    protected Set<Address> vacationHomes;
}

@Embeddable public class Address {
    protected String street;
    protected String city;
    protected String state;
}

なお、Embeddableタイプについてはコレクション関連の機能以外にも、EmbeddableクラスがEmbeddableなフィールドを持つような構成のサポートや、ManyToOne/OneToOne/OneToMany/ManyToManyといったリレーションシップのサポート、@AssociationOverrideアノテーションによるリレーションシップのカスタマイズが可能になるなど、大幅な拡張が行われる予定だ。

一般化(Generalize)されたMapのサポート

Java Persistence 2.0のMapでは、Genericsを用いてキーと値のそれぞれに基本型、Embeddableタイプ、エンティティを使用することができる。また@ElementCollectionを指定することもでき、コレクションテーブルは@CollectionTableや@AttributeOverrideによってカスタマイズ可能となっている。たとえばリスト4はキーにMovieエンティティ、値にIntegerを指定している。この場合、VIDEOSTORE_VIDEOINVENTORYというコレクションテーブルが作成され、そのVIDEOINVENTORY_KEYカラムがMOVIEテーブルに関連付けられる。

リスト4

@Entity
public class VideoStore {
    @Id int id;
    String name;
    Address location;

    @ElementCollection
    Map videoInventory;
}

@Entity
public class Movie {
    @Id int id;
}

ソートされたリストのサポート

JPA 1.0エンティティのフィールドがListである場合、@OrderByアノテーションを指定することでデータベースから取得した結果を自動的にソートすることができる。しかしこれはあくまでも検索結果に対するソートであって、ソート結果が永続化に反映されるわけではない。

2.0では@OrderColumnというアノテーションが追加された。これを指定したフィールドは自動的にソートされ、それが永続化に反映される。@OrderColumnはone-to-manyまたはmany-to-manyなフィールドに対して使用し、@OrderByと併用することはできない。

悲観的ロックのサポート

JAP 1.0における並列処理は楽観的ロック(Optimistic lock)のみをサポートしている。2.0からは悲観的ロック(Pessimistic Lock)、すなわち更新したいリソースを照会した時点からロックを保持する機構がサポートされる。このためロックモード(LockModeType)は従来のREAD/WRITEに

  • OPTIMISTIC
  • OPTIMISTIC_FORCE_INCREMENT
  • PESSIMISTIC
  • PESSIMISTIC_FORCE_INCREMENT
  • NONE

の5種類が追加されるとなる。OPTIMISTICとOPTIMISTIC_FORCE_INCREMENTは、それぞれREAD、WRITEと同じ意味だとのこと。ただし、これらの名称はまだ確定ではないそうだ。

この新しいロック機構のために、EntityManagerクラスやQueryクラスの関連するメソッドに修正が加えられるほか、@NamedQueryアノテーションにlockMode要素が追加される。また、javax.persistence.lock.timeoutによってロックの設定のためのヒントが提供されるとのことだ。

悲観的ロックの処理においてデッドロックが発生した場合にはPessimisticLockExceptionがスローされる。またタイムアウトが発生した場合にはLockTimeoutExceptionかPessimisticLockExceptionがスローされる。LockTimeoutExceptionではステートメントのロールバックが行われ、PessimisticLockExceptionではトランザクションのロールバックが行われるという。

ロードマップ

今回公開されたEarly DraftはO/Rマッピングやモデリング、ランタイムAPIなどにフォーカスされたものだった。今後はクエリーの部分にフォーカスし、次回のドラフトに組み込んでいく予定とのことである。

なお、JSR 317の参照実装にはEclipseプロジェクトによる永続化フレームワークである「EclipseLink」が採用されることが決定している。同実装はGlassFish V3とともに利用できるようになる予定だ。

51/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。

関連キーワード


人気記事

一覧

イチオシ記事

新着記事