Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ленивые свойства в Hibernate 
:(
    Опции темы
serious
Дата 11.1.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Вешаю на все свойства доменного объекта аннотации:
для простого свойства
Код

@Basic(fetch = FetchType.LAZY)

или
для связанного объекта
Код

@OneToOne(fetch = FetchType.LAZY, optional = true)

но в логах видно, что Hibernate тащит объект полностью + еще связанные объекты.
Вопросы: Почему он ПОЛНОСТЬЮ забил на эти хинты? Есть ли другой способ добавить "ленивости" доменным объектам?

Это сообщение отредактировал(а) serious - 11.1.2007, 19:58


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
tux
Дата 11.1.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Аннотациями никогда не пользовался. В маппингах xml, все работает как часы, только для того, чтобы работало надо задать свойство lazy="true". Как это в аннотациях не знаю.
PM MAIL Skype GTalk Jabber YIM   Вверх
serious
Дата 12.1.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Цитата(tux @  11.1.2007,  12:25 Найти цитируемый пост)
В маппингах xml, все работает как часы

А в чем принципиальная разница? У меня такое ощущение, что кто-то мешает Хибернейту использовать ленивость для этих объектов...


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
serious
Дата 17.4.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Если поле хранится большой объем данных (большой блок текста или бинарные данные), то можно попробовать соптимизировать ӕто, добавив аннотацию @Lob. В сосвокупности с lazy-загрузкой (@Basic(optional = true, fetch = FetchType.LAZY)), Hibernate должен тащить ӕто поле только по требованию. Можно поюзать еще и такой прием: объекты имеют свойство раздуваться, поӕтому если есть Rich-класс, то можно попробовать разбить его на несколько, в нужных местах включив "ленивую" загрузку, т.е. выполнить декомпозицию. Если используются коллекции, то имеет смысл также поюзать аннотацию @LazyCollection(value=LazyCollectionOption.EXTRA), причем также в совокупностью с аннотацией вида @OneToMany(fetch = FetchType.LAZY, mappedBy = "some_class").

Кто что думает по ӕтому поводу? smile

Добавлено через 2 минуты и 56 секунд
По поводу мӕппингов через xml... Не знаю, по-моему ӕтим уже никто не пользуется, все перешли на аннотации. Или я ошибаюсь smile


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Tony
Дата 17.4.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Код

По поводу мӕппингов через xml... Не знаю, по-моему ӕтим уже никто не пользуется, все перешли на аннотации. Или я ошибаюсь 

Ошибаешся.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Maksym
Дата 17.4.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



serious
На аннтотации как минимум не перешли те, кто работает на java младше 5. А таких ооочень много, особенно в консервативных отраслях типа банковской.. 
PM MAIL   Вверх
chief39
Дата 17.4.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Цитата(Maksym @  17.4.2007,  17:39 Найти цитируемый пост)
serious
На аннтотации как минимум не перешли те, кто работает на java младше 5. А таких ооочень много, особенно в консервативных отраслях типа банковской..  

Почему консервативные?  Просто многие большие системы очень долго дорого переводить.
Я вот тоже на треингах вещаю о прелестях 3.0 еджиби, наслаждаюсь красотой и изяществом аннотаций и показываю как, на самом деле, всё легко и просто, а потом возвращаюсь из митинг-рума... а тут опять 2.1  smile 
Но перевод займёт очень много времени и добавит сотни больших и маленьких багов. И я первый буду против  smile 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Maksym
Дата 17.4.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



chief39
Цитата(chief39 @  17.4.2007,  19:07 Найти цитируемый пост)
Почему консервативные?  Просто многие большие системы очень долго дорого переводить.

Сказал консервативные в лучшем смысле этого слова   smile 
По моим наблюдениям дело не только в том что долго и даже не в том что дорого, а в том что бизнес уже заплатил за эту функциональность и получил её. А насколько это изящно реализовано никого особо не беспокоит, особенно если система протестирована и не требует серьезного саппорта. И даже низкую производительность будут терпеть до самого последнего лишь бы не трогать то что уже работает, а главное не платить дважды за одно и то же.

PM MAIL   Вверх
ShamanTrirukiy
Дата 18.4.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 12.4.2006
Где: Харьков

Репутация: нет
Всего: 5



На сколько я чего-то понял, для ленивых загрузок необходима открытая сессия. Можно ли это как-то обойти, если загрузка объектов делается следующим образом:
Код

public T selectById(long id) {
    T entity = null;
    Session session = null;
    try {
      session = HibernateUtil.getSession();
      Query q = getIdQuery(session);
      q.setLong("id", id);
      entity = getUniqueValue(q.list());
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (session != null)
        session.close();
    }
    return entity;
  }

Т.е. сессия закрывается сразу же после выборки.
Поделитесь пожалуйста опытом решения подобной проблемы. Держать открытой сессию вроде как нельзя (проект рассчитан на ~200 пользователей, (сразу же вопрос - никто не знает, что будет при пуле в 200 коннекшинов?) да и не ясно, когда соединение закрывать).
PM MAIL   Вверх
polosatij
Дата 18.4.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8



Цитата(ShamanTrirukiy @  18.4.2007,  16:43 Найти цитируемый пост)
    entity = getUniqueValue(q.list());
...
    return entity;


насколько я понимаю ты возвращаешь обьект из сессии.. я делал всегда иначе => если getUniqueValue возврашает коллекцию типа ArrayList, я делал следующее:

Код

ArrayList<..> result = new ArrayList<...>(...size());
result.addAll(entity);
...

return result;


возможно я могу ошибаться, тогда поправьте меня и я свой код тоже подправлю  smile 



--------------------
PM   Вверх
ShamanTrirukiy
Дата 19.4.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 12.4.2006
Где: Харьков

Репутация: нет
Всего: 5



Похоже, я привёл не совсем правильный пример. List в моём случае - поле у объектов, выбраных из базы. Его и надо инициализировать лишь при обращении к нему из приложения.
Цитата(polosatij @  18.4.2007,  20:06 Найти цитируемый пост)

возможно я могу ошибаться, тогда поправьте меня и я свой код тоже подправлю 

Ты сразу же после выборки из базы инициализируешь коллекцию, т.е. "ленивость" не используется как факт.

Это сообщение отредактировал(а) ShamanTrirukiy - 19.4.2007, 12:05
PM MAIL   Вверх
chief39
Дата 19.4.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



serious, я не уверен, но мне кажется, что это не директива, а подсказка контейнеру. И он сам принимает решение тянуть/не тянуть всё сразу. 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.