powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / 2 класса для одной сущности (NHibernate)
25 сообщений из 38, страница 1 из 2
2 класса для одной сущности (NHibernate)
    #36840655
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересует, жизнеспособно ли решение? Может, кто применял нечто подобное...

В модели предметной области создаем 2 класса, отображаемых на одну таблицу (для наглядности - Document и DocumentLight).

Один из них (Document) - в полной мере описывает какую-либо сущность предметной области. У этого класса есть наследники (SubDocument1, ... , SubDocumentN).

Второй класс (DocumentLight) - облегченный и используется только для чтения. В нем замэплены лишь несколько самых необходимых свойств. Наследников у него гарантированно нет, и применяется он для быстрого запроса списков с достаточным минимумом информации (основное поле - это идентификатор id). Далее уже для конкретного id, выбранного в списке DocumentLight, будет извлекаться объект класса Document (а точнее одного из его подклассов, NHibernate определит автоматически).

При этом при построении списка из DocumentLight мы осуществляем запрос только к одной таблице - обходимся без join'ов со всеми таблицами подклассов...

Как-то так....
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840698
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barser,

Ваше задача легко и непринуждённо решается HQL-запросами "select new". И не надо мапить вторую сущность.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840714
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

Спасибо большое за наводку! Пойду читать доки...

ps. сам никак не мог найти свойства, отключающее подгрузку подклассов...
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840738
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorbarser,

Ваше задача легко и непринуждённо решается HQL-запросами "select new". И не надо мапить вторую сущность.
А критериальными проекциями не решается?
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840765
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserИнтересует, жизнеспособно ли решение?
Не жизнеспособно. Во-первых, это реально не нужно (детское ребячество отбросим), во-вторых, при таком подходе нельзя будет сгенерить БД по маппингам.

Одна таблица - один класс. Все остальные потуги вколбасить в маппинги енумы, проецирующиеся с реальных таблиц и иже - самозаёп. Да и только.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840818
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдль
А критериальными проекциями не решается?

Судя по всему, решается... В предыдущем посте дали направление, в каком копать, и вот, похоже, нашел то что нужно - с проекциями и трансформерами.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840892
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
А критериальными проекциями не решается?

Это одно и тоже, только способ применения разный. Но лично для меня HQL приятнее, нежели ICriteria. Поэтому я его и посоветовал.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840894
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУbarserИнтересует, жизнеспособно ли решение?
Не жизнеспособно. Во-первых, это реально не нужно (детское ребячество отбросим), во-вторых, при таком подходе нельзя будет сгенерить БД по маппингам.

Одна таблица - один класс. Все остальные потуги вколбасить в маппинги енумы, проецирующиеся с реальных таблиц и иже - самозаёп. Да и только.

Понял, спасибо за ответ.

Одна таблица - один класс...
Именно этого принципа стараюсь придерживаться.
Однако, к примеру, когда у документа есть штук 5 наследников, вызов getEntity(typeof(Document)) генерирует sql-запрос c пятью join'ами... И с ростом числа наследников число join'ов соответственно возрастает... Так-то пока все работает как часы, но не хотелось бы столкнуться с проблемами в будущем. Вот нашел время, чтобы убрать эти join'ы там, где они 100% не нужны. А наиболее подходящей методики для этого не знал/не нашел (еще думал, как вариант, использовать createSQLQuery() )

Немного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал.
Но в текущем - у меня нет полномочий определять _все_ архитектурные решения, а также недостаточно опыта для этого...
Вначале были приняты правила, по которым мы создаем таблицы вручную и после этого мэппим с классами. Так что сейчас этот плюс неактуален.
Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов не дает тестировать слой DAO на базе sqlite без внесений изменений во все части мэппинга... а могло бы быть гораздо удобнее... ну и т.п....
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840914
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserНемного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал.

мы создаем таблицы вручную

Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД.
Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД.

barser
Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов...

А тут подробнее - что за проблемы и какие альтернативы?
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840922
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserОдна таблица - один класс
Я не совсем правильно выразился: если же речь о многие-ко-многим, то писать класс под промежуточную таблицу не нужно. Нужно только правильно смаппить. И тогда при генерации БД из маппингов промежуточная таблица создастся с констреинтами и всё будет хорошо.
Но, это-лишь исключение.

barserОднако, к примеру, когда у документа есть штук 5 наследников, вызов getEntity(typeof(Document)) генерирует sql-запрос c пятью join'ами... И с ростом числа наследников число join'ов соответственно возрастает... Так-то пока все работает как часы, но не хотелось бы столкнуться с проблемами в будущем. Вот нашел время, чтобы убрать эти join'ы там, где они 100% не нужны. А наиболее подходящей методики для этого не знал/не нашел (еще думал, как вариант, использовать createSQLQuery() )
Всё правильно - красота требует жертв. Вы тогда столкнетесь с оптимизацией. И тут на помощь придёт отдельный SQL запрос с типизацией результата (SetResultTransformer).

