NHibernate и каскад удаляет - PullRequest
0 голосов
/ 13 июля 2010

У нас очень глубокий объектный граф, и нам нужен способ удалить корень объектного графа, и это должно произойти быстро.Мы говорим о 1000 строк в 10-15 таблицах.У нас также есть все коллекции, отображенные как AllDeleteOrphan.Мы предположили, что NH выполнит удаление по внешнему ключу, но на самом деле выполняет удаление для каждого элемента в коллекции.Как вы справляетесь с такими ситуациями?

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

в ситуациях, когда вам нужно выполнять массовые операции, вы можете захотеть выполнить некоторые hql / sql непосредственно в сервисе. Инструменты ORM обеспечивают большое удобство, но иногда лучше иметь дело непосредственно с SQL. У нас была похожая ситуация, когда нам приходилось делать глубокую копию графа объектов - это заняло 10 минут в спящем режиме и 2 секунды в подходе, который я только что описал ...

edit - я подумал о твоей озабоченности «пропустить что-нибудь за пределами домена», и я думаю, ты имеешь в виду, что ты не хочешь смешивать проблемы. С подходом, который я описал, вы по-прежнему можете должным образом разделить свои проблемы - я сказал, что поместите методы hql в службу, но я имел в виду, что можно сделать это в DAO. Весь персистентный код в одном месте.

В нашей ситуации мы потратили много времени, пытаясь настроить спящий режим и найти способы сделать его быстрее. Когда старший парень из БД сказал мне просто сделать это в hql, потребовалось около 4 часов, чтобы реализовать правильные тесты, и это было сделано .... Вы действительно должны рассмотреть этот подход, чтобы сэкономить время ...

0 голосов
/ 13 июля 2010

Полагаю, вы заинтересованы в атрибуте on-delete="cascade";см. пример сопоставления:

    <set name="Children" table="Child" cascade="save-update" lazy="true" inverse="true">
        <key column="ParentId" not-null="true" on-delete="cascade" />
        <one-to-many class="Child" />
    </set>

Несколько замечаний по этому поводу:

  1. Это доступно только на обратной стороне отношения
  2. Вы можете выполнить этото же самое сопоставление с использованием access = "none", если оно не соответствует вашей доменной модели (это все равно создает правильное каскадное удаление, если вы генерируете свою базу данных с использованием экспорта схемы)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...