1) Смотрите здесь: Hibernate automatic state detection он говорит
saveOrUpdate() делает не следующее:
-если объект уже настойчивы в этой сессии ничего сделать
-если другого объекта связанное с сеансом, имеет один и тот же идентификатор, генерирует исключение
- если объект не имеет свойства идентификатора, сохраните() его
-если идентификатор объекта имеет значение, присвоенное только что созданного объекта, за исключением() это
-если объект версирован А или, а стоимость версии свойства такое же значение, присвоенное недавно инстанцирован объект, сохранить() это
обновления -otherwise() объект
Таким образом, в некоторых случаях иногда Select выполняется, чтобы увидеть, если объект уже существует (если идентификатор не является каким-то автоматически сгенерированным значением например). Поэтому, если вы делаете это вручную или если вы даете hibernate, это не имеет для меня никакого значения, если бы я сказал, что использование saveOrUpdate имеет лучшую производительность, поскольку сначала выполняется больше проверок, чтобы исключить обновление, это может сэкономить время для некоторых вставок и во-вторых, когда вы делаете проверки самостоятельно, вам нужно пройти через все слои с полным выбором спящего режима при проверке. Также: выполнение проверок само по себе повлияет на удобство обслуживания кода. Например, если вы добавляете кэширование второго уровня, вам может понадобиться оптимизировать сохранение и выбор. Или, если вы применяете некоторые другие настройки, вы можете оказаться в положении, когда вам нужно изменить код во многих других местах.
2) saveOrUpdate учитывает только идентификатор записи. Поэтому да, это непригодно для полей, отличных от ключа.
AFAIK Hibernate использует 'inserts', если ваша сущность с автоматически генерирующим первичным ключом не имеет никакого ключа, иначе используется команда sql' update'. –