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かクライテリアクエリーの射影機能を使う方法だよ。
EJB3 は Hibernate でサポートされてる全ての基本型(基本的なJavaの型*2、それぞれのラッパー、直列化可能なクラス)のプロパティマッピングをサポートしているよ。Hbernate アノテーションは、数字でも文字列でも、どっちのカラムでも Enum型を使えるよ。デフォルトは数字だけど、@Enumerated アノテーションで上書きできるよ。さっきの例の note プロパティを見てね。
普通の Java API では、一時的という精度はないよ。一時的なデータを扱うときに、データベースに合わせた精度が欲しいかもしれないよね。一時的なデータは、DATE とか TIME とか TIMESTAMP を持つことができるよ(実際は、日付だったり、時間だけだったり、その両方とかね)。そういうときは、@Temporal アノテーションを使うとよいよ。
@Lob は、プロパティの型によって Blob か Clob になるよ。java.sql.Clob、Character、char、java.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 型が使われるよ。