0

多くの ManyToOne、OneToOne などの関係を持つエンティティがあり、それら自体にもいくつかの関係があります。例えば

@OneToMany(targetEntity = Season.class, cascade = {
    CascadeType.ALL
})
@JoinColumn(name = "SEASON_ID")
  public List<Season> getSeasons(){...}

(これは変更できません)。

これらは遅延ロードされます (デフォルトだと思います)。これは良いことであり、これを変更したくありません。ここで、エンティティ全体を id で熱心に検索して返したい場合があります。

エンティティを変更するための多くの提案と、積極的ローディングと遅延ローディングのどちらが優れているかについての議論を見つけましたが、エンティティは私たちの手の届かないところにあるため、現時点では役に立ちません。エンティティを変更せずに、可能なすべてのゲッターを呼び出して遅延エンティティを初期化する必要なく、これを行う方法はありますか (それらが多すぎるため)。たとえば、質問 24573877への回答はうまくいきません。

基本的には「エンティティを熱心にロードしますが、これは一度だけ」と言いたいです。現在、私はやっていreturn em.find(MyEntity.class, contractId)ます(これを変更できます)。

ありがとう、よろしく Urr4

4

2 に答える 2

2

見てください:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

章: 14.3。関連付けと結合

「フェッチ」結合を使用すると、値の関連付けまたはコレクションを、単一の選択を使用して親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。詳細については、セクション19.1「フェッチ戦略」を参照してください。

em.find を使用する代わりに、クエリを作成する必要があります。

このクエリの例:

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens

レイジーで初期化されていても、仲間と子猫がすでにロードされている (熱心な) 状態で cat を返します。

編集: または、フェッチプロファイルを使用できます:

これらを軽減するために、Hibernate はマッピング レベルではなくリクエスト レベルで機能するフェッチ戦略を提案します。したがって、レイジー ロード マッピングを引き続き使用できますが、場合によっては熱心なフェッチを行うことができます。

見てください:https://blog.frankel.ch/hibernate-hard-facts-part-6

于 2015-10-23T15:15:54.680 に答える
0

思ったように解決できませんでしたが、今はうまくいきます。エンティティを熱心にロードする方法は実際にはないようです。あなたは何も知りません。私たちの問題は、エンティティがサードパーティの Maven 依存関係から来ており、変更できず、調べるのが難しいということでした。最後に、遅延ロードされたエンティティを取得し、すべてのゲッターと子エンティティのすべてのゲッターを再帰的に呼び出す entityProcessor を構築します。エンティティを制御できる場合は、次回 FetchProfiles を使用します。それ以外の場合は、clone() 関数を実装することをお勧めします。

于 2015-11-12T09:14:12.770 に答える