3.4.5. 単一の関係関連のアノテーション
デフォルトでは、予期された関連するエレメントがデータベースにないため (関係カラムの間違った ID) Hibernate が関係を解決できない場合に、Hibernate で例外が発生します。これは、レガシーや不適切に保守されたスキーマに対して不都合な場合があります。
@NotFound
アノテーションを使用して例外を発生させる代わりに Hibernate がこのようなエレメントを無視するよう要求できます。このアノテーションは @OneToOne
(FK を使用)、@ManyToOne
、@OneToMany
、または @ManyToMany
関係で使用できます。
@Entity public class Child { ... @ManyToOne @NotFound(action=NotFoundAction.IGNORE) public Parent getParent() { ... } ... }
場合によっては、該当するエンティティが削除されたときにカスケードの削除をデータベースに委任したいことがあります。
@Entity public class Child { ... @ManyToOne @OnDelete(action=OnDeleteAction.CASCADE) public Parent getParent() { ... } ... }
この場合、Hibernate はデータベースレベルでカスケード削除制約を生成します。
外部キー制約 (Hibernate により生成される) は、非常に読み難い名前を持ちます。
@ForeignKey
を使用することにより制約名をオーバーライドできます。
@Entity
public class Child {
...
@ManyToOne
@ForeignKey(name="FK_PARENT")
public Parent getParent() { ... }
...
}
alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent
3.4.5.1. レイジーオプションとフェッチモード
EJB3 には、レイジーロードとフェッチモードを定義する
fetch
オプションが含まれますが、Hibernate にはさらに多くのこのようなオプションが設定されています。レイジーロードとフェッチ方針を調整するために、いくつかのアノテーションが導入されました。
@LazyToOne
:@ManyToOne
関係と@OneToOne
関係に対してレイジーオプションを定義します。LazyToOneOption
はPROXY
(プロキシベースのレイジーロードを使用)、NO_PROXY
(バイトコード拡張ベースのレイジーロードを使用。ビルド時のバイトコード処理が必要)、またはFALSE
(関係はレイジーではない) のいずれかになります。@LazyCollection
:@ManyTo
Many 関係と@OneToMany
関係に対するレイジーオプションを定義します。LazyCollectionOption はTRUE
(コレクションはレイジーであり、ステータスがアクセスされたときにロードされます)、EXTRA
(コレクションはレイジーであり、すべての操作はコレクションロードを回避しようとします。これは、すべてのエレメントのロードが必要でない場合に巨大なコレクションに対して特に役に立ちます)、または FALSE (関係がレイジーでない) のいずれかになります。@Fetch
: 関係をロードするのに使用されるフェッチ方針を定義します。FetchMode
は、SELECT
(セレクトは関係をロードする必要がある場合にトリガされます)、SUBSELECT
(コレクションに対してのみ利用可能。サブセレクト方針を使用。詳細については、Hibernate リファレンスドキュメンテーションを参照)、またはJOIN
(SQL JOIN を使用して所有者エンティティをロードしつつ関係をロードします) のいずれかになります。JOIN
は任意のレイジー属性をオーバーライドします (JOIN
方針を使用してロードされた関係はレイジーにできません)。
Hibernate アノテーションは EJB3 フェッチオプションをオーバーライドします。
アノテーション | レイジー | フェッチ |
---|---|---|
@[One|Many]ToOne](fetch=FetchType.LAZY) | @LazyToOne(PROXY) | @Fetch(SELECT) |
@[One|Many]ToOne](fetch=FetchType.EAGER) | @LazyToOne(FALSE) | @Fetch(JOIN) |
@ManyTo[One|Many](fetch=FetchType.LAZY) | @LazyCollection(TRUE) | @Fetch(SELECT) |
@ManyTo[One|Many](fetch=FetchType.EAGER) | @LazyCollection(FALSE) | @Fetch(JOIN) |