NHibernate дополнительный запуск запроса UPDATE - PullRequest
0 голосов
/ 21 июля 2009

У меня есть отношение "многие ко многим", определенное между двумя объектами с использованием таблицы ассоциации и cascade = "save-update".

Entity1 содержит список Entity2, и, наоборот, Entity2 содержит список Entity1. SQL, выводимый из этого потока операций, выглядит нормально ...

  1. Создание объекта Entity1 и Entity2
  2. Добавить Entity2 в список на Entity1
  3. Вызов сеанса. Сохранение на Entity1

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

Однако, если я сначала вызову сеанса. Сохраните в Entity2, добавьте его в список, затем вызовите сеанс. Сохраните в Entity1 дополнительный прогон инструкции UPDATE, который устанавливает все значения Entity2 точно в так же, как то, что было вставлено в начале.

Хотя это и не вызывает каких-либо проблем, это дополнительный запрос, снижающий производительность. Я играл с обратным атрибутом, но это не устраняет дополнительный оператор обновления. В настоящее время обе стороны имеют значение inverse = "false", так как я хочу, чтобы таблица ассоциации обновлялась независимо от того, какая сущность сохранена.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 июля 2009

Спасибо за ответ, но я считаю, что нашел проблему. У меня был класс репозитория для каждого типа объекта, который реализовал операции CRUD. Каждая операция CRUD запускала свой собственный сеанс / транзакцию, называемую Save / Update / etc, а затем закрывала транзакцию / сеанс.

Если я вызываю session.Save для Entity2, затем session.Save для Entity1 (который содержит список Entity2) NH, кажется, знает, что он уже сохранил Entity2 в сеансе и, следовательно, не пытается обновить запись.

С другой стороны, если я вызываю session.Save для Entity2, затем session.Save для Entity1 в отдельном сеансе / транзакции, он хочет обновить Entity2 снова. Я новичок в NH, поэтому не уверен, как он отслеживает, какие объекты требуют обновления, но он должен сбрасываться между сессиями?

Kinda делает мои хорошие DDD-репозитории немного менее полезными! Может быть, хранилища должны использовать одноэтапную сессию или что-то подобное, чтобы избежать этой проблемы?

Спасибо, John

0 голосов
/ 21 июля 2009

Из документов: inverse (необязательно - по умолчанию false): если включено, Hibernate не будет пытаться вставить или обновить свойства, определенные этим объединением.

Мое предложение: в некоторых случаях для предотвращения дополнительных обновлений с помощью двусторонних объединений ОБА коллекции могут потребоваться обновления:

Contact c;
Address a;    
c.Addresses.Add(a);
a.Contacts.Add(c);

Вы, вероятно, получаете дополнительный оператор Update, потому что обе стороны имеют inverse = false и список отношений первого объекта был сохранен пустым. NH делает только то, что считает необходимым для обновления всех отношений.

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