2014-02-04 4 views
1

Я использую Hibernate 4 и реализую свои DAO и сервисы. Кажется, что я мог бы просто реализовать saveOrUpdate() вместо того, чтобы реализовать save() и update() отдельно, что потребует услуг для проверки того, следует ли вызывать save() или update().Hibernate безопасно использовать SaveOrUpdate?

1) Проверены ли несохраненные значения Hibernate в saveOrUpdate(), которые были оптимизированы для того, чтобы называть это всегда или я должен сам проверить?

2) Is saveOrUpdate() неприменимо, если решение о сохранении или обновлении зависит от поля, отличного от ключа?

+1

AFAIK Hibernate использует 'inserts', если ваша сущность с автоматически генерирующим первичным ключом не имеет никакого ключа, иначе используется команда sql' update'. –

ответ

1

1) Смотрите здесь: Hibernate automatic state detection он говорит

saveOrUpdate() делает не следующее:

-если объект уже настойчивы в этой сессии ничего сделать

-если другого объекта связанное с сеансом, имеет один и тот же идентификатор, генерирует исключение

- если объект не имеет свойства идентификатора, сохраните() его

-если идентификатор объекта имеет значение, присвоенное только что созданного объекта, за исключением() это

-если объект версирован А или, а стоимость версии свойства такое же значение, присвоенное недавно инстанцирован объект, сохранить() это

обновления -otherwise() объект

Таким образом, в некоторых случаях иногда Select выполняется, чтобы увидеть, если объект уже существует (если идентификатор не является каким-то автоматически сгенерированным значением например). Поэтому, если вы делаете это вручную или если вы даете hibernate, это не имеет для меня никакого значения, если бы я сказал, что использование saveOrUpdate имеет лучшую производительность, поскольку сначала выполняется больше проверок, чтобы исключить обновление, это может сэкономить время для некоторых вставок и во-вторых, когда вы делаете проверки самостоятельно, вам нужно пройти через все слои с полным выбором спящего режима при проверке. Также: выполнение проверок само по себе повлияет на удобство обслуживания кода. Например, если вы добавляете кэширование второго уровня, вам может понадобиться оптимизировать сохранение и выбор. Или, если вы применяете некоторые другие настройки, вы можете оказаться в положении, когда вам нужно изменить код во многих других местах.

2) saveOrUpdate учитывает только идентификатор записи. Поэтому да, это непригодно для полей, отличных от ключа.

0

saveOrUpdate() проверяет, имеет ли объект уже ID. Если истинные вызовы update(), в противном случае - save() метод.

+0

Да, я знаю, что saveOrUpdate() проверяет, имеет ли объект идентификатор. Мне интересно, если эта проверка будет достаточно оптимизирована, чтобы использовать все время, а не проверять себя – beng

Смежные вопросы