Почему hibernate делает SELECT перед SAVE? - PullRequest
4 голосов
/ 08 апреля 2011

Почему hibernate делает выбор перед сохранением объекта?

Я не могу найти полезную информацию в интернете. Это нормальное поведение перед каждым сохранением? Я нашел эту тему, выберите Query Run для hibernateTemplate.save () - сохранить, но я не считаю этот ответ "окончательным". Я имею в виду, должны ли мы использовать управление версиями, если я хочу избежать этого выбора перед сохранением каждого объекта?

Буду признателен за все объяснения или ссылки.

Ответы [ 3 ]

3 голосов
/ 24 апреля 2012

Таким образом, Джулия права, вызывая Session.save() с сущностью, которой назначены идентификаторы, в результате hibernate делает SELECT, а затем INSERT.К счастью, есть два обходных пути:

  • Не назначайте свои идентификаторы заранее (не вариант для меня)
  • Звоните Session.persist() вместо Session.save()

Второй вариант также без проблем работает с Энверсом.

Надеюсь, это сэкономит кому-то еще часы охоты.

1 голос
/ 26 июля 2011

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

Просто чтобы уточнить, NHibernate использует 'save' как в 'SQL INSERT' и 'update' как в 'SQL UPDATE'.

Мне известны следующие распространенные сценарии, когда NHibernate будет неявно извлекать объект (без явного использования s.Update) из БД перед его сохранением:

  1. На session_flush /action_commit (в зависимости от настроек), когда в отображении select-before-update установлено значение "true";
  2. Когда используется SaveOrUpdate и идентификатор экземпляра имеет значение, которое предполагает, что он существует в БД;
  3. До того, как s.Delete.

Как и в вашем примере, это может быть неочевидно, когда используются родительские-дочерние объекты (но простые правила остаются прежними), поскольку из кода может быть не очевидно, что потомки будут извлечены.

1 голос
/ 08 апреля 2011

Нет, выбор не выполняется перед сохранением. Вы уверены, что ваш сценарий редактирования-сохранения верен? Общий поток для веб-приложений:

  • пользовательские клики (GET) на / products / 5 / edit
  • сервер извлекает Продукт № 5 в сеанс http
  • сервер возвращает HTML-форму для редактирования. Продукт № 5
  • пользователь отправляет (POST) форму
  • сервер получает продукт № 5 из http сессии
  • сервер заполняет его из запроса
  • сервер объединяет заполненный Продукт № 5 обратно в спящий режим

Будет выполнено одиночное обновление sql, которое также управляет версиями. Если номер версии не синхронизирован, выдается StaleObjectStateException.

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