fetch = присоединиться к таблицам в одном классе NHibernate - PullRequest
1 голос
/ 09 октября 2009

Я прочитал пост о fetch = join - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx (ser4ik.livejournal.com/2505.html) Итак, у меня есть вопрос, например, у меня есть класс

<class name="AttributesInf" table="attr_inf">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Name" />
    <property name="Desc"/>
</class> 

и

<class name="AttributeValue" table="attr_val">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Value" />
 <many-to-one name="AttrName" column="attrId"/>
</class> 

Если я использую это отображение без set fetch = "join", я получаю sql:

Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...()

и после этого отдельные SQL-запросы, такие как:

Select * From attr_inf where Id = av.attrId

Итак, мой результат:

class AttrinuteInf 
{ 
int Id; 
string Name; 
string Desc; 
} 
class AttributeValue 
{ 
int Id; 
string  Value; 
AttributeInf AttrName;
}

Если я установлю fetch = "join", то получу один запрос:

Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg 
from Users u
Left outer join Blogs b 
On u.BlogId=b.Id
Where u.Id = ...

Так что я ожидаю получить один класс:

class AttributeValue
{
int Id;
string  Value;
string Name;
string Desc;
}

Но у меня тот же результат, как если бы я не установил fetch для "join".

Это все в порядке? Есть ли способ получить свойства из класса, сопоставленного как <many-to-one> напрямую? (не как AttrName.Name, а просто Name)

Пояснение:

Часть отображенного выше набора не показывает мою реальную проблему. Я хочу отобразить некоторую сущность как IDictionary<string,AttributeValue>. Я отображаю это как

<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="item_id"></key>
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table
<one-to-many class="AttributeValue"/>
</map>

Ответы [ 3 ]

7 голосов
/ 09 октября 2009

Это не делает то, что вы думаете, что делает. Использование fetch = join только для того, чтобы стремиться загрузить многие стороны отношений. В обоих случаях вы получите одни и те же объекты. По умолчанию NHibernate будет лениво загружать связанные сущности (вот почему вы получаете второй запрос). Используя fetch = join, вы запрашиваете все объектные отношения одновременно, но он все равно будет заполнять объекты так же, как и без fetch = join.

1 голос
/ 09 октября 2009

Я не понимаю вашего вопроса. Атрибут 'fetch-join' просто определяет, как должен выглядеть sql, который генерирует NHibernate для получения экземпляров ваших классов. Это не имеет ничего общего с тем, «что» будет возвращено. NHibernate переведет набор записей (который является результатом запроса), чтобы исправить экземпляры ваших классов.

Если вы просто хотите получить части своей сущности (например, имя), вам придется написать HQL-запрос или использовать API-интерфейс ICriteria и, возможно, использовать проекции.

1 голос
/ 09 октября 2009

Это не то, как вы это описываете. Ваши сущности не меняются в зависимости от того, что вы запрашиваете.

Вы получите список экземпляров вашего основного объекта с привязкой к другому. Так что, если в вашем коде вы получите доступ к ассоциации, вы найдете значения.

Если вы не получите его, вы не сможете получить доступ к этим полям, так как они не были бы получены из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...