2.2.2. Mapping simple properties. 単純なプロパティのマッピング

目次

2.2.2.1. Declaring basic property mappings. Basicプロパティマッピング宣言

エンティティBeanの、@Transientが付いていない、staticでもtransientでもない全てのプロパティ(フィールドでもメソッドでも)は永続化するとみなされるよ。アノテーションが付いてないプロパテxは、@Basic アノテーションと一緒だよ。明示的に @Basic アノテーションを書くとプロパティのフェッチ戦略を宣言できるよ。

public transient int counter; //transient property

private String firstname; //persistent property

@Transient
String getLengthInMeter() { ... } //transient property

String getName() {... } // persistent property

@Basic
int getLength() { ... } // persistent property

@Basic(fetch = FetchType.LAZY)
String getDetailedComment() { ... } // persistent property

@Temporal(TemporalType.TIME)
java.util.Date getDepartureTime() { ... } // persistent property           

@Enumerated(EnumType.STRING)
Starred getNote() { ... } //enum persisted as String in database

transient フィールドの counter、@Transient のメソッドアノテーションが付いている lengthInMeter は エンティティマネージャーに無視されるよ。name、length、firstname プロパティは永続化対象で、イーガーフェッチ*1になるよ(普通のプロパティのデフォルト)。 detailedComment プロパティの値は、遅延フェッチになるよ。関連とかのプロパティじゃないと、普通は遅延は必要ないよ。

注意
プロパティレベルの遅延フェッチは、クラスがインストールされていないといけないよ。Hibernate リファレンスドキュメント見てね。もし、クラスがインストールされていない場合は、遅延ローディングは無視されるよ。

お勧めは、EJB-QLかクライテリアクエリーの射影機能を使う方法だよ。
EJB3Hibernate でサポートされてる全ての基本型(基本的なJavaの型*2、それぞれのラッパー、直列化可能なクラス)のプロパティマッピングをサポートしているよ。Hbernate アノテーションは、数字でも文字列でも、どっちのカラムでも Enum型を使えるよ。デフォルトは数字だけど、@Enumerated アノテーションで上書きできるよ。さっきの例の note プロパティを見てね。

普通の Java API では、一時的という精度はないよ。一時的なデータを扱うときに、データベースに合わせた精度が欲しいかもしれないよね。一時的なデータは、DATE とか TIME とか TIMESTAMP を持つことができるよ(実際は、日付だったり、時間だけだったり、その両方とかね)。そういうときは、@Temporal アノテーションを使うとよいよ。

@Lob は、プロパティの型によって Blob か Clob になるよ。java.sql.Clob、Character、charjava.lang.String だったら Clob、java.sql.Blob、Byte、byte 、または 直列化可能な型は Blob になるよ。

@Lob
public String getFullText() {
    return fullText;
}

@Lob 
public byte[] getFullCode() {
    return fullCode;
}

プロパティが java.io.Serializable を実装して、基本型じゃなくて、@Lob アノテートされてないなら、Hibernate の serializable 型が使われるよ。

*1:関連するオブジェクトを全て一度に読み込む

*2:たぶん、プリミティブ型のこと