Слияние Hibernate следует использовать, когда у вас может быть одновременно несколько экземпляров объекта в текущей памяти, и вы хотите, чтобы Hibernate сохранял все изменения, сделанные в любом экземпляре объекта.Это может произойти, например, когда вы загрузили объект двумя различными способами во время проверки.
Проблема, которая может вызвать путаницу, заключается в разнице между сеансом приложения и сеансом Hibernate.Можно открыть и закрыть более одного сеанса Hibernate во время сеанса приложения.
Если вы загрузите экземпляр объекта в первом сеансе Hibernate, а затем закроете сеанс, этот экземпляр станет отсоединенным.Если вы откроете новый сеанс, затем загрузите тот же объект (с тем же идентификатором), Hibernate создаст новый экземпляр, и если вы попытаетесь использовать saveOrUpdate для объекта, полученного в первом сеансе, Hibernate сгенерирует исключение NonUniqueObjectException.
Таким образом, хотя текущий сеанс Hibernate касается только самого себя, часть его инфраструктуры должна знать о том, какие объекты существуют в более крупном сеансе приложения, которые сопоставлены объектам Hibernate, и, следовательно, должны учитывать такие операции, как сохранение илислияния.
Слияние - это способ сказать Hibernate: «Я хочу, чтобы вы предполагали, что любые изменения, внесенные мной в эту сущность Hibernate, должны быть сохранены, даже если я внес их в другой экземпляр объекта, чем тот, о котором я вас просилсохранить."SaveOrUpdate - это способ сказать Hibernate быть более консервативным и вместо этого выдать исключение.
В этой статье в моем блоге есть еще некоторые подробности о различиях между saveOrUpdate и слиянием Hibernate .