Разница между спящим и saveOrUpdate методом спящего режима
Обычно я читал о методе save(), который генерирует новый идентификатор для объекта и только fire INSERT и сохраняет его, он не обновляет его, а метод saveOrUpdate() может INSERT или UPDATE.
Но по моему опыту, здесь я могу лучше объяснить пример кода,
Предположим, что существует класс A, и я нахожу запись из таблицы A на
A a = getHibernateTemplate.findById(7);
Итак, теперь я получаю постоянный объект,
И теперь я пытаюсь сохранить запись с помощью метода save, просто изменив некоторые поля,
Теперь я стреляю,
getHibernateTemplate.save(a);
Так что это просто обновить существующую запись, но, согласно моим знаниям , она должна создать новую запись.
Возможно, я ошибаюсь в отношении certian вещей, может ли кто-то понять об этом?
Ответы
Ответ 1
сохранить
Сохранить method
сохраняет object
в базе данных. Он будет упорствовать в данном временном экземпляре, сначала назначая сгенерированный идентификатор.
Это returns
id созданной сущности.
В то время,
SaveOrUpdate()
Вызов либо save()
, либо update()
на основе идентификатора существует или нет. например, если существует идентификатор, будет вызываться update()
или вызывается save()
.
Есть еще много persist(), merge(), saveOrUpdateCopy(). Почти все одинаковы, что дает небольшую функциональность и удобство использования.
Более того, вы можете прочитать это.
Каковы различия между различными методами сохранения в Hibernate?
Ответ 2
Важное различие между методами org.hibernate.Session, save и saveOrUpdate, save
генерирует новый идентификатор и приводит к запросу INSERT, тогда как saveOrUpdate выполняет INSERT или UPDATE.
сохранить
Сохранить метод хранит объект в базе данных. Это означает, что он вставляет запись, если идентификатор не существует, иначе он будет вызывать ошибку. Если первичный ключ уже присутствует в таблице, его нельзя вставить.
saveOrUpdate
Этот метод вызывает save() или update() на основе операции. Если идентификатор существует, он вызывается методом обновления, иначе будет вызван метод сохранения. Метод saveOrUpdate() выполняет следующие действия:
Если объект уже настойчив в текущем сеансе, он ничего не делает Если другой объект, связанный с сеансом, имеет один и тот же идентификатор, генерирует исключение для вызывающего Если объект не имеет свойства идентификатора, сохраните() объект Если идентификатор объекта имеет значение, назначенное недавно созданному объекту, сохраните() объект
Подробнее из здесь.
Ответ 3
save()
должен принимать временный экземпляр как аргумент, а не постоянный экземпляр. Javadoc не очень исчерпывающий, но AFAIK, вызывающий save()
в постоянном экземпляре, не имеет никакого эффекта, кроме каскадирования операции с временными экземплярами, прикрепленными к сущности, настроен такой каскад.
Обратите внимание, что обычно нет причин вызывать save()
или saveOrUpdate()
на прикрепленном, постоянном объекте, поскольку Hibernate dirty проверяет сущности и автоматически сохраняет изменения.
Ответ 4
Поэтому он просто обновляет существующую запись, но, насколько мне известно, она должна создать новую запись: да, она должна создать новую запись. Но это поведение предназначено только для переходных объектов, а не для постоянного объекта.
Когда вы загружаете объект, вызывая нагрузку, этот объект связан с сеансом (постоянное состояние). И из-за грязной проверки этот объект будет в любом случае обновлен во время флеша.
Но если бы этот объект был новым объектом, это фактически имело бы значение при вызове save() или saveoOrUpdate() api.