web-dev-qa-db-ja.com

JPAのデフォルトのフェッチタイプ

私の理解から@OneToOneおよび@ManyToOne JPAアノテーションはeagerフェッチを実行します。私はこれらをアプリケーションに遅延ロードするか、少なくともそれについてヒントを与えたいです(これは、Hibernateのデフォルトです)。アノテーションの追加を開始しましたfetch = FetchType.LAZY

例えば

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

の代わりに

@ManyToOne(optional = false)

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

20
RNJ

これまでのところ、TBHを意外に構成可能にするための機能リクエストを受け取っていないという理由だけで、アノテーションを介したマッピングに関してHibernateがJPA仕様に準拠することを選択しました。ご指摘のとおり、Hibernate 3.0以降では、hbm.xmlマッピングファイルを使用するときに必要なものがデフォルトで設定されています。

構成を介してこれを許可しないはずです別の回答が示唆されているように、仕様に違反しています。

とても長い話ですが、今日は不可能です。構成可能であることを確認したい場合は、機能リクエストを作成します。

19
Steve Ebersole

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

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

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

6
Hasan Ceylan

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

3
Erhan Bagdemir

私の理解では、@ oneToOneおよび@ManyToOne JPAアノテーションは熱心な影響を及ぼします。

JPAは、アノテーションまたは永続性XML内で宣言されていない場合は、単一値の関係での積極的なロードを保証します。コレクション値の関係の場合、デフォルトでは遅延ロードが使用されますが、遅延ロードは(単なる)JPAをサポートする永続性プロバイダーへのヒントであるため、これに依存することはできず、特定のプロバイダー(Hibernate、OpenJPAなど)を確認する必要があります。詳細については、参考として this link を参照してください。

1
Felix Dobslaw