Как удалить сущность в nhibernate, имеющую только ее идентификатор и тип?

Array.prototype.combs = function(num) {

    var str = this,
        length = str.length,
        of = Math.pow(2, length) - 1,
        out, combinations = [];

    while(of) {

        out = [];

        for(var i = 0, y; i < length; i++) {

            y = (1 << i);

            if(y & of && (y !== of))
                out.push(str[i]);

        }

        if (out.length >= num) {
           combinations.push(out);
        }

        of--;
    }

    return combinations;
}
16
задан Brian Tompsett - 汤莱恩 4 July 2015 в 12:49
поделиться

1 ответ

Если вы используете отложенную загрузку, Load создает только прокси.

session.Delete(session.Load(type, id));

В NH 2.1 вы можете использовать HQL. Не знаю, как это на самом деле выглядит, но примерно так: обратите внимание, что это зависит от SQL-инъекции - по возможности используйте параметризованные запросы вместо SetParameter ()

session.Delete(string.Format("from {0} where id = {1}", type, id));

Edit:

Для Load вы не нужно знать имя столбца Id.

Если вам нужно его знать, вы можете получить его по метаданным NH:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

Другое редактирование.

session.Delete () is создание экземпляра сущности

При использовании session.Delete () NH все равно загружает сущность. Сначала мне это не понравилось. Тогда я понял преимущества. Если объект является частью сложной структуры, использующей наследование, коллекции или «любые» ссылки, это действительно более эффективно.

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

Такая же ситуация возникает, когда у вас есть коллекция Base , которые являются экземплярами A . При загрузке коллекции в память NH знает, что ему не нужно удалять какие-либо B -материалы.

Если объект A имеет коллекцию B s, который содержит C s (и так далее), он не t попытаться удалить любые C s, когда набор B s пуст. Это возможно только при чтении сборника. Это особенно важно, когда язык C сложен сам по себе, объединяет еще больше таблиц и т. Д.

Чем сложнее и динамичнее структура, тем эффективнее загружать фактические данные, а не «вслепую» их удалять.

1252] Удаление HQL имеет подводные камни

При удалении HQL данные не загружаются в память. Но HQL-удаления не так уж и умны. Они в основном переводят имя объекта в соответствующее имя таблицы и удаляют его из базы данных. Кроме того, он удаляет некоторые агрегированные данные сбора.

В простых структурах это может работать хорошо и эффективно. В сложных структурах не все удаляется, что приводит к нарушениям ограничений или «утечкам памяти базы данных».

Заключение

Я также пытался оптимизировать удаление с помощью NH. В большинстве случаев я сдавался, потому что NH по-прежнему умнее, «просто работает» и обычно достаточно быстр. Один из самых сложных алгоритмов удаления, который я написал, - это анализ определений отображения NH и построение на их основе операторов удаления. И, что не удивительно, это невозможно без чтения данных из базы данных перед удалением. (Я просто сократил его до загрузки только первичных ключей.)

28
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: