Criteria API を使用して NHibernate にコレクションを積極的にロードする
質問
エンティティ B とエンティティ C が多数あるエンティティ A があります。すべてのエンティティ A、B、および C には、積極的にロードする必要があるいくつかの参照 x、y、z があります。
データベースからすべてのエンティティ A を読み取り、条件 API を使用して B と C のコレクションを積極的にロードしたいと考えています。これまでのところ、「A」の参照を熱心に取得できています。ただし、コレクションが読み込まれるとき、コレクション内の参照は遅延して読み込まれます。
これが私のやり方です
AllEntities_A =
_session.CreateCriteria(typeof(A))
.SetFetchMode("x", FetchMode.Eager)
.SetFetchMode("y", FetchMode.Eager)
.List<A>().AsQueryable();
Fluentを使用したエンティティAのマッピングは以下のようになります。_B と _C は、それぞれ A の B と C のプライベート IList です。
Id(c => c.SystemId);
Version(c => c.Version);
References(c => c.x).Cascade.All();
References(c => c.y).Cascade.All();
HasMany<B>(Reveal.Property<A>("_B"))
.AsBag()
.Cascade.AllDeleteOrphan()
.Not.LazyLoad()
.Inverse()
.Cache.ReadWrite().IncludeAll();
HasMany<C>(Reveal.Property<A>("_C"))
.AsBag()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Cache.ReadWrite().IncludeAll();
マッピング ファイルには変更を加えたくないので、エンティティ A 全体を熱心にロードしたいと考えています。つまりA のリストを取得する必要があります。そこには、参照プロパティも熱心にロードされる B と C のリストがあります。
解決
ここではデカルト積を実行しようとしています。バッグでは重複が許可されているため、Hibernate ではそのためにバッグではなくセットとして関係をマッピングする必要があると思います。
とにかく、デカルト積は非常に非効率です。代わりにマルチクエリまたは将来のクエリを使用してください。
見る:
所属していません StackOverflow