Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Из серии: "...дело было вечером, делать было нечего..." Преамбула. Есть товар. Со множеством атрибутов. Естественно, товары каталогизированы. Естественно они хранятся на складах. У каждого товара множество цен/наценок/скидок. Есть клиент торговой организации. У него есть всякие-разные настройки. Часть из них: ограничения на уровне атрибутов товаров: бренды, группы товаров, склады, цены/скидки/наценки. У клиента есть менеджер. И, естественно, у менеджера клиент - не один. Дальше, а еще есть много чего, перечислять думаю не надо - в общих чертах все понятно. Амбула. Посмотришь на диаграмму классов: "...Эх, красота-то какая! Лепота!.." (©) Все как книжка пишет. "...Сразу стало ясно кто где. Свинья Петров - вон. Свинья Сидоров - вон..." Но, вот, когда все это начинает фунциклировать - то получается, как в том известном анекдоте «Здравствуйте! Мы приветствуем вас на борту суперлайнера. Сейчас стюардессы показывают вам, как пользоваться спасательными жилетами. У нас на борту на 2 этаже вы можете покушать в прекрасном ресторане, на 3 – для вас открыта дискотека, на 4 этаже для вас выступают звезды эстрады, и наконец на 5 этаже есть стадион, где вы можете поиграть в футбол со знаменитыми футболистами! Теперь пристегните, пожалуйста, ремни, и мы со всей этой ХЕРНЕЙ НА БОРТУ ПОПЫТАЕМСЯ взлететь». Пока это все подымется - можно не то, что упиться чаем/кофе, но и утопиться в нем. И это хорошо, если страничка отработает, а не по time-out'у отвалиться. Вот такое www'шное приложение досталось мне в наследство. Вот смотрю я на все это и думаю: все эти ORM'ы годятся только для лабораторных/курсовых на "...кошках тренироваться..." или авторы моего землетрясения сильно переусердствовали? Хотя, если честно, то все, вроде, - по делу. Но когда, при том же тривиальном построении grid'а, в цикле поодиночно подрывается "...Волга со всеми ее пристанями и пароходами..." - руки так и чешутся написать обычный запрос, который скопом все вытянет за доли секунды. К чему это я: совершенству совращенству нет предела © или, таки, наплевать на "империалистический заговор" и чистоту кода и юзать в особо узких местах обычные запросы? Хотелось бы, все-таки, расставить все точки над i. Как правильно юзать ORM'ы? Все ли необходимо запихивать? Какие рекомендации для больших объемов данных? Какими приемами можно "оживить" в моем конкретном случае приложение? _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 00:08 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Мартышка, знаете ли, тоже долго с очками сладить не могла. Да, плюсы которые даёт ORM - не бесплатны. Это не волшебная палочка, которая всё делает хорошо. А сложный инструмент, которым надо уметь пользоваться. И всё будет хорошо. Так что смотрите, что написали программисты. Моск, профайлер и гугл в руки, ищите проблемы, да решайте их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 10:01 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftКак правильно юзать ORM'ы? Все ли необходимо запихивать? Какие рекомендации для больших объемов данных? Какими приемами можно "оживить" в моем конкретном случае приложение? 1. Использовать хибер в проектах любой сложности и не париться. 2. Использовать хранимые процедуры и/или обычные запросы (NamedQuery), которые хранятся в hbm.xml. 3. Обязательно всё это добро должно быть типизировано. 4. Обязательно возвращать в приложение только те данные которые должны использоваться. Ничег лишнего. Только то, что требует задача. 5. Обязательно в приложении предусматриваем фильтры и пейджинг. Не мне Вам рассказывать, что фильтры и пейджинг должны быть SQL-ориентированы. 6. Прямые выборки сущностей могут юзаться только в хеллоуворд проектах, которые не знают, что такое большие объемы данных, как следствие оптимизация запросов. Тут Вы несомненно правы. Пример на пальцах: Вам нужно вывести некий кастомный набор (Products + Categories) {Products.ProductID, Products.ProductName, Categories.CategoryID, Categories.CategoryName } Пришем хранимку (но я предпочитаю больше не хп, а чистые запросы в NamedQuery, но это сути не меняет): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Наш ProductWithCategory.hbm.xml: Код: plaintext 1. 2. 3. 4. 5. В модели определяем новый класс: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В дале продуктов в методе получения данных: Код: plaintext 1. 2. P.S. В боевых условиях ббывает так, что имена полей рекордсета (хп или прямого запроса) не совпадают с именами свойств класса: для этого курим свой IResultTransformer. Пример: Код: plaintext 1. 2. 3. 4. 5. 6. На помощь приходит МСУ со своим гавнокодцем Код: plaintext 1. 2. ResultTransformer Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 7. То есть по сути Вы пишите полностью свой DAL, но на платформе хибера. Ничего не изменилось - мы как кодили много лет назад, так и продолжаем это делать. Ни один фреймворк с мега ORM не способен за нас это сделать. Мы можем, разве что, на них опереться. Но делать придётся своё и заново. Такова моя лирика :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 10:35 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
8. Для уменьшения хардкодности и централизованного обращения к полям используйте в Ваших сущностях константы полей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Все телодвижения с полями сущности - только через Category.Properties.CategoryId, ... Перечисления полей можно заложить и в енумы (что в некотором смысле даже более красиво). Вообщем, хардкод в приложении нужно сводить к минимуму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 10:45 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Спасибо огромное за развернутый ответ. Дальше буду по мере осознания пунктов и наличия отсутствия свободного времени. МСУ 1. Использовать хибер в проектах любой сложности и не париться. Вот он, как раз, родимый и используется. Правда древний: 1.2.0.3001 . Причем вылезла несовместимость с последним 2.1.2.4000 К примеру: Код: plaintext 1. 2. 3. 4. 5. Под 2.1.2.4000 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. NHibernate.QueryException Return types of SQL query were not specified а Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. No persister for: AnyTestOracleOld.HO Я так понимаю требует mapping. Но это же гемор. Особенно в контексте: МСУ 7. То есть по сути Вы пишите полностью свой DAL, но на платформе хибера. Ничего не изменилось - мы как кодили много лет назад, так и продолжаем это делать. Т.е.: необходимо мне наполнить вот хоть тот же ComboBox. Получается я должен для этого не только какой-то temp'овый класс родить (ладно - с этим я еще смирюсь), но и еще вдобавок и map-файл нарисовать? И какой тогда сермяжный смысл в юзании хибера в качестве платформы именно в этом конкретном случае? Просто для общности кода? Когда обычным запросом - это ж гораздо проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2010, 11:39 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
BTW, вот еще: NHibernate-2.1.2.GA && inherited classes, NHibernate-2.1.2.GA && map\'инг на функцию с параметром, NHibernate-2.1.2.GA && NamedQuery когда хибер (просто в качестве платформы) не удовлетворил мои запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2010, 11:47 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
1. Обновляйте хибер 2. Не нравится типизация, возвращайте обычный IList в комбобокс или просто юзайте ISQLQuery. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2010, 15:07 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
МСУ 1. Обновляйте хибер Да, вот, подозреваю, что совместимости снизу вверх - нЭт. Но, вообще-то, как-то нужно будет собраться с духом и окончательно и бесповоротно подтвердить (или опровергнуть) эту гипотезу. BTW, это все касается 2.1.2 МСУ или просто юзайте ISQLQuery. Гм... Не могу понять, что Вы подразумеваете... На пальцах покажите, pls... _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2010, 23:25 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftBTW, вот еще: NHibernate-2.1.2.GA && inherited classes, NHibernate-2.1.2.GA && map\'инг на функцию с параметром, NHibernate-2.1.2.GA && NamedQuery когда хибер (просто в качестве платформы) не удовлетворил мои запросы. Боюсь, что вы не удовлетворили требования хибера(просто в качестве программиста). В первом топике тупо не удосужились замапить иерархию классов. Во втором и третьем страдаете фигней. Замапьте Staff связью 1-1 или 1-много), да вызывайте classStaff.Staff.Salary. В общем, читайте документацию, NHibernate in Action и на баррикады. Работа с ORM методом научного тыка интересна, но полна бессмысленных и беспощадных препятствий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2010, 10:13 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftНа пальцах покажите, pls... Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2010, 11:45 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
SolYUtorEx_SoftBTW, вот еще: NHibernate-2.1.2.GA && inherited classes, NHibernate-2.1.2.GA && map\'инг на функцию с параметром, NHibernate-2.1.2.GA && NamedQuery когда хибер (просто в качестве платформы) не удовлетворил мои запросы. В первом топике тупо не удосужились замапить иерархию классов. /me думает: гм... В первом топике всего лишь два класса: ClassStaff (cs + map) и ClassStaffWithReallyBirthDate (cs + map). Какого map\'инга еще нужно? SolYUtor Во втором и третьем страдаете фигней. Замапьте Staff связью 1-1 или 1-много), да вызывайте classStaff.Staff.Salary. Скажите, а как эта Ваша рекомендация поможет: - во втором топике заменить вызов функции с параметром - в третьем топике возвратить значение функции? BTW, если Вы еще не догадались, все представленные мной примеры - дрозофилы . На самом деле все, естественно, не так просто. P.S. Документацию - я читаю. Но, вот, ответов на мои вопросы я там не нашел. Если дадите конкретно ссылку - буду благодарен. "NHibernate in Action" - тоже просмотрел. Но, вот, "...in Action" (причем не только в конкретно этой, а - во всех, IMHO), как правильно заметил МСУ, на хеллоуворд\'ном уровне. Т.е. ответа на что-то хоть слегка нетривиальное - там, практически, не найти. МСУ Код: plaintext Кажется понял: т.е. Вы предлагаете вместо хиберовских юзать native SQL ? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 08:14 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftКажется понял: т.е. Вы предлагаете вместо хиберовских юзать native SQL ? Для "разовых" запросов можно поюзать нетипизированные результаты из IList. Но для бизнес-объектов (которые хотя бы два и более раза применяются в проекте) - обязателем маппинг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 08:30 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
МСУ Для "разовых" запросов можно поюзать нетипизированные результаты из IList. Но для бизнес-объектов (которые хотя бы два и более раза применяются в проекте) - обязателем маппинг. Это - понятно, но, вот, только тогда как это увязать с МСУ 4. Обязательно возвращать в приложение только те данные которые должны использоваться. Ничег лишнего. Только то, что требует задача. ??? Т.е.: сейчас у меня есть Client со ссылкой на Manager у которого коллекция ClientsOfManager, содержащая, естественно Client'ов. И, вот, получается, согласно п.4, если мне, к примеру, в одном месте (не разово) необходимо вывести какие-то данные о Client only (причем по одним полям) - я должен сделать выборку только по Client. В другом же месте (также - не разово) необходимо вывести какие-то данные о Client (причем по другим полям) + Manager. И тут я должен сделать выборку по Client'у, с'join'еному с Manager. А в третьем месте... И т.д. И, получается, на каждый запрос, необходимо, потому как: МСУ 3. Обязательно всё это добро должно быть типизировано. писать класс + map-файл. Ситуация мне начинает напоминать один анекдот Один человек нанял извозчика, чтобы подъехать. Сел. А тут сразу надо под горку. Извозчик и говорит: - Слы... Мил человек, у меня лошадка старая уже, немощная - не вытянет. Подтолкни, будь добр. Ну... Человек вылез и давай толкать. Поднялись на горку. Спускаться значит. Извозчик и говорит: - Слы... Мил человек, у меня лошадка старая уже, немощная, а пролетка - тяжелая. Боюсь - понесет. Попридержи, будь добр. Человек давай придерживать. Спустились. И тут уже ему выходить. Давай он расплачиваться с извозчиком и говорит: - Ну... Со мной все понятно - я нанял тебя потому, что хотел подъехать. С тобой - тоже. Ты подрядился потому, что денег хотел заработать. Одно только непонятно: нафига мы с собой лошадь брали? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 09:01 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_Soft /me думает: гм... В первом топике всего лишь два класса: ClassStaff (cs + map) и ClassStaffWithReallyBirthDate (cs + map). Какого map\'инга еще нужно? Этого. Ex_Soft Скажите, а как эта Ваша рекомендация поможет: - во втором топике заменить вызов функции с параметром - в третьем топике возвратить значение функции? Из второго: Код: plaintext Вид этих запросов навевает мысль, что вы пытаетесь сджойнить по Id некую другую сущность. Почему бы просто ее не замапить как ссылку? Из третьего Код: plaintext Расчёт функцией БД при наличии объектной модели - это не слишком хорошее решение, делайте это в своём приложении. Хибер позволяет вернуть в результате запроса скалярныю величину. Используйте эту возможность. И не надо пытаться мапить немапуемое. Использовать чистый SQL - только в самом крайнем случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 09:53 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftЭто - понятно, но, вот, только тогда как это увязать с ... Вы не правы в одном. Это - является исключением правила. И увязывать это не нужно с чем-то другим. В идеале - всё должно быть типризировано. Но для разовых работ можно сделать исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 10:28 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
SolYUtor Этого. /me думает: хорошо, хоть, ссылка не на это ... Там всего лишь пара-тройка строк: можете, так сказать, "...чиста канкретна..." показать на пальцах? SolYUtor Из второго: Код: plaintext Павтаряюсь: Ex_Soft все представленные мной примеры - дрозофилы . На самом деле все, естественно, не так просто. Т.е.: все максимально упрощено. Показана суть проблемы. Вы даже можете, приложив минимум усилий и проделав copy -> paste, попробовать у себя представленный код. Или Вам больше нравятся километровые простыни из реальных проектов с проблемой в 1024 строке? SolYUtorРасчёт функцией БД при наличии объектной модели - это не слишком хорошее решение, делайте это в своём приложении. Хибер позволяет вернуть в результате запроса скалярныю величину. Используйте эту возможность. Ну что мне Вам сказать?.. Может для хеллоуворд'ных проектов, созданных по принципу "ДаешЪ каждому приложению свою, отдельно взятую БД", это и "...хорошее решение..."... Но БД, которую юзает мое приложение, помимо его, юзают еще, как минимум, ~50 приложений. И цельная армия оракулистов запихивает эту бизнес-логику, которая может поменяться в любой момент, в БД. Дальше продолжать прописные истины не буду... SolYUtorИ не надо пытаться мапить немапуемоеСм. выше SolYUtor Использовать чистый SQL - только в самом крайнем случаеСм. ниже МСУЭто - является исключением правила А-а-а... А то я уж перепугался: вместо того, чтобы иметь нормальные человеческие яйца сиречь - полноценного Client'а, мы имеем кастрированного Client'та во всех его ипостасиях. Не... Давайте исключения, пока, рассматривать не будем. Я ведь не зря в названии топика акцентировал: "...или когда, все же, необходимо остановиться". Вот, к примеру: я так подозреваю, если здесь в Client'е вместо Manger'а юзать ManagerId, IMHO, Client был бы пошустрее. Или я не прав? offtop МСУно я предпочитаю больше не хп, а чистые запросы в NamedQuery А чего? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2010, 23:29 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_Soft, Вам шашечки, ехать или просто поп...еть? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2010, 09:51 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
В идеале - ехать быстро с шашечками, попутно ведя беседу А, если серъезно, то программа минимум - ускорить приложение (вон формирование прайс-листа по всего лишь одной группе товара запустил - пошла 15-я минута ). Ну, а по максимуму - расставить все точки над і в контексте применения хибера при огромных объемах данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 12:56 |
|
||
|
ORM: совершенству нет предела или когда, все же, необходимо остановиться
|
|||
|---|---|---|---|
|
#18+
Ex_SoftВ идеале - ехать быстро с шашечками, попутно ведя беседу Ну так а в чём сложности? Весь (90%) дата-слой типизируем через DAL (можете применить паттерн проектирования, очень удобен имхо Repository), остальные 10% - под задачи вида "дёрнуть сервер за яйца и убежать" (для "комбобоксов"): Код: plaintext Всё, ORM свои задачи покрыла на 100% (CreateSQLQuery - это тоже хиберовская фича, поэтому 10% засчитываем в копилку) Ex_SoftА, если серъезно, то программа минимум - ускорить приложение (вон формирование прайс-листа по всего лишь одной группе товара запустил - пошла 15-я минута ). Ну, а по максимуму - расставить все точки над і в контексте применения хибера при огромных объемах данных. Ну так ускоряйте, в чём сложность? Как напишете запросы и маппинг к ним, так оно и поплывёт. Не вижу никаких сложностей. Вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2010, 13:06 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36953433&tid=1351003]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
138ms |
get topic data: |
9ms |
get forum data: |
5ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 268ms |
| total: | 523ms |

| 0 / 0 |
