Разница между спящим и 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.