EJB 3.0(Public Draft)入門記 Java Persistence API Chapter2 その3

昨日は入門記を進めることなくうっかり寝てしまいました。久しぶりに3日連続更新ができてたのにー。
今日は Chapter2 その3です。2.1.3 Entity Instance Creation からです。

2.1.3 Entity Instance Creation

エンティティのインスタンスはnewで生成される。インスタンス生成時はまだ永続的でない。永続化はEntityManagerのAPIによって行われるそうです。

2.1.4 Primary Keys and Entity Identity

エンティティはプライマリキーをもたねばいけないそうです。

プライマリキーについてのルールが3点あります。

  • 単純な(複合でない)プライマリキーはエンティティクラスの単一のフィールドもしくはプロパティに対応しなければいけない。
  • 複合プライマリキーは単一のフィールドもしくはプロパティに対応するか、フィールドやプロパティのセットに対応しなければいけない。
  • プライマリキークラスが複合プライマリキーをあらわすために定義されなければいけない。

プライマリキー(もしくは複合プライマリキーのフィールドやプロパティ)は次の型のうちのどれかでなければいけないらしいです。ただ浮動小数点の型はプライマリキーとして使うべきでないとあります。必要だからあるんだと思うんですが日付型ってプライマリキーにする場合があるんですねー。

  • 各種primitive型
  • 各種primitiveのラッパー
  • java.lang.String
  • java.util.Date
  • java.sql.Date

複合プライマリキーに適用されるルールには次のものがあります。

  • プライマリキークラスはpublicでpublicな引数なしコンストラクタをもたなければいけない。
  • access=PROPERTYならばプライマリキークラスのプロパティはpublicかprotectedでなければいけない。 
  • プライマリキークラスはserializableでなければいけない。
  • プライマリキークラスはequalsとhashCodeメソッドを定義しなければいけない。これらのメソッドの等価性のセマンティクスはキーがマップされるデータベースの型の等価性と一致しなければいけない。
  • 複合プライマリキーは埋め込み可能クラスとしてマップされるか、エンティティクラスの複数のフィールドやプロパティにマップされるかのどちらかだ。
  • もし複合プライマリキーがエンティティクラスの複数のフィールドやプロパティにマップされるならば、プライマリキークラスとエンティティクラスでフィールドやプロパティの名前を合わせておかねばならない。プライマリキークラスとエンティティクラスで別々のアクセスタイプ(PROPERTY or FIELD)を使ってもよい。
  • アプリケーションはプライマリキーの値を変更してはいけない。その場合の挙動は定義されていない。

2番目のルールはなんか変な感じがします。access=PROPERTYならばアクセッサー経由でアクセスするからプロパティはprivateにしろっていうならわかるんですけど。あと、複合プライマリキーを使うならばプライマリキークラスを絶対作らなければいけないというのが意外でした。作ってもいいけど作らなくてもいいという選択肢があるのかと思ってました。
複合プライマリーキーについてのルールはなんとなくわかったんですが使い方がいまいちイメージできないです。そろそろ動かして確認してかないとダメですねー。

2.1.5 Embeddable Classes

Embeddable Classは埋め込み可能クラスと訳してみます。
埋め込み可能クラスはエンティティに埋め込まれるためのクラスです。特徴としては

  • エンティティの状態を表す細粒度のクラス
  • 永続的アイデンティティをもたない
  • 埋め込まれる対象のエンティティにのみ属しエンティティ間で共有されない
  • 永続的アイデンティティをもたないため、エンティティと一緒に(データベースに)マップされる

いまいちわかりにくいなぁ。前回のコメントでid:aufhebenさんが教えてくれたhttp://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?EmbeddedValueを見るとイメージがつかめます。
埋め込み可能クラスは複合プライマリキーを表すものとして使うかいくつかのフィールドやプロパティをグループ化したいときに使うのでしょう。ビジネスメソッドをもつのもOKなのかな?

2.1.6 Mapping Defaults for Non-Relationship Fileds or Properties

リレーションシップのプロパティ以外の永続的プロパティやフィールドがChapter 9で定義されているアノテーションでアノテートされていない場合は次のDefaultのマッピングルールが適用されるそうです。

  1. フィールドやプロパティの型が@Embeddableのアノテーションをもつクラスならば、@Embeddedとしてマップされる。
  2. フィールドやプロパティの型が次のものならば@Basicとしてマップされる。

アノテーションがなくて上記のルールが適用されない場合はエラーだそうです。
@Basicなんていうアノテーションがあるんですね。

今日はこれくらい。次回は 2.1.7 Entity Relationships。