3

私は Hibernate を初めて使用しますが、C# の Entity Framework の経験は豊富です。私が気に入っている機能の 1 つは、クエリで何をすぐに読み込むかを動的に決定できる機能です。たとえば、Class エンティティと Student エンティティの 1 対多の関係を考えてみましょう。

「View Classes」ページでこれを行うことができます:

context.Configuration.EnableLazyLoading = true; //default option
List<Classes> classes = context.Classes.ToList();

これで、生徒のデータを収集するリソースを無駄にすることなく、クラス情報を表示することができます。ユーザーが「名簿でクラスを表示」をクリックした場合にのみ、次のことを行います。

context.Configuration.EnableLazyLoading = true;
List<Classes> classes = context.Classes.Include(c => c.Students).ToList();

その 1 つのステートメントで、この特定の状況では、一度にすべての情報を取得する必要があると判断できました。2 つのクエリではありません。100 クエリではありません。クエリは 1 つだけです。数秒前にクラスのみをロードしたにもかかわらず、すべて。

Hibernate に関する私のすべての読み物は、リレーションシップの構成ファイルで lazy="true|false" を指定する方法を説明していますが、コレクションをその場でいつロードするかを決定するオプションが本当に必要です。結局のところ、私は時速 30 マイルまたは時速 60 マイルしか出ない車を買うことに興味はありません。場所に応じて速度を選択する必要があります。

おそらく、フェッチ モードを JOIN として使用するオプションは、この状況では 2 つのクエリ (クラス用と学生用) しかないという点で受け入れられますが、1 つのクエリですべてを実行できるオプションがあることが本当に気に入りました。特に、ロードする子コレクションがいくつかあり、リレーションシップごとにクエリを実行したくない場合。一度に結合すると、ストリーミングする必要のある余分なデータが作成されることはわかっていますが、このレベルの制御が簡単に実行できないか、完全に利用できない可能性があることに驚いています。

4

2 に答える 2

2

Hibernate には、動的フェッチのための非常に便利な方法がありません。あなたはそれを制御することができます

  1. (@ThibaultClementが提案したように) HQLクエリを介した動的フェッチを使用します。join fetch
  2. での動的関連付けフェッチの使用Criteria.setFetchMode()
  3. 注釈付きのプロファイルを介して動的フェッチを使用します。@FetchProfile

HQL 結合クエリを参照して、追加の考えのために多数の関係を熱心にフェッチすることもできます。

于 2016-01-26T15:07:03.177 に答える