![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| chief39 |
|
||||||||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 11 Всего: 77 |
Всем Арбуэ!
Такая штука интересная нужна в плане лейзи лоадинга(и не недогрузить и не перегрузить) и никак не вытанцовывается.... Суть вот в чём: Данные: Есть таблица InputData - это денормализованная таблица, которая содержит в себе записи из трёх сущностей. После процессинга она перебирается и распаковывается в три таблицы: Amount, Account, Customer(эти самые сущности). Соответственно, все они many-to-one (у кастомера много эккаунтов, а у эккаунтов много эмаунтов) А вот InputData <-> Amount - один к одному (по сути, InputData - это Amount с довесками Account и Customer). Что делаем: Надо создать запись ReportData. Это таблица, которая содержит уже как бы аналитику на основе InputData данных. Она Many-to-one к InputData и остальным этим таблицам (аналитики много и всякой). Что мы делаем - мы делаем запрос, вытягиваем исходные данные из InputData и Amount(Account, Customer), вычисляем, записываем в новенькую ReportData, линкуем её с имеющимися Amount, Account, Customer, InputData и записываем в БД. Нюансы: Эта группа(сей кусок аналитики) довольно большая. Просто физически вытянуть весь рекордсет не выйдет. Поэтому пользуется iterate(), который пользует оракловый курсор. А это означает прямой запрет JOIN FETCH :( Работать должна довольно быстро. Поэтому подвыборки отметаются. Это долго. Должно хватать одного селекта. Проблема: Селект(чисто сгенерированый скльный, который идёт на нужды курсора) достаёт всё что надо... Но потом хибернейт то слишком ленится, то слишком усердствует в инициализации объектов. Здесь происходит создание ReportData,заполнение линков, данных и её save. Комментами помечены строки где сетаются линки на объекты, которые мы вытянули своим запросом
Для всего этого мы используем примерно такой HQL запрос(234-й вариант
Теперь что интересно... если InputData указать в select clause как am.inputDataRow - то в выборке этот объект фигурирует как NULL (!) Просто типа нету InputData и всё! Customer Account - в наличии и здравии. Amount тоже. Конкретные поля из InputData тоже нормально вытянуты.. А вот объект InputData - отсуйствует. Но если указать его явно по алиасу, типа: SELECT ind ... то он выбирается. Но тут же хибернейт запуливает туеву хучу сабселектов, которые тянут одиночными запросами InputDat'ы из базы. Это полностью сокрушает скорость. Причём, такая лажа именно с объектом, который идёт первым после FROM. Если поменять запрос и отталкиваться от Amount - то будет такая же лажа с Amount вместо InputData Генерит вот что(разные варианты были также):
Айдишки есть... Но объект-заглушку почему-то не создаёт :( Customer и Account прекрасно управляются только с айдишкой. Достал их, переложил в репортдату - сейв, готово. Остальные проперти мирно дрыхнут в БД. Хочу просто доставать Amount и перекладывать в ReportData без всяких сабселектов... Порезал много пропертей, которые будут запутывать. Если что - выложу остальные материалы для размышлизма по запросу. Итак, как победить нашего "союзника, который облегчает нам жизнь"?
Это сообщение отредактировал(а) powerOn - 4.2.2010, 20:09 -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
||||||||
|
|||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |