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>