20

私の理解@OneToOneでは、@ManyToOneJPA アノテーションはeagerフェッチを行います。これらをアプリケーションに遅延ロードするか、少なくともそれをほのめかしたい(これが休止状態のデフォルトです)。注釈を追加し始めましたfetch = FetchType.LAZY

例えば

@ManyToOne(optional = false, fetch = FetchType.LAZY)

それ以外の

@ManyToOne(optional = false)

これは面倒であり、エラーが発生しやすい作業でもあります。アプリケーションレベルでこれを行う方法はありますか? おそらくpersistence.xmlで?

4

4 に答える 4

19

今日まで、アノテーションを介したマッピングに関して、Hibernate を JPA 仕様に準拠させることを選択しました。単純に、Hibernate を構成可能にするための機能要求を受け取っていないためです。これは驚くべきことでした。ご指摘のとおり、Hibernate 3.0 以降では、hbm.xmlマッピング ファイルを使用するときに必要な設定がデフォルトになっています。

別の回答が示唆しているように、構成を介してこれを許可しても仕様に違反しません。

要するに、今日は不可能です。構成可能にしたい場合は、機能リクエストを作成してください。

于 2012-10-02T14:34:46.233 に答える
6

JPA 仕様では、一般に、ほとんどのアプリケーションではデフォルトでシングルトン リレーションが熱心である必要があるのに対し、複数値リレーションはデフォルトでレイジーである必要があると想定しています。少なくとも私自身の経験では、これは一般的に望ましいアーキテクチャです。シングルトン関係は、外部キーでシングルトン結合を作成するために JPA レイヤーと DB レイヤーで大幅な追加パフォーマンスを必要としないため、これは理にかなっています。ただし、それとは対照的に、多値属性は N + 1 問題または大きなデカルト結果セットのいずれかを作成し、コレクション内の要素の数と結合フェッチが使用されるときに結合の数が増加するにつれて、指数関数的に膨張します (ただし、Hibernate は特に結合フェッチを処理できません)。 2 つ以上の熱心な関連付け)。

そうは言っても、あなたの提案に関しては、特定の(正直なところ、まったく珍しいことではない)ケースに対処する必要があります。今は 1 つのケースしかありませんが、そのようなケースは何百もあります。したがって、仕様を記述するには、一般化と粒度の間に線を引く必要があります。

もし私があなたの立場で、これが絶対に便利な機能で JPA 仕様に追加されると思うなら、私はそれを JCP に提出します。一方、特定の実装でこれ (、あれ、あれ...) に対処すると、いわゆるベンダーロックインに陥ります。したがって、@ManyToOne @OneToOne 属性に遅延フェッチを設定し、ベンダーフリーを維持するために余分な時間を費やします。したがって、Hibernate (または任意の実装) よりも 15 倍以上高速な新しい JPA 実装が登場した場合、仕様に固執することによって使用)、プロジェクトを新しい JPA 実装に移行するのにほとんどまたはまったく労力はかかりません。

于 2012-10-05T21:36:21.940 に答える
3

ありえない。JPA仕様でグローバルフェッチ戦略を変更することについては何もありません。JPA は 1-1/N-1 アソシエーションの EAGER フェッチを提供しますが、1-N/MN の場合は LAZY です。すべての JPA 実装は、準拠するために仕様に従う必要があります。アプリケーション開発者がこのデフォルトの動作をグローバルに変更できない方がよいと思います.1-1 のように、すべてのエンティティ間の関連付けが 1 種類だけでない限り、これらはほとんどの場合のベスト プラクティスだからです。アプリケーションで「EAGER」に設定できることを考えてみてください。このアプリケーションには、複雑な関係とデータベース内の何百万ものデータを持つ非常にリッチなエンティティ モデルが含まれています。アソシエーションごとにフェッチ戦略を手動でオーバーライドすることで、開発者は次に何が起こるかについて責任を負うことができます。エラーが発生しにくく、代わりに強力な機能です。

于 2012-10-02T13:09:48.980 に答える
1

私の理解から、 @oneToOne および @ManyToOne JPA アノテーションは熱心なフェッチを行います。

JPA は、アノテーションまたは永続化 XML 内で宣言されていない限り、単一値のリレーションシップでのeager-loading を保証します。Collection-valued リレーションシップの場合、デフォルトで遅延読み込みになりますが、遅延読み込みは (単なる) JPA をサポートする永続化プロバイダーへのヒントであるため、依存することはできず、特定のプロバイダー (Hibernate、OpenJPA など) を確認する必要があります。詳細については、このリンクを参考にしてください。

于 2012-10-05T12:18:35.240 に答える