3.4.5. 単一の関係関連のアノテーション
デフォルトでは、予期された関連するエレメントがデータベースにないため (関係カラムの間違った ID) Hibernate が関係を解決できない場合に、Hibernate で例外が発生します。これは、レガシーや不適切に保守されたスキーマに対して不都合な場合があります。
@NotFound アノテーションを使用して例外を発生させる代わりに Hibernate がこのようなエレメントを無視するよう要求できます。このアノテーションは @OneToOne (FK を使用)、@ManyToOne、@OneToMany、または @ManyToMany 関係で使用できます。
場合によっては、該当するエンティティが削除されたときにカスケードの削除をデータベースに委任したいことがあります。
この場合、Hibernate はデータベースレベルでカスケード削除制約を生成します。
外部キー制約 (Hibernate により生成される) は、非常に読み難い名前を持ちます。
@ForeignKey を使用することにより制約名をオーバーライドできます。
3.4.5.1. レイジーオプションとフェッチモード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
EJB3 には、レイジーロードとフェッチモードを定義する
fetch オプションが含まれますが、Hibernate にはさらに多くのこのようなオプションが設定されています。レイジーロードとフェッチ方針を調整するために、いくつかのアノテーションが導入されました。
@LazyToOne:@ManyToOne関係と@OneToOne関係に対してレイジーオプションを定義します。LazyToOneOptionはPROXY(プロキシベースのレイジーロードを使用)、NO_PROXY(バイトコード拡張ベースのレイジーロードを使用。ビルド時のバイトコード処理が必要)、またはFALSE(関係はレイジーではない) のいずれかになります。@LazyCollection:@ManyToMany 関係と@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) |