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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPA: загружать или не загружать связанные сущности, при использовании OneToMany 
:(
    Опции темы
Maverick
Дата 13.8.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



и где это надо использовать? в сессионном фасаде? или в самом ентити? как же инициализировать коллекцию все-таки? где именно это надо сделать? 

AntonSaburov, раскажите хотя бы кратко как это сделать и вы сделаете этот топик одним из самых популярных в интернете... Вы пользуетесь EJB3 в работе?


--------------------
smile
PM ICQ GTalk   Вверх
AntonSaburov
Дата 13.8.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата(Maverick @  13.8.2007,  14:51 Найти цитируемый пост)
AntonSaburov, раскажите хотя бы кратко как это сделать и вы сделаете этот топик одним из самых популярных в интернете... Вы пользуетесь EJB3 в работе?

Ох, в реальном проекте у нас к сожалению используется еще EJB 2 и Hibernate (убедили начальство, что это проще). 

А вот для "Студенческого отдела кадров" я копался. Но вот описать прямо с нуля - сложно. В NetBeans это делается весьма удобно - наверно проще будет просто описать действия по пунктам. Постараюсь что-то простое выложить. А дальше уже самими копаться придется smile
PM MAIL WWW ICQ   Вверх
Maverick
Дата 13.8.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



AntonSaburov, я копаюсь со страшной силой... сижу как раз в NetBeans - действительно удобно проектировать и компелировать, и деплоить.... но, не работает проект сделанный теоретически полностью правильно...

Добавлено через 2 минуты и 4 секунды
Как можно было сделать библиотеку Hibernate так, чтобы в одном классе нельзя было хранить две подгруженные постоянно коллекции? У меня в голове не укладывается... ведь это есть в каждом втором проекте... 


--------------------
smile
PM ICQ GTalk   Вверх
AlexeyVorotnikov
Дата 13.8.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Maverick @  13.8.2007,  16:01 Найти цитируемый пост)
чтобы в одном классе нельзя было хранить две подгруженные постоянно коллекции

Это в каком смысле?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Maverick
Дата 13.8.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



В том смысле, что если скажем у тебя есть экономический агент, у которого есть список деклараций и список субсчетов одновременно - то стандартно их проиницилизировать через Hibernate в EJB3 не получиться....

Добавлено через 29 секунд
да и вообще непонятно - как инициализировать их... 


--------------------
smile
PM ICQ GTalk   Вверх
hamsterKSU
Дата 13.8.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



может проблема и решена я так и непонял но насчет инициализации колекций меня в Hibernate спасло следующие
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "...", fetch = FetchType.EAGER)

PM MAIL ICQ   Вверх
Maverick
Дата 14.8.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



К сожалению не помогло... проблема остается открытой... 


--------------------
smile
PM ICQ GTalk   Вверх
Maverick
Дата 14.8.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



хух... заработало... решение проблемы здесь - в этом блоге...
единственным недостатком является то, что приходиться отказаться от чистого EJB3 и использовать расширение Hibernate @IndexColumn... однако, странновато.... EJB3 сыроват...  smile 


--------------------
smile
PM ICQ GTalk   Вверх
VSergeyV
Дата 24.8.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как можно повлиять на связанные сущности при выборке?

Пример топискатера
Код

@Entity
public class Topic
{
    long id;
    ...
    @OneToMany(...)
    private Collection<Post> posts;
    ...
}
@Entity
public class Post
{
   String status;
    ...
}

Допустим выбираем Topic по id, а в posts нужно выбрать не просто все посты для темы с заданным id (что делается по умолчанию),  но и еще со status="А".
PM MAIL ICQ   Вверх
victorq10
Дата 30.7.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если еще кто зайдет на эту тему, то мой совет такой.

Осоциации для бинов OneToMany и ManyToOne служат для того чтобы можно было пользоваться JPQL.

Пример:
Выбираем топики со статусом, к примеру, 'A'
Код

SELECT t FROM Topic t JOIN t.posts p WHERE p.status = 'A'

or
Код

SELECT t FROM Post p JOIN p.topic t WHERE p.status = 'A'

or
Код

SELECT t FROM Post p, p.topic t WHERE p.topic = t.id AND p.status = 'A'



Выбираем все посты где у топиков type = 1
Код

SELECT p FROM Topic t JOIN t.posts p WHERE t.type = 1

or
Код

SELECT p FROM Post p JOIN p.topic t WHERE t.type = 1

or
Код

SELECT p FROM Post p, p.topic t WHERE p.topic = t.id AND t.type = 1



Все запросы должны возвращать одно и тоже.
Последний запрос (без JOIN) может использоваться и без объявленных 
связей OneToMany и/или ManyToOne у соответствующих объектах.

Заключение:
OneToMany, ManyToOne, OneToOne, ManyToMany описывают поля для того, 
чтобы было удобно строить запросы на JPQL. JPA делает важную вещь - 
возвращает объекты!!!

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


У меня волнует другой вопрос, с которым я столкнулся.
как избежать циклическую загрузки по связям ManyToOne.

К примеру выбираем "Клиентов" с базы, у клиентов есть "Менеджер", он в свою очередь принадлежит 
к "ГрупеМенеджеров", так же  у клиектов имеет "СтатусКлиента". 
В результате будет один запрос с таблици "Клиентов" и много одиночных запросов к таблицам:
 "Менеджер", "ГрупеМенеджеров", "СтатусКлиента".

если 1000 клиентов, 120 СтатусовКлиента, 40 менеджеров, 5 ГрупМенеджеров, 
и все записи из таблиц будут использоваться,
то получим минимум 1 + 120 + 40 + 5 = 167 запросов. TopLink сделает где-то 2000 запросов (у меня чуть другие данные, но суть та же)

Нашел ответ что нужно проектировать структуру базы с учетом связей. Как бы это хорошо,
но может есть более лояльный подход.

Другой вариант оптимизации использовать выбрав только то что нужно
Код

SELECT new ClientInfo(c.id, c.name) FROM Client c


Третий вариант оптимизации использовать LEFT JOIN FETCH:
Код

SELECT c FROM client c
LEFT JOIN FETCH c.manager
LEFT JOIN FETCH c.manager.groupManager
LEFT JOIN FETCH c.clientStatus

этот вариант у меня не заработал в TopLink, в других не пробовал (пример для Hibernate).
у меня работает только один уровень с FETCH. (число одиночных запросов уменьшилось smile

Четвертый вариант использовать FetchGroup, не совсем понял как его использовать 
и он зависит от реализации JPA.

Что делать в такой ситуации? 
Как избежать циклических запросов по связям ManyToOne когда в базе присутствуют сложные зависимости?




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

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

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


 




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


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

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