2.4. Hibernate Annotation 拡張機能

Hibernate 3.1 は EJB 3 エンティティと組み合わせたり、適合したりできるさまざまな追加のアノテーションを提供します。これらは、EJB3 アノテーションの適切な拡張機能として設計されています。
EJB3 機能を強化するために、Hibernate は Hibernate 機能に一致する固有のアノテーションを提供します。org.hibernate.annotations パッケージには、すべてのアノテーション拡張機能が含まれます。

2.4.1. エンティティ

EJB3 仕様で提供されるもの以外にも Hibernate によりエンティティに対して実行される一部のアクションを調整できます。
@org.hibernate.annotations.Entity は、標準的な @Entity で定義されたもの以外に必要になる可能性がある追加のメタデータを追加します。
  • mutable: このエンティティが変更可能であるかどうか
  • dynamicInsert: 挿入にダイナミックな SQL を可能にする
  • dynamicUpdate: 更新にダイナミックな SQL を可能にする
  • selectBeforeUpdate: オブジェクトが実際に変更されない限り、Hibernate が SQL UPDATE を実行しないように指定します。
  • polymorphism: エンティティポリモーフィズムが PolymorphismType.IMPLICIT (デフォルト値) または PolymorphismType.EXPLICIT であるかどうか
  • optimisticLock: オプティミスティックロッキング方針 (OptimisticLockType.VERSION、OptimisticLockType.NONE、OptimisticLockType.DIRTY、または OptimisticLockType.ALL)

注記

@javax.persistence.Entity は必須であり、@org.hibernate.annotations.Entity を置き換えるものではありません。
いくつかの追加 Hibernate アノテーション拡張機能を以下に示します。
@org.hibernate.annotations.BatchSize を使用すると、このエンティティのインスタンスをフェッチするときにバッチサイズを定義できます (@BatchSize(size=4) )。指定されたエンティティをロードするときに、Hibernate はすべての同じタイプの初期化されていないエンティティをバッチサイズまでの永続コンテキストでロードします。
@org.hibernate.annotations.Proxy はエンティティのレイジー属性を定義します。レイジー (デフォルトで true に設定される) は、クラスがレイジーであるかどうかを定義します。proxyClassName はプロキシを生成するのに使用するインターフェースです (デフォルトはクラス自体です)。
@org.hibernate.annotations.Where は、このクラスのインスタンスの取得時に使用されるオプションの SQL WHERE 句を定義します。
@org.hibernate.annotations.Check は、DDL ステートメントで定義されたオプションのチェック制約を定義します。
結合サブクラス上の @OnDelete(action=OnDeleteAction.CASCADE): 通常の Hibernate メカニズムの代わりに削除時にSQL カスケード削除を使用します。
@Table(appliesTo="tableName", indexes = { @Index(name="index1", columnNames={"column1", "column2"} ) } ) は、テーブル tableName のカラムに対して定義されたインデックスを作成します。これは、プライマリテーブルまたは任意のセカンダリテーブルに適用できます。@Tables アノテーションを使用すると、さまざまなテーブルにインデックスを適用できます。@javax.persistence.Table または @javax.persistence.SecondaryTable が実行された場合に、このアノテーションが期待されます。

注記

@org.hibernate.annotations.Table@javax.persistence.Table に置き換わるものではなく補完するものです。特にテーブルのデフォルト名を変更する場合は、@org.hibernate.annotations.Table ではなく @javax.persistence.Table を使用する必要があります。
また、@org.hibernate.annotations.Table はセカンダリテーブルの以下のエレメントを定義するためにも使用できます。
  • fetch: JOIN に設定されている場合 (デフォルト)、Hibernate は内側の結合を使用してクラスまたはスーパークラスにより定義されたセカンダリテーブルを取得し、サブクラスにより定義されたセカンダリテーブルには外側の結合を使用します。セレクトに設定されている場合、Hibernate はサブクラスで定義されたセカンダリテーブルに対して順次選択を使用します (これは行がサブクラスのインスタンスを表す場合にみ行われます)。内側の結合は、クラスとそのスーパークラスにより定義されたセカンダリを取得するために使用されます。
  • inverse: true の場合、Hibernate はこの結合により定義されたプロパティを挿入または更新しません。デフォルトでは false に設定されます。
  • optional: 有効な場合 (デフォルト) は、この結合により定義されたプロパティが null ではなく、常に外側の結合を使用してプロパティを取得するときにのみ Hibernate が行を挿入します。
  • foreignKey: プライマリテーブルを参照するセカンダリテーブルの外部キーを定義します。
@Immutable は、エンティティまたはコレクションを変更不可としてマークします。変更不可のエンティティはアプリケーションによって更新できません。これにより、Hibernate を使用して若干のパフォーマンス最適化を行えます。変更不可エンティティの更新は無視されますが、例外がスローされます。@Immutable はルートエンティティで使用する必要があります。コレクションに配置された @Immutable はコレクションを変更不可にします。つまり、コレクションに対する追加および削除は許可されません。この場合は、HibernateException がスローされます。
@Persister を使用すると、独自のカスタム永続方針を定義できます。たとえば、独自の org.hibernate.persister.EntityPersister のサブクラスを指定したり、ストアドプロシージャコール、フラットファイルに対するシリアル化、LDAP などを使用した永続化を実装するインターフェース org.hibernate.persister.ClassPersister の完全に新しい実装を提供したりできます。
@Entity @BatchSize(size=5) @org.hibernate.annotations.Entity( selectBeforeUpdate = true,
      dynamicInsert = true, dynamicUpdate = true, optimisticLock = OptimisticLockType.ALL, polymorphism =
      PolymorphismType.EXPLICIT) @Where(clause="1=1") @org.hibernate.annotations.Table(appliesTo="Forest", indexes = {
      @Index(name="idx", columnNames = { "name", "length" } ) } ) @Persister(impl=MyEntityPersister.class) public class
      Forest { ... }
@Entity @Inheritance( strategy=InheritanceType.JOINED ) public
      class Vegetable { ... }

@Entity
@OnDelete(action=OnDeleteAction.CASCADE)
public class Carrot extends Vegetable { ... }