Множество «один к одному» за одним столом - PullRequest
3 голосов
/ 20 марта 2011

У меня есть таблица Product с двумя ссылками «многие к одному» (Title & Description) на одну таблицу с именем TextRef:

Продукт:

<many-to-one lazy="false" name="Title" class="TextRef" column="TitleRef" fetch="join" cascade="save-update"/>
<many-to-one lazy="false" name="Description" class="TextRef"  column="DescriptionRef" fetch="join" cascade="save-update"/>

каждый TextRef имеет таблицу «один ко многим» к TextRefItem:

<bag lazy="false" name="Values" table="TextRefItem" cascade="save-update" inverse="true" fetch="join">
  <key column="TextId"></key>
  <one-to-many class="TextRefItem"/>
</bag>

теперь я хочу загрузить все TextRefItem (s) для Title & Description за один раз, но NHibernate только создает соединение с первой ссылкой (Title)

SELECT this_.ProductId as ProductId7_2_, this_.CategoryId as CategoryId7_2_, 
this_.DescriptionRef as Descript3_7_2_,
textref2_.TextId as TextId8_0_, values3_.TextId as TextId4_, 
values3_.TextItemId as TextItemId4_, values3_.TextItemId as TextItemId9_1_,values3_.LangId as LangId9_1_,
values3_.Text as Text9_1_, values3_.TextId as TextId9_1_ 
FROM
Product this_
inner join TextRef textref2_ on this_.DescriptionRef=textref2_.TextId
left outer join TextRefItem values3_ on textref2_.TextId=values3_.TextId
WHERE this_.ProductId = 1

для другого (Описание) он делает отдельный запрос на выборку

как я могу сказать NHibernate, чтобы избежать этого?

1 Ответ

1 голос
/ 20 марта 2011

Я не знаю, почему делается отдельный запрос для второй ссылки (Описание). Но можно расширить стратегии выборки с помощью критериев для загрузки продукта со всеми TextRefs и TextRefItems за один раз:

var criteria = session.CreateCriteria(typeof(Product))
   .SetFetchMode("Description.Values", FetchMode.Join);

criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
criteria.Add(Restrictions.Eq("ProdId", 1));
var list = criteria.List<Product>();
...