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 関係に対してレイジーオプションを定義します。LazyToOneOptionPROXY (プロキシベースのレイジーロードを使用)、NO_PROXY (バイトコード拡張ベースのレイジーロードを使用。ビルド時のバイトコード処理が必要)、または FALSE (関係はレイジーではない) のいずれかになります。
  • @LazyCollection: @ManyToMany 関係と @OneToMany 関係に対するレイジーオプションを定義します。LazyCollectionOption は TRUE (コレクションはレイジーであり、ステータスがアクセスされたときにロードされます)、EXTRA (コレクションはレイジーであり、すべての操作はコレクションロードを回避しようとします。これは、すべてのエレメントのロードが必要でない場合に巨大なコレクションに対して特に役に立ちます)、または FALSE (関係がレイジーでない) のいずれかになります。
  • @Fetch: 関係をロードするのに使用されるフェッチ方針を定義します。FetchMode は、SELECT (セレクトは関係をロードする必要がある場合にトリガされます)、SUBSELECT (コレクションに対してのみ利用可能。サブセレクト方針を使用。詳細については、Hibernate リファレンスドキュメンテーションを参照)、または JOIN (SQL JOIN を使用して所有者エンティティをロードしつつ関係をロードします) のいずれかになります。JOIN は任意のレイジー属性をオーバーライドします (JOIN 方針を使用してロードされた関係はレイジーにできません)。
Hibernate アノテーションは EJB3 フェッチオプションをオーバーライドします。
表3.3 同等のレイジーおよびフェッチオプション
アノテーションレイジーフェッチ
@[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)
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.