Есть класс, допустим это класс MyFriends. Класс имеет простые поля типа: id, имя, фамилия, год рождения и фото.
Вопрос: как указать что бы поле ФОТО грузилось только тогда когда я к нему обращаюсь?
Если бы поле ФОТО находилось бы в другом классе и тот класс ссылался бы на MyFriends, то можно было бы указать lazy="true" и проблема была бы решена.
А как бы в этом случае ?
Здравствуйте, 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;}
}
}
Да, для данного конкретного случая Ваше решение имеет место, но...
во первых это несовсем красивое решение — зачем мне два класса если логически это один?? Неужели мы должны подстраивать логику под Hibernate ??
во вторых как быть если класс большой, т.е. он имеет много полей и часть полей редко когда используются.
в третьих, как решается такая простая задача — нам надо показать список объекта который состоит из всего нескольких полей, а после выбора из списка мы показываем детальную (полную) информацию об этом экземпляре объекта. Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.
Мне кажется что эти вопросы возникают у любого кто начинает пользовать NHibernate. И эти вопросы легко бы решались если бы была возможность указать для поля что-то типа lazy="true" — загруза по требованию. Я подозреваю что это можно как то сделать, но я не нашел как. Если кто знает, плиз, подскажите или укажите в каком направлении копать.
Здравствуйте, a212, Вы писали:
A>Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.
Сомнительная оптимизация(если у вас конечно не тысячи колонок в таблице), лично я на таких вещах не заморачиваюсь, не стали на этом заморачиваться и разработчики NH.
А вообще вариант есть, читать данныве при мопощи HQL в ресалтсеты.
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, a212, Вы писали:
A>>Т.е. по идее когда мы получаем список, физически должно выбираться из базы только те поля которые нам нужны для этого списка — для показа списка нам нет необходимости читать дополнительные поля.
A>Сомнительная оптимизация(если у вас конечно не тысячи колонок в таблице), лично я на таких вещах не заморачиваюсь, не стали на этом заморачиваться и разработчики NH.
Невнимательно причитал ваш пост.
А почему бы вам не вынести фоторгафии в отдельную таблицу ?
Здравствуйте, 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 всего лишь недостающая фича
Здравствуйте, Andrew Merkulov, Вы писали:
AM>Вот Вам классическое решение классической задачи, которое по трудозатратам хначительно меньше чем написать логигу загрузки и сохранения.
AM>В любом велосипеде есть свои недостатки. Хотя в Вашем случае отсутствие такой возможности в NHibernate всего лишь недостающая фича
Я понял моя задача решаема если использовать отдельные классы. Большое спасибо за ответы.
Здравствуйте, a212, Вы писали:
A>Есть класс, допустим это класс MyFriends. Класс имеет простые поля типа: id, имя, фамилия, год рождения и фото. A>Вопрос: как указать что бы поле ФОТО грузилось только тогда когда я к нему обращаюсь?
A>Если бы поле ФОТО находилось бы в другом классе и тот класс ссылался бы на MyFriends, то можно было бы указать lazy="true" и проблема была бы решена. A>А как бы в этом случае ?
А разве у property нет такого атрибута lazy? По-моему, есть. Вот и выставте его в true
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, AlLucky, Вы писали:
AL>>А разве у property нет такого атрибута lazy? По-моему, есть. Вот и выставте его в true
A>Нет.
Да, действительно в NHibernate нет Есть только в Hibernate 3.0.
Может в NHibernate 1.2 и добавят, но пока не видно, чтобы в след. релизе это было.