EJB 3.0(Proposed Final Draft)入門記 Java Persistence API Chapter8

あけましておめでとうございます。

残念ながらというか予想通りというか、去年の間にEJB 3.0 Public Draftの入門記終わりませんでしたよ...
Proposed Final Draftが出ちゃいましたので、Chapter 8からはProposed Final Draft版に入門していこうと思います。でも、Embeddable EJB 3.0(というかHibernate?)ってProposed Final Draftにはまだ対応していないみたいだし、動かして確認というのは難しそう。Glass Fish(というかTopLink?)はすでにProposed Final Draftに対応済みなのかなぁ。まぁ、とりあえず、Chapter 8に関しては興味のあるところを中心にさっと進めてしまいます。

Chapter 8 Metadata Annotations

Chapter 8はアノテーションの説明です。Chapter 9のタイトルが「Metadata for Object/Relational Mapping」なので、Chapter 8 は O/Rマッピング以外のアノテーションってところでしょうか?

8.1 Entity

Proposed Final DraftではEntityアノテーションからaccessType要素がなくなってます。accessType要素でわざわざ指定しなくてもインスタンス変数とgetterどちらでも注釈可能ってことだと思います。そういえばセッションBeanだとaccessTypeのようなものを指定せずにインスタンス変数とsetterメソッドどっちにも注釈できるから、こっちのほうが統一感があっていいかも。

@Target(TYPE) @Retention(RUNTIME)
public @interface Entity {
  String name() default "";
}

8.2 Callback Annotations

Proposed Final DraftではEntityListenerアノテーションがEntityListenersアノテーションに変わりました(複数形になったということです)。Listenerがひとつのときでも複数のときでもこれを使えばいいということですね。

@Target({TYPE}) @Retention(RUNTIME)
public @interface EntityListeners {
  Class[] value();
}

Proposed Final DraftではExcludeSuperclassListenersアノテーションとExcludeDefaultListenersアノテーションが追加されています。

@Target({TYPE}) @Retention(RUNTIME)
public @interface ExcludeSuperclassListeners {
}
@Target({TYPE}) @Retention(RUNTIME)
public @interface ExcludeDefaultListeners {
}

ExcludeSuperclassListenersはスーパークラスで指定されているエンティティリスナを除外することを示すために使うみたい。ExcludeDefaultListenersはデフォルトのエンティティリスナを除外するために使うみたいです。デフォルトのエンティティリスナというのは、永続ユニットに属する全部のエンティティに適用されるリスナのことを言い、これはXMLで指定できるようです。Excludeという字面からこれとこれを除外すると指定できるのかなと思ったんですが、アノテーションでクラスを指定できないので全部を対象とするんですね。

8.3 Annotations for Queries

Proposed Final DraftではFlushModeTypeからNEVERがなくなってます。

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface FlushMode {
  FlushModeType value() default AUTO;
}

public enum FlushModeType {
  COMMIT,
  AUTO
}

AUTOはトランザクションコミット時とクエリ実行前にflushしてCOMMITはトランザクションコミット時にだけflushします。


Proposed Final DraftではNamedQueryアノテーションとNamedNativeQueryアノテーションにQueryHintを指定できるようになっています。前はQueryインタフェースでだけ指定できたんですがアノテーションでも指定可能ということですね。ちなみにQueryHintというのはDBに対するヒントじゃなくて永続プロバイダ(Hibernateとか)に対するヒントだそうです。


あと、この節で説明されているアノテーションは次の通り。アノテーションとしては特に変更がないみたいですが使い方には変更点があるみたいです(3.5.6 SQL Queriesに変更が多く入っているようなので)。今のところ興味がないので詳しく追っかけません。

  • SqlResultSetMapping
  • EntityResult
  • FieldResult
  • ColumnResult

8.4 References to EntityManager and EntityManagerFactory

8.4.1 PersistenceContext Annotation

PersistenceContextアノテーションはコンテナ管理のEntityManagerを利用するときに使います。このアノテーションは何回か使ってきました。変更点はないようです。

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface PersistenceContext{
  String name() default "";
  String unitName() default "";
  PersistenceContextType type default TRANSACTION;
}
public enum PersistenceContextType {
  TRANSACTION,
  EXTENDED
}
  • name要素には環境参照コンテキストから識別されるために使われる名称を指定します。DIが使われるならば不要です。
  • unitName要素には永続ユニットの名称を指定します。persistence.xmlに指定する名前のことですね。参照するスコープに複数の永続ユニットがある場合は指定必須です。
  • type要素には永続コンテキストのタイプを指定します。

アノテーションのTargetにTypeが含まれているんですね。どういうときに使うんでしょう?


PersistenceContextsアノテーションはこんな感じなんです。

@Target(TYPE) @Retention(RUNTIME)
public @interface PersistenceContexts{
  PersistenceContext[] value();
}

PersistenceContextが複数かぁ。うーん、使いどころがわからない...

8.4.2 PersistenceUnit Annotation

PersistenceUnitアノテーションはEntityManagerFactoryを利用するときに使います。そんなに使うときはなさそうな気がします。
PersistenceUnitsアノテーションはやっぱり使いどころがわからないです。