barserВначале были приняты правила, по которым мы создаем таблицы вручную и после этого мэппим с классами. Так что сейчас этот плюс неактуален.
Ну я тоже так работаю, но если потребуется развернуть БД из схемы - не вопрос.
Конечно, если используются хранимые процедуры и прочее - это придется дозалить, но самое главное (таблицы и отношения между ними) + инициализация системных значений справочников будет исполнено без каким-либо телодвижений.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840942
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД.
Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД.


Курдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840947
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльbarserНемного не по теме - генерация БД по маппингам - наверное, удобная фича и в следующем проекте я бы ее с удовольствием опробовал.

мы создаем таблицы вручную

Не рекомендую делать ни первое, ни второе. Воспользуйтесь специализированными CASE-инструментами для создания логической, концептуальной, а из нее - физической модели БД. Потом получите скрипт для любой СУБД.
Ни одна из ОРМ или сред разработки DDD и близко не подошла к тому качественному уровню, на котором сейчас находятся старые-добрые средства создания БД.

barser
Кстати, неудобство некоторых правил, принятых вначале, сейчас становится очевидно - например, тот факт, что в качестве id используем number из оракловых сиквенсов...

А тут подробнее - что за проблемы и какие альтернативы?

Ок, спасибо, посмотрю...
Ну, вообще-то изначально мы использовали Enterprise Architect для создания модели и соответствующих таблиц. Он, помимо прочего, позволяет генерить и C# код, и скрипты генерации таблиц в Oracle (кстати, еще и документацию удобно компонует). Вот правда сейчас пошли в обратную сторону - в EA теперь только время от времени импортируется текущее состояние проекта из Visual Studio... Да и вообще это мощное средство используем не так широко, как стоило бы :)

Насчет проблем: основное неудобство заключается в том, что хотя мы и проектировали базу с нуля, было принято решение перенести некоторые наработки с предыдущей базы, которая функционирует уже много лет (триггеры, несуррогатные композитные ключи, хранимки с бизнес-логикой) - хибер - молодец, всё это поддерживает, однако если делать по рекомендациям, всё было бы несколько удобнее )
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840953
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor
Курдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать.

Возможно я действительно дал маху, не разобравшись доподлинно в возможностях инструментов ОРМ.
Допускаю, что они уже могут ответить за целостность данных, включая ХП и триггеры, за распределение индексов и таблиц по тэйблспэйсам и мн.др., что ныне умеют CASE-средства моделирования БД.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840959
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barser,

Меня интересовало, какие проблемы с сиквенсами.
А теперь заинтересовало, как это "молодец - хибер" поддерживает ХП оракла, напр. с OUT и IN параметрами одновременно (сам над этим убивался, да так и не победил).
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840967
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserмы использовали Enterprise Architect для создания модели и соответствующих таблиц.
+1
Тоже его юзаем. Генерим SQL-скрипты, генерим документацию. Классы не генерим, так как используется ORM + своя специфика.

SolYUtorКурдль, не говорите ерундой! Если в чём-то не разбираетесь, то лучше уж немножечко помолчать.
Ну почему же, доля правды в его словах есть: CASE + логической схема + физическая схема => генерация БД.
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840985
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдльbarser,

Меня интересовало, какие проблемы с сиквенсами.
А теперь заинтересовало, как это "молодец - хибер" поддерживает ХП оракла, напр. с OUT и IN параметрами одновременно (сам над этим убивался, да так и не победил).

Я тоже немало времени на решение убил... В итоге у меня в тестах есть кусок кода вызова хранимки, возвращающий рефкурсор... Храню как память :) А вообще - гораздо проще спускаться на уровень ADO.NET для их вызова...
Там важна позиция параметров - out должен идти первым. (на Summer of Nhibernate есть видео на эту тему)

Ща запостю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="GF.Core.Domain" assembly="GF.Core">
  <sql-query name="Test3">
    <return alias="People" class="Person"></return>
    { call testproc3}
  </sql-query>
</hibernate-mapping>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        /// <summary>
        /// Вызов хранимой процедуры Testproc3, возвращающей RefCursor, на уровне NHibernate
        /// </summary>
        [Test]
        public void CanCallStoredProcedureViaNHibernate()
        {
            var p1 = NHibernateSession.Current.GetNamedQuery("Test3")
            .List<Person>();
            var p2 = NHibernateSession.Current.CreateQuery("from Person").List<Person>();
            Assert.IsTrue(p1.Count == p2.Count);
        }

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE PROCEDURE TestProc3(
outcur OUT sys_refcursor
)
AS
BEGIN
 OPEN outcur FOR
   SELECT * FROM CONTRAGENTS c, PEOPLE p WHERE c.ID = P.FK_CONTRAGENT ;
END; 

Насчет сиквенсов:
вот это
Код: plaintext
mapping.Id(x => x.Id).UnsavedValue(0).GeneratedBy.Sequence("ACCOUNT_SEQ");
приходится менять на что-нить типа ....GeneratedBy.Native(); так как sqlite не понимает, о чем речь
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840992
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barser, ничё не понимаю, у Вас флюент и hbm маппинги в одном флаконе курятся?
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36840997
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
Возможно я действительно дал маху, не разобравшись доподлинно в возможностях инструментов ОРМ.
Допускаю, что они уже могут ответить за целостность данных, включая ХП и триггеры, за распределение индексов и таблиц по тэйблспэйсам и мн.др., что ныне умеют CASE-средства моделирования БД.

МСУ
Ну почему же, доля правды в его словах есть: CASE + логической схема + физическая схема => генерация БД.

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

При другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов).
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841002
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУbarser, ничё не понимаю, у Вас флюент и hbm маппинги в одном флаконе курятся?

У нас всё на флюенте.
Просто имхо namedQuery удобнее в xml держать, но мы их практически не используем (пока что)
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841003
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barser,

Конечно же я читал и смотрел во все глаза в тырнет насчет ХП с разнокалиберными параметрами.
И решения с рефкурсорами действительно есть. А для моего случая (еще более запущенного - ХФ с разными параметрами) - нет. Да, пришлось получать соединение от сессии и там колбасить.

У меня ораклевый маппинг как-то попроще:
Код: plaintext
1.
Id(x => x.DOC_ID).Column("DOC_ID").GeneratedBy.Native("SEQ_DOC_ID");
Так куда денешься, ели некоторые СУБД имеют последовательности, некоторые - генераторы, а некоторые ублюдочные - только недавно доросли до IDENT_CURRENT ;)
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841013
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorПри другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов).

При другом раскладе, сторонником которого Вы являетесь, на каком этапе удается выявить ошибки моделирования?
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841018
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Кроме того, чего это вдруг "на начальном этапе, когда объектная модель часто и сильном меняется"?
Это что, объекты предметной области и их взаимосвязи сначала беспорядочно возникают из ниоткуда и исчезают бесследно, а потом устаканиваются?
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841020
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorДа я не спорю, что сами по себе средства CASE хороши, со всем перечисленными достоинствами. Но хороши они именно для процесса, когда разрабатывается сначала схема БД, потом уже по ней начинают писать приложение.
Да, разумееется. Если же речь о разворачивании БД у клиента (дистрибутив) - это уже другая песня. На помощь приходит хибероский SchemaExport + дополнительные программные костыли.

SolYUtorПри другом раскладе (сторонником которого я являюсь), когда изначально создаётся объектная модель системы, а потом уже схема БД. В таком случае кейсы приведут лишь к бессмысленной двойной работе. Особенно на начальном этапе, когда объектная модель часто и сильном меняется. В этом случае гораздо проще юзать хиберовский SchemaExport (особенного для интеграционных тестов).
Хм... Странный подход. Сначала программируете - а потом логика :)

P.S. Сначала ТЗ, потом логичекая модель + кейсы, потом физическая (концептуальность можно опустить), потом функциональная спецификация, а уж потом код. В конце - техническая спецификация (её можно писать и перед разработкой, всё зависит от типа проекта).

Или я идиот, или Вы что-то не так делаете :)
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841024
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльSolYUtor,

Кроме того, чего это вдруг "на начальном этапе, когда объектная модель часто и сильном меняется"?
Это что, объекты предметной области и их взаимосвязи сначала беспорядочно возникают из ниоткуда и исчезают бесследно, а потом устаканиваются?

+1

P.S. Как это так, строить дом, и в тех проекте будет всё постоянно меняться. Заложили кирпичную стену, всё стоит. А потом сказали - нах кирпичную, нужно из доски. Сломали кирпичную - заложили доски. Достроили дом. Потом сказали - фундамент нужен не бетонный, как сделали, а из орголита. Ёпт. Снесли дом нах, начали перекладывать фундамент...
...
Рейтинг: 0 / 0
2 класса для одной сущности (NHibernate)
    #36841029
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserПросто имхо namedQuery удобнее в xml держать, но мы их практически не используем (пока что)
+1
Так и делаю.
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / 2 класса для одной сущности (NHibernate)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]