Создание настраиваемого объекта SQL NHibernate

Несколько упрощенный пример ситуации: у меня есть сущности A и B, которые являются невероятно «тяжелыми» объектами предметной области. Загрузка одного из базы данных - довольно сложная задача. Затем у меня есть объект C, который представляет собой очень простой объект со строкой метки, одним A и одним B - оба ленивые.

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

Вместо этого я хочу просто вставить идентификаторы непосредственно в свои объекты C, а затем позволить свойствам A и B полностью загружаться позже, только если это необходимо.

Я вижу тег <sql-insert/> в документации, но раздел В самом деле разрежен.

Есть ли способ делать то, что я хочу делать внутри фреймворка NHibernate, или я должен просто выполнять необработанный SQL? Я пытаюсь сохранить переносимость базы данных, если это возможно, что заставляет меня уклоняться от необработанного варианта. Похоже, мне не хватает лучшего способа.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 539
2

Ответы 2

Я не знаю, позволяет ли это NHibernate (отдельные объекты на одних и тех же базовых данных), но обычно я делаю объекты «переваривания», которые могут быть преобразованы с повышением частоты в полноценные объекты (даже при ленивой загрузке полнофункциональных объектов). Я обычно делаю это с помощью генерируемого кода или вручную слоев ORM.

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

Я добавил "ручной" слой, но я хочу знать, можно ли это сделать, не работая с NHibernate ... так что это определенно было полезно, но это не похоже на "правильный" путь.

Dan Fitch 22.10.2008 01:39

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

Cade Roux 22.10.2008 03:14

Ага, теперь я тебя понимаю. Я не уверен, по какому пути идти, но спасибо за подсказки ... все это немного сложно!

Dan Fitch 22.10.2008 21:20

Дэн - не уверен, что это сработает без тестирования, но попробовать стоит. Я предполагаю, что у вас уже есть идентификаторы, которые вы хотите добавить в свой C - поэтому установите свои ассоциации (я предполагаю, что многие-к-одному) insert = "false" и update = "false" (возможно, cascade = "none "также будет работать в качестве альтернативы). Затем создайте «пустую копию» ваших сущностей A и B, добавьте к ним идентификаторы, добавьте их в C и попытайтесь сохранить C (Session.SaveOrUpdateCopy (C)). Надеюсь, NHibernate не будет пытаться добавить новые объекты A и B в соответствующую таблицу, а просто установит правильные идентификаторы в таблице C - таким образом вам не нужно загружать объекты A и B.

Плохо то, что если вам нужно сохранить или обновить A и B, вам придется делать это напрямую. Другая плохая часть заключается в том, что у меня нет времени тестировать это, поэтому я не знаю, сработает ли это.

Ага, я понимаю, о чем вы говорите. Я не уверен, что подумает NHibernate, если я попытаюсь сделать некаскадное сохранение с A и B в качестве «фиктивных объектов», но я попробую.

Dan Fitch 22.10.2008 01:41

Другие вопросы по теме