2.2.1. Declaring an entity bean. エンティティBean宣言
<2.2.1. Declaring an entity bean | 目次 | 2.2.2.2. Declaring column attributes>
永続化するPOJOは エンティティBeanってことで、@Entity アノテーションを使うよ。(クラス定義につけてね)
@Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
@Entity は、クラスがエンティティだってことを定義するよ。@Id は、エンティティの識別子プロパティだってこと。他のマッピング定義は暗黙的につけられるよ。このデフォルト以外を設定するコンセプトは 新しいEJB3仕様の目玉なんだ。Flight クラスは Flight テーブルにマッピングされ、id カラムを主キーして扱うよ。
フィールドかメソッドにアノテートすることによって、勝手に Hibernate のアクセスタイプが、field か property になるよ。EJB3 仕様では、property アクセスを使うなら ゲッターメソッド、
filed アクセスならフィールドにアノテーションを宣言しないといけないよ。フィールドとメソッドの両方を混ぜることはよしたほうがいいよ。Hibernate は、@Id か @EmbeddedId の位置で、アクセスタイプを推測するよ。(訳注:つまり、@Idがフィールドについていれば、アクセスタイプはfield、ゲッターについていれば、propertyってことですね)
2.2.1.1. Defining the table テーブル定義
@Table はクラスにつけるよ。これは、エンティティBeanにテーブル、カタログ、スキーマ名をつけることができるよ。@Table がないと、デフォルトのテーブル名はエンティティのパッケージ名を含まないクラス名が使われるよ。
@Entity @Table(name="tbl_sky") public class Sky implements Serializable { ...
@Table は、必要があれば schema や catalog の属性をもつよ。また、@UniqueConstraint で、複数カラムのユニーク制約をかけられるよ。(単一カラムの場合は @Columnを見てね)
@Table(name="tbl_sky", uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})} )
この例のユニーク制約は、month と day のタプルとして適応されるよ。columnNames の配列は、論理カラム名にすることを気をつけてね。
論理カラム名は Hibernate NamingStrategy 実装で定義されるよ。デフォルトの EJB3 naming strategy は 物理カラム名を論理カラム名として使うよ。プロパティ名とは違うかもしれないので気を付けること。NamingStrategyを上書きしないかぎり心配要らないと思うけどね。
2.2.1.2. Versioning for optimistic locking 楽観ロックのためのバージョン付け
@Versionアノテーションを使って、エンティティBean に楽観ロックの機能をつけられるよ。
@Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } }
version プロパティは、OPTLOCK カラムにマッピングされて、エンティティマネージャーが更新の衝突検知に使うよ。
EJB3 仕様では、version カラムは数字とtimestampが使えるけど、数字がお勧め。Hibernate では UserVersionType を実装すればどんな型でもOK。
アプリケーションで、version をいじっちゃだめ。意図的に version を増やしたい場合は Hibernate Entity Manager のリファレンスで LockMode.WRITE をみることだよ。<2.2.1. Declaring an entity bean | 目次 | 2.2.2.2. Declaring column attributes>