EJB 3.0(Public Draft)入門記 Java Persistence API Chapter4 その1

最近更新滞ってるなぁ。

Chapter 3以前の内容でまだ気になることが若干あるのですがChapter 4に進んじゃいます。いずれ気が向いたら試してみたいと思います。


Chapter 4 Query Language

Chapter 4はQuery Languageというタイトルで、EJB QLの説明です。Java Persistence APIEJB外でも使用可能なのでEJB QLという名称はしっくりこないんですけど。新しい名称にすればいいのになぁ。

EJB QLの簡単な説明があります。

  • EJB QLで特定のデータベースに依存しない可搬性の高いクエリが書ける
  • 前バージョンのEJB QLの機能に加えてバルクUpdate/Delete、JOIN操作、GROUP BY、HAVING、射影、サブクエリなどが使える。
  • EJB QLは静的にも動的にもつかえる。パラメータも渡せる。

動的なクエリって何を指しているのかよくわかりません。単にプログラム内でクエリ文字列の連結ができるってことを言っているだけなのかも。何度も強調しているような気がするんですが前バージョンのEJB QLではできなかった(たぶん)からアピールしてるのかな。

4.1 Overview

結構EJB 2.1のEJB QLについて触れられていますが、そのあたりはちょっと省いちゃおう。(興味がないというのもありますが使ったことがなくてよくわからんのです...)

EJB QLはメタデータを介してあらわされる動的なクエリや静的なクエリのための問い合わせ言語です。EJB QLはたとえばSQLなどデータベースや他の永続ストアの言語にコンパイルされるそうです。このため、実行時のエンティティのステートをあらわすオブジェクトに対してクエリを実行するのではなく、データベースによって提供されるネイティブな言語を使うように変換されたクエリを実行することが可能だそうです。結果として、クエリのメソッドを最適化しなおかつポータブルにすることができるとか。

EJB QLってSQLだけでなく他の永続ストアの言語もターゲットにしているんですね。


EJB QLはエンティティの抽象永続スキーマ(the abstract persistence schema)をつかいます。抽象永続スキーマとは永続スキーマを抽象化したもの、つまりエンティティやエンティティのステートやエンティティのリレーションシップのことでEJB QLの操作対象になるものを指しているようです。で、EJB QLは永続スキーマの抽象化(エンティティとか)に対するクエリをエンティティがマップされたデータベースのクエリに変換するということです。

EJB QLを使ったクエリの中ではエンティティの抽象永続スキーマ型が使われます。抽象永続スキーマ型とは4.3節にで詳しく説明されていますが、どうやらエンティティクラスのフィールドやプロパティのことらしいです。データベースでつかわれるvarcharやintegerなどの型を抽象化したものということ?

「抽象永続スキーマ」とか「抽象永続スキーマ型」とかなじみがない言葉が出てきてひるみましたが、あんまりたいしたこと言ってないのかも。


クエリを作成するにあたってルールがあるようで、ひとつのクエリに含めるエンティティたちは同じ永続ユニット(persistence unit)に属していないといけないといっているような気がします(このあたり理解が怪しい)。
永続ユニットとはアプリケーションによってグループ化されるクラスの集合を定義するものです。このときグループ化されたクラスは単一のデータベースにいっしょにマッピングされなければいけないらしいです。


EJB QLの使われ方が載っているのですが、3つのうち2つがEJB 2.1の話になっています。EJB 3.0 を含めたJava Persistence APIではQuery APIを使えばいいみたいです。


4.1 Overview終わり。