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;
}
Если вы используете отложенную загрузку, 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 и построение на их основе операторов удаления. И, что не удивительно, это невозможно без чтения данных из базы данных перед удалением. (Я просто сократил его до загрузки только первичных ключей.)