|
|
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Интересует, жизнеспособно ли решение? Может, кто применял нечто подобное... В модели предметной области создаем 2 класса, отображаемых на одну таблицу (для наглядности - Document и DocumentLight). Один из них (Document) - в полной мере описывает какую-либо сущность предметной области. У этого класса есть наследники (SubDocument1, ... , SubDocumentN). Второй класс (DocumentLight) - облегченный и используется только для чтения. В нем замэплены лишь несколько самых необходимых свойств. Наследников у него гарантированно нет, и применяется он для быстрого запроса списков с достаточным минимумом информации (основное поле - это идентификатор id). Далее уже для конкретного id, выбранного в списке DocumentLight, будет извлекаться объект класса Document (а точнее одного из его подклассов, NHibernate определит автоматически). При этом при построении списка из DocumentLight мы осуществляем запрос только к одной таблице - обходимся без join'ов со всеми таблицами подклассов... Как-то так.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:38 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barser, Ваше задача легко и непринуждённо решается HQL-запросами "select new". И не надо мапить вторую сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:52 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtor, Спасибо большое за наводку! Пойду читать доки... ps. сам никак не мог найти свойства, отключающее подгрузку подклассов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:58 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtorbarser, Ваше задача легко и непринуждённо решается HQL-запросами "select new". И не надо мапить вторую сущность. А критериальными проекциями не решается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 16:02 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barserИнтересует, жизнеспособно ли решение? Не жизнеспособно. Во-первых, это реально не нужно (детское ребячество отбросим), во-вторых, при таком подходе нельзя будет сгенерить БД по маппингам. Одна таблица - один класс. Все остальные потуги вколбасить в маппинги енумы, проецирующиеся с реальных таблиц и иже - самозаёп. Да и только. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 16:09 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Курдль А критериальными проекциями не решается? Судя по всему, решается... В предыдущем посте дали направление, в каком копать, и вот, похоже, нашел то что нужно - с проекциями и трансформерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 16:26 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Курдль А критериальными проекциями не решается? Это одно и тоже, только способ применения разный. Но лично для меня HQL приятнее, нежели ICriteria. Поэтому я его и посоветовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 16:51 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
МСУbarserИнтересует, жизнеспособно ли решение? Не жизнеспособно. Во-первых, это реально не нужно (детское ребячество отбросим), во-вторых, при таком подходе нельзя будет сгенерить БД по маппингам. Одна таблица - один класс. Все остальные потуги вколбасить в маппинги енумы, проецирующиеся с реальных таблиц и иже - самозаёп. Да и только. Понял, спасибо за ответ. Одна таблица - один класс... Именно этого принципа стараюсь придерживаться. Однако, к примеру, когда у документа есть штук 5 наследников, вызов getEntity(typeof(Document)) генерирует sql-запрос c пятью join'ами... И с ростом числа наследников число join'ов соответственно возрастает... Так-то пока все работает как часы, но не хотелось бы столкнуться с проблемами в будущем. Вот нашел время, чтобы убрать эти join'ы там, где они 100% не нужны. А наиболее подходящей методики для этого не знал/не нашел (еще думал, как вариант, использовать createSQLQuery() ) Немного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал. Но в текущем - у меня нет полномочий определять _все_ архитектурные решения, а также недостаточно опыта для этого... Вначале были приняты правила, по которым мы создаем таблицы вручную и после этого мэппим с классами. Так что сейчас этот плюс неактуален. Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов не дает тестировать слой DAO на базе sqlite без внесений изменений во все части мэппинга... а могло бы быть гораздо удобнее... ну и т.п.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 16:51 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barserНемного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал. мы создаем таблицы вручную Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД. Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД. barser Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов... А тут подробнее - что за проблемы и какие альтернативы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:00 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barserОдна таблица - один класс Я не совсем правильно выразился: если же речь о многие-ко-многим, то писать класс под промежуточную таблицу не нужно. Нужно только правильно смаппить. И тогда при генерации БД из маппингов промежуточная таблица создастся с констреинтами и всё будет хорошо. Но, это-лишь исключение. barserОднако, к примеру, когда у документа есть штук 5 наследников, вызов getEntity(typeof(Document)) генерирует sql-запрос c пятью join'ами... И с ростом числа наследников число join'ов соответственно возрастает... Так-то пока все работает как часы, но не хотелось бы столкнуться с проблемами в будущем. Вот нашел время, чтобы убрать эти join'ы там, где они 100% не нужны. А наиболее подходящей методики для этого не знал/не нашел (еще думал, как вариант, использовать createSQLQuery() ) Всё правильно - красота требует жертв. Вы тогда столкнетесь с оптимизацией. И тут на помощь придёт отдельный SQL запрос с типизацией результата (SetResultTransformer). barserВначале были приняты правила, по которым мы создаем таблицы вручную и после этого мэппим с классами. Так что сейчас этот плюс неактуален. Ну я тоже так работаю, но если потребуется развернуть БД из схемы - не вопрос. Конечно, если используются хранимые процедуры и прочее - это придется дозалить, но самое главное (таблицы и отношения между ними) + инициализация системных значений справочников будет исполнено без каким-либо телодвижений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:03 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Курдль Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД. Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД. Курдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:15 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
КурдльbarserНемного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал. мы создаем таблицы вручную Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД. Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД. barser Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов... А тут подробнее - что за проблемы и какие альтернативы? Ок, спасибо, посмотрю... Ну, вообще-то изначально мы использовали Enterprise Architect для создания модели и соответствующих таблиц. Он, помимо прочего, позволяет генерить и C# код, и скрипты генерации таблиц в Oracle (кстати, еще и документацию удобно компонует). Вот правда сейчас пошли в обратную сторону - в EA теперь только время от времени импортируется текущее состояние проекта из Visual Studio... Да и вообще это мощное средство используем не так широко, как стоило бы :) Насчет проблем: основное неудобство заключается в том, что хотя мы и проектировали базу с нуля, было принято решение перенести некоторые наработки с предыдущей базы, которая функционирует уже много лет (триггеры, несуррогатные композитные ключи, хранимки с бизнес-логикой) - хибер - молодец, всё это поддерживает, однако если делать по рекомендациям, всё было бы несколько удобнее ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:19 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtor Курдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать. Возможно я действительно дал маху, не разобравшись доподлинно в возможностях инструментов ОРМ. Допускаю, что они уже могут ответить за целостность данных, включая ХП и триггеры, за распределение индексов и таблиц по тэйблспэйсам и мн.др., что ныне умеют CASE-средства моделирования БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:21 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barser, Меня интересовало, какие проблемы с сиквенсами. А теперь заинтересовало, как это "молодец - хибер" поддерживает ХП оракла, напр. с OUT и IN параметрами одновременно (сам над этим убивался, да так и не победил). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:24 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barserмы использовали Enterprise Architect для создания модели и соответствующих таблиц. +1 Тоже его юзаем. Генерим SQL-скрипты, генерим документацию. Классы не генерим, так как используется ORM + своя специфика. SolYUtorКурдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать. Ну почему же, доля правды в его словах есть: CASE + логической схема + физическая схема => генерация БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:31 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Курдльbarser, Меня интересовало, какие проблемы с сиквенсами. А теперь заинтересовало, как это "молодец - хибер" поддерживает ХП оракла, напр. с OUT и IN параметрами одновременно (сам над этим убивался, да так и не победил). Я тоже немало времени на решение убил... В итоге у меня в тестах есть кусок кода вызова хранимки, возвращающий рефкурсор... Храню как память :) А вообще - гораздо проще спускаться на уровень ADO.NET для их вызова... Там важна позиция параметров - out должен идти первым. (на Summer of Nhibernate есть видео на эту тему) Ща запостю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Насчет сиквенсов: вот это Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:38 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barser, ничё не понимаю, у Вас флюент и hbm маппинги в одном флаконе курятся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:41 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
Курдль Возможно я действительно дал маху, не разобравшись доподлинно в возможностях инструментов ОРМ. Допускаю, что они уже могут ответить за целостность данных, включая ХП и триггеры, за распределение индексов и таблиц по тэйблспэйсам и мн.др., что ныне умеют CASE-средства моделирования БД. МСУ Ну почему же, доля правды в его словах есть: CASE + логической схема + физическая схема => генерация БД. Да я не спорю, что сами по себе средства CASE хороши, со всем перечисленными достоинствами. Но хороши они именно для процесса, когда разрабатывается сначала схема БД, потом уже по ней начинают писать приложение. При другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:43 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
МСУbarser, ничё не понимаю, у Вас флюент и hbm маппинги в одном флаконе курятся? У нас всё на флюенте. Просто имхо namedQuery удобнее в xml держать, но мы их практически не используем (пока что) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:46 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
barser, Конечно же я читал и смотрел во все глаза в тырнет насчет ХП с разнокалиберными параметрами. И решения с рефкурсорами действительно есть. А для моего случая (еще более запущенного - ХФ с разными параметрами) - нет. Да, пришлось получать соединение от сессии и там колбасить. У меня ораклевый маппинг как-то попроще: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:48 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtorПри другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов). При другом раскладе, сторонником которого Вы являетесь, на каком этапе удается выявить ошибки моделирования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:53 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtor, Кроме того, чего это вдруг "на начальном этапе, когда объектная модель часто и сильном меняется"? Это что, объекты предметной области и их взаимосвязи сначала беспорядочно возникают из ниоткуда и исчезают бесследно, а потом устаканиваются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:57 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
SolYUtorДа я не спорю, что сами по себе средства CASE хороши, со всем перечисленными достоинствами. Но хороши они именно для процесса, когда разрабатывается сначала схема БД, потом уже по ней начинают писать приложение. Да, разумееется. Если же речь о разворачивании БД у клиента (дистрибутив) - это уже другая песня. На помощь приходит хибероский SchemaExport + дополнительные программные костыли. SolYUtorПри другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов). Хм... Странный подход. Сначала программируете - а потом логика :) P.S. Сначала ТЗ, потом логичекая модель + кейсы, потом физическая (концептуальность можно опустить), потом функциональная спецификация, а уж потом код. В конце - техническая спецификация (её можно писать и перед разработкой, всё зависит от типа проекта). Или я идиот, или Вы что-то не так делаете :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 17:57 |
|
||
|
2 класса для одной сущности (NHibernate)
|
|||
|---|---|---|---|
|
#18+
КурдльSolYUtor, Кроме того, чего это вдруг "на начальном этапе, когда объектная модель часто и сильном меняется"? Это что, объекты предметной области и их взаимосвязи сначала беспорядочно возникают из ниоткуда и исчезают бесследно, а потом устаканиваются? +1 P.S. Как это так, строить дом, и в тех проекте будет всё постоянно меняться. Заложили кирпичную стену, всё стоит. А потом сказали - нах кирпичную, нужно из доски. Сломали кирпичную - заложили доски. Достроили дом. Потом сказали - фундамент нужен не бетонный, как сделали, а из орголита. Ёпт. Снесли дом нах, начали перекладывать фундамент... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 18:00 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36840953&tid=1351090]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
189ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 497ms |

| 0 / 0 |
