InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

Java Persistence 2.0 最終ドラフト提案

作者 Charles Humble , 翻訳者 鰈崎 義之 投稿日 2009年6月2日

セクション
運用/インフラ,
デベロップメント,
設計/アーキテクチャ
トピック
データアクセス ,
Java
タグ
JPA

原文(投稿日:2009/5/27)へのリンク

最終ドラフト提案の段階になった Java Persistence API(JPA) バージョン2.0は、クライテリアクエリのAPIとメタモデルAPIとBean Validation[JSR 303]のサポートを追加する重要な仕様への更新だ。

 JPA実装が解析する文字列に埋め込まれたJPA-QLの代わりに、クライテリアクエリAPIではJavaオブジェクトのメソッドを呼び出すことでクエリの作成ができる。最初の公開ドラフトでは、文字列ベースのAPIしかなかった。そのため、提案に対する型安全性を向上する可能性を探るように勧める、多くのフィードバックがExpert Groupに寄せられた。Gavin King氏は、既存の文字列ベースのAPIの上に構築し、アプリケーションにおけるそれぞれの永続クラスのメタモデルの型を自動的に生成するのに、Java 6付属のjavax.annotation.Processorを利用するという、提案に応じた。 Genericsと組み合わせて、このメカニズムは、クラスのメソッドとフィールドのための型安全なメタモデルがJavaで不足してることへの、実効的な回避策を提供する。理解することがかなり困難で、一般的に特定のIDEサポートを要求するコードを生成する傾向があるので、コードジェネレータが使われるといつも賛否両論となる。けれどもこの場合は、型情報のためだけにコードが生成されるので、コードをかなりきれいに保つことができる。例えば、次のような永続クラスが与えられると、

import java.util.Set;
import java.math.BigDecimal;
@Entity public class Order {
    @Id Integer orderId;
    @ManyToOne Customer customer;
    @OneToMany Set lineitems;
    Address shippingAddress;
    BigDecimal totalCost;
...
}

対応する正規化されたメタモデルクラス、Order_ は以下のようになる。

import java.math.BigDecimal;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Set;
import javax.persistence.metamodel.TypeSafeMetamodel;
import javax.annotation.Generated;
@Generated
@TypeSafeMetamodel
public class Order_ {
    public static volatile Attribute<Order, Integer> orderId;
    public static volatile Attribute<Order, Customer> customer;
    public static volatile Set<Order, Item> lineitems;
    public static volatile Attribute<Order, Address> shippingAddress;
    public static volatile Attribute<Order, BigDecimal> totalCost;
}

 

アノテーションプロセッサはJava 6に含まれているので、この変更は特定のIDEサポートも必要としない。– IDEはコンパイラによって起動されるアノテーションプロセッサに委譲でき、メタモデルはオンザフライに生成される。

メタモデルの永続状態と永続ユニット(persistence unit)の管理対象クラスの関連へ、動的にアクセスするインタフェースの仕様を定めた、API経由でメタモデルは検索される。 オブジェクト/リレーショナルマッピング情報へのアクセスはまだサポートされていないが、将来のアップデートで計画されている。 インタフェースは永続プロバイダによって実装され、EntityManagerFactory.getMetamodel と EntityManager.getMetamodelメソッド経由でアクセスできる。これらのメソッドは、javax.persistence.metamodel.Metamodelインタフェースを実装する、永続プロバイダの実装クラスを返す。

King氏は、CriteriaQueryとQueryの両方に型パラメータを追加することでクエリ結果セットへの型安全性を拡張する、さらなるリファクタリングを最近提案した。 これにより、型安全なリストのエントリやラッパーへの直接アクセスを開発者に提供する。しかし現在javax.persistence.Queryは型パラメータを持っていないので、JPA 1.0ベースのプロジェクトではコンパイラー警告を起こしてしまう。

型安全アプローチはExper Group内でもよく議論となりがちだった。 文字列と型安全アプローチとの比較について、JPA2.0仕様のリードであるLinda DeMichiel氏は、彼女のブログで以下のように書いている。

"文字列ベースのAPIと比較したメタモデルベースのAPIについてのプラスとマイナスを多く議論した後、私たち[Expert Group]は型安全APIを採用することを決定しました。しかし開発者が望むなら、文字列ベースのアプローチを使うことができるオプションを用意しました。"

二つのオプションの主な違いは、文字列ベースの属性名は、JOINやナビゲーションの属性参照を指定する方法として使われることだ。結果的にクエリは、型安全バージョンと同じ意味を持つが、同じレベルの型安全性は無い。

JPA 2.0は Java PersistenceアプリケーションにおけるBean Validation [JSR 303] 利用のサポートも定義している。管理対象クラス (エンティティ、マップされたスーパクラス、埋め込み可能なクラス) は、Bean Validation制約に設定することができる。pre-persist、pre-update、pre-removeのエンティティライフサイクルイベント上のBean Validation実装に、Java Persistenceアプリケーションが妥当性確認を委譲することを指定することにより、これらの制約を利用する自動妥当性確認は実現される。

Expert Groupはコミュニティからのフィードバックを待ち望んでいる。フィードバックはjsr-317-pfd-feedback@sun.com に送ることができる。

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。