3.2. JPA アノテーションとのマッピング
EJB3 エンティティはプレーンな POJO です。実際には EJB3 エンティティの概念は Hibernate 永続エンティティの概念とまったく同じです。マッピングは JDK 5.0 アノテーションを使用して定義されます (オーバーライド用の XML 記述子の構文は EJB3 仕様で定義されます)。アノテーションは、論理マッピングアノテーション (オブジェクトモデルやクラスの関連付けなどの定義を可能にします) と物理マッピングアノテーション (物理スキーマ、テーブル、カラム、インデックスなどを定義します) の 2 つのカテゴリに分けることができます。以下のサンプルコードで両方のカテゴリのアノテーションを組み合わせます。
EJB3 アノテーションは
javax.persistence.*
パッケージに含まれます。ほとんどの JDK 5 準拠 IDE (Eclipse、IntelliJ IDEA、Netbeans など) では、アノテーションインターフェースと属性をユーザーのために自動的に補完します (EJB3 アノテーションがプレーンな JDK 5 アノテーションであるため、固有の "EJB3" モジュールがない場合であっても)。
具体的かつ実践的な例については、JBoss EJB 3.0 チュートリアルを参照するか、Hibernate Annotations テストスイートを確認してください。ほとんどのユニットテストは、具体的な例を示し、さまざまなアイデアを提供するよう設計されています。
3.2.1. エンティティ Bean の宣言
バインドされた各永続 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
は、クラスをエンティティ Bean (永続 POJO クラスなど) として宣言し、@Id
はこのエンティティ Bean の ID プロパティを宣言します。他のマッピング宣言は暗黙的です。例外概念に よるこの設定は新しい EJB3 仕様の中心部となるもので、主要な改善となっています。クラス Flight は Flight テーブルにマップされており、カラム id をそのプライマリキーカラムとして 使用します。
フィールドまたはメソッドをアノテートするかどうかに応じて、Hibernate で使用されるアクセスタイプは
field
または property
になります。EJB3 仕様では、アクセスするエレメントタイプ (たとえば、property
アクセスを使用する場合は getter メソッド、field
アクセスを使用する場合はフィールド) に対してアノテーションを宣言する必要があります。フィールドとメソッドの両方で EJB3 アノテーションを使用することは避けてください。Hibernate は、@Id
または @EmbeddedId
の位置からアクセスタイプを推測します。
3.2.1.1. テーブルの定義
@Table
はクラスレベルで設定されます。@Table
を使用すると、エンティティ Bean マッピングのテーブル、カタログ、およびスキーマ名を定義できます。@Table
が定義されていない場合は、デフォルト値 (エンティティの非完全クラス名) が使用されます。
@Entity @Table(name="tbl_sky") public class Sky implements Serializable { ...
@Table
エレメントには、schema
属性と catalog
属性も含まれます (これらの属性を定義する必要がある場合)。また、@Table
(単一のカラムにバインドされた一意の制約用、@Column
を参照) とともに @UniqueConstraint
アノテーションを使用することにより、テーブルに対して一意の制約を定義することもできます。
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}
)
一意の制約は組の月、日に適用されます。
columnNames
アレイは論理カラム名を参照することに注意してください。
3.2.1.2. オプティミスティックロッキングのバージョン機能
@Version
アノテーションを使用してエンティティ Bean にオプティミスティックロッキング機能を追加できます。
@Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } }
バージョンプロパティは
OPTLOCK
カラムにマップされ、エンティティマネージャはバージョンプロパティを使用して競合するアップデートを検出します ( 最後のコミットを優先 (last-commit-wins) 方針で発生する可能性があるアップデートの損失を回避します)。
バージョンカラムは数値 (推奨するソリューション) または EJB3 仕様ごとのタイムスタンプになります。適切な
UserVersionType
を定義および実装した場合、Hibernate はすべての種類をサポートします。
アプリケーションは Hibernate で設定されたバージョン番号を絶対に変更すべきではありません。バージョン番号を人為的に増やす場合は、Hibernate Entity Manager のリファレンスドキュメンテーションである
LockMode.WRITE
を参照してください。