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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EntityManager - от куда куча лишних запросов к БД? 
:(
    Опции темы
zimzum
Дата 26.7.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго всем дня!

Начал изучать EJB3 (сервер - JBossAS6, БД - MSSQL).

Столкнулся с такой проблемой:

(сначала в кратце опишу)
Есть несколько связанных между собою таблиц.
Делаю выборку данных из них с помощью EntityManager`а.
Смотрю запросы к БД через SQL Server Profiler:
первый запрос - то что мне надо, далее - куча лишних запросов к БД по ForeignKey.

(теперь подробнее)
Есть у меня несколько Entity, которые связаны между собой связями @ManyToOne и @OneToOne.
(пробовал и fetch=FetchType.EAGER и fetch=FetchType.LAZY - один результат)

Делаю примерно такой запрос:
Код

SELECT t1
FROM Table1 t1
     JOIN FETCH t1.column1 t2
     JOIN FETCH t1.column2
     LEFT JOIN FETCH t1.column3
WHERE t2.Type=1 AND t1.Name='A'


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

в итоге, что я вижу в SQL Server Profiler:
1 запрос к БД (упрощенно привожу):
Код

select * 
from Table1 t1
    inner join Table2 t2 on t1.Col1=t2.ID
    inner join Table3 t3 on t1.Col2=t3.ID
    left join Table2 t3 on t1.Col3=t3.ID
where t2.Type=1 and t1.Name='A'


и далее (!!!!  smile ):
Код

select * from Table2 where ID=1
select * from Table2 where ID=2
select * from Table2 where ID=3
select * from Table2 where ID=4
select * from Table2 where ID=5


т.е. выбираются ПО ОДНОЙ записи из связанной таблице, ID которых вернулись мне в первом запросе!


в документации я нашел слово FETCH  которое должно решать данную проблему,
но у меня на простых запросах (и связях таблиц) оно работает, а на сложных уже нет :(
явно чего-то я не учитываю и делаю не так...

может плохо объяснил проблему, но надеюсь меня поймут те, кто уже сталкивался с таким  явлением и подскажут мне что я делаю не так? smile 



PM MAIL   Вверх
zimzum
Дата 26.7.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так...
Методом тыка удалось добиться нужной работы EntityManager`a!  smile  smile 

Оказалось, что по умолчанию для всех @ManyToOne и @OneToOne стоит fetch=FetchType.EAGER
и он то всё и гадит! Надо повнимательнее почитать мануал на этот счет...

Делаем:
1. fetch=FetchType.LAZY для всех связей
2. в select присоединяем все нужные нам таблицы используя ключевое слово FETCH

в моем случае достаточно было сделать п.1 (т.к. по п.2 уже всё было сделано) и всё заработало!  smile 


P.S.: полезно проблему описывать словами! При этом лучше понимаешь суть вопроса и приходят новые идеи! smilesmile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0597 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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