NHibernate, частичная загрузка класса
От: a212  
Дата: 14.03.07 15:51
Оценка:
Есть класс, допустим это класс MyFriends. Класс имеет простые поля типа: id, имя, фамилия, год рождения и фото.
Вопрос: как указать что бы поле ФОТО грузилось только тогда когда я к нему обращаюсь?

Если бы поле ФОТО находилось бы в другом классе и тот класс ссылался бы на MyFriends, то можно было бы указать lazy="true" и проблема была бы решена.
А как бы в этом случае ?
Re: NHibernate, частичная загрузка класса
От: Andrew Merkulov Россия www.ibprovider.com
Дата: 15.03.07 06:24
Оценка:
Здравствуйте, a212, Вы писали:

A>Есть класс, допустим это класс MyFriends. Класс имеет простые поля типа: id, имя, фамилия, год рождения и фото.

A>Вопрос: как указать что бы поле ФОТО грузилось только тогда когда я к нему обращаюсь?

A>Если бы поле ФОТО находилось бы в другом классе и тот класс ссылался бы на MyFriends, то можно было бы указать lazy="true" и проблема была бы решена.

A>А как бы в этом случае ?

К сожалению не знаю как работает механизм загрузки данных в NHibernate, но можно разбить Ваш класс на два класса так, что при работе с ним это будет не заменто и появится возможность использовать аттрибут LazyLoad. Примерно так:
class MyFoto
{
    public Image get FOTO_FLD { return ...;}
}

class MyFriends
{
   [LAZY_LOAD] 
   MyFoto m_foto;


   Image Foto
   {
      get {return m_foto.FOTO_FLD;} 
   }
}


Немного обо мне, и моем круге
Мои профиль в LiveLib — книги
Re[2]: NHibernate, частичная загрузка класса
От: a212  
Дата: 15.03.07 08:12
Оценка:
Да, для данного конкретного случая Ваше решение имеет место, но...
во первых это несовсем красивое решение — зачем мне два класса если логически это один?? Неужели мы должны подстраивать логику под Hibernate ??
во вторых как быть если класс большой, т.е. он имеет много полей и часть полей редко когда используются.
в третьих, как решается такая простая задача — нам надо показать список объекта который состоит из всего нескольких полей, а после выбора из списка мы показываем детальную (полную) информацию об этом экземпляре объекта. Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.

Мне кажется что эти вопросы возникают у любого кто начинает пользовать NHibernate. И эти вопросы легко бы решались если бы была возможность указать для поля что-то типа lazy="true" — загруза по требованию. Я подозреваю что это можно как то сделать, но я не нашел как. Если кто знает, плиз, подскажите или укажите в каком направлении копать.
Re[3]: NHibernate, частичная загрузка класса
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 15.03.07 08:35
Оценка:
Здравствуйте, a212, Вы писали:

A>Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.


Сомнительная оптимизация(если у вас конечно не тысячи колонок в таблице), лично я на таких вещах не заморачиваюсь, не стали на этом заморачиваться и разработчики NH.

А вообще вариант есть, читать данныве при мопощи HQL в ресалтсеты.
Re[4]: NHibernate, частичная загрузка класса
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 15.03.07 08:37
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, a212, Вы писали:


A>>Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.


A>Сомнительная оптимизация(если у вас конечно не тысячи колонок в таблице), лично я на таких вещах не заморачиваюсь, не стали на этом заморачиваться и разработчики NH.


Невнимательно причитал ваш пост.

А почему бы вам не вынести фоторгафии в отдельную таблицу ?
Re[3]: NHibernate, частичная загрузка класса
От: Andrew Merkulov Россия www.ibprovider.com
Дата: 15.03.07 08:38
Оценка: 2 (1)
Здравствуйте, a212, Вы писали:

A>Да, для данного конкретного случая Ваше решение имеет место, но...

A>во первых это несовсем красивое решение — зачем мне два класса если логически это один?? Неужели мы должны подстраивать логику под Hibernate ??

Универсальный подход OR-маппинга накладывает определенные ограничения. Поэтому мой ответ: Либо мириться либо самим дорабоатывать под свои нужды

A>во вторых как быть если класс большой, т.е. он имеет много полей и часть полей редко когда используются.

A>в третьих, как решается такая простая задача — нам надо показать список объекта который состоит из всего нескольких полей, а после выбора из списка мы показываем детальную (полную) информацию об этом экземпляре объекта. Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.

Точно так же как я Вам показал. Вы зря так относитесь к нескольким классам. Тем более что один из них можно сделать зарытым внутри другого. И снаружи все будет выглядеть как одно целое и про обращении к соответствующим полям произойдет загрузка по требованию вложенного объекта:
class MyFriends
{
   private class MyLazyLoadFriend
   {
      public Image get FOTO_FLD { return ...;}
      .....
   }
  
   // здесь поля которые грузятся сразу
   ....

   // здесь поля которые грузятся по требованию
   [LAZY_LOAD] 
   MyLazyLoadFriend m_lazyLoadFriend;

   Image Foto
   {
      get {return m_lazyLoadFriend.FOTO_FLD;} 
   }

   public string OrderComment
   {
      get {return m_lazyLoadFriend.OrderComment;} 
   }

   public string Invoice
   {
      get {return m_lazyLoadFriend.OrderComment;} 
   }
}


Вот Вам классическое решение классической задачи, которое по трудозатратам хначительно меньше чем написать логигу загрузки и сохранения.

A>Мне кажется что эти вопросы возникают у любого кто начинает пользовать NHibernate. И эти вопросы легко бы решались если бы была возможность указать для поля что-то типа lazy="true" — загруза по требованию. Я подозреваю что это можно как то сделать, но я не нашел как. Если кто знает, плиз, подскажите или укажите в каком направлении копать.


В любом велосипеде есть свои недостатки. Хотя в Вашем случае отсутствие такой возможности в NHibernate всего лишь недостающая фича


Немного обо мне, и моем круге
Мои профиль в LiveLib — книги
Re[4]: NHibernate, частичная загрузка класса
От: a212  
Дата: 15.03.07 09:39
Оценка:
Здравствуйте, Andrew Merkulov, Вы писали:

AM>Вот Вам классическое решение классической задачи, которое по трудозатратам хначительно меньше чем написать логигу загрузки и сохранения.


AM>В любом велосипеде есть свои недостатки. Хотя в Вашем случае отсутствие такой возможности в NHibernate всего лишь недостающая фича


Я понял моя задача решаема если использовать отдельные классы. Большое спасибо за ответы.
Re: NHibernate, частичная загрузка класса
От: AlLucky Беларусь Qulix Systems
Дата: 02.04.07 14:33
Оценка:
Здравствуйте, a212, Вы писали:

A>Есть класс, допустим это класс MyFriends. Класс имеет простые поля типа: id, имя, фамилия, год рождения и фото.

A>Вопрос: как указать что бы поле ФОТО грузилось только тогда когда я к нему обращаюсь?

A>Если бы поле ФОТО находилось бы в другом классе и тот класс ссылался бы на MyFriends, то можно было бы указать lazy="true" и проблема была бы решена.

A>А как бы в этом случае ?
А разве у property нет такого атрибута lazy? По-моему, есть. Вот и выставте его в true
... << RSDN@Home 1.2.0 alpha rev. 676>>
Aleksandr Sly
Re[2]: NHibernate, частичная загрузка класса
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 03.04.07 06:32
Оценка:
Здравствуйте, AlLucky, Вы писали:

AL>А разве у property нет такого атрибута lazy? По-моему, есть. Вот и выставте его в true


Нет.
Re[3]: NHibernate, частичная загрузка класса
От: AlLucky Беларусь Qulix Systems
Дата: 03.04.07 07:59
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, AlLucky, Вы писали:


AL>>А разве у property нет такого атрибута lazy? По-моему, есть. Вот и выставте его в true


A>Нет.

Да, действительно в NHibernate нет Есть только в Hibernate 3.0.
Может в NHibernate 1.2 и добавят, но пока не видно, чтобы в след. релизе это было.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Aleksandr Sly
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.