2014-01-18 1 views
77

Я пытаюсь изучить данные весны JPA, проверив некоторую операцию CRUD через JpaRepository.Разница между сохранением и saveAndFlush в данных весны jpa

Я натолкнулся на два метода: save и saveAndFlush. Я не понимаю разницу между этими двумя. При вызове save также мои изменения вносятся в базу данных, так что используется saveAndFlush.

ответ

83

В saveAndFlush изменения будут немедленно сброшены в БД этой командой. С save это не обязательно так, и может оставаться в памяти только до тех пор, пока не будут выведены команды flush или commit.

Но имейте в виду, что даже если вы очистите изменения в транзакции и не совершаете их, изменения по-прежнему не будут видны внешним транзакциям до фиксации в этой транзакции.

В вашем случае вы, вероятно, используете какой-то механизм транзакций, который выдает команду commit для вас, если все будет хорошо.

+5

_ "не будет виден внешним транзакциям до фиксации в этой транзакции" _ Это зависит от уровня изоляции других транзакций. Если уровень изоляции транзакции READ_UNCOMMITTED, то он увидит, что было очищено, но еще не совершено другими транзакциями. –

18

В зависимости от режима спящего режима, который вы используете (AUTO по умолчанию), вы можете сохранить или не записать свои изменения в БД сразу. Когда вы вызываете saveAndFlush, вы выполняете синхронизацию состояния модели с БД.

При использовании флеш-режим AUTO, и вы используете приложение сначала сохранить, а затем снова выберите данные, вы не увидите разницу в bahvior между save() и saveAndFlush(), поскольку выбор триггеров флеш первой. См. documention.

+0

извините, но если я «сохраню» сущность и снова тот же самый, вы имеете в виду «save», вторая команда не будет генерировать исключение для дублирования, например? – azerafati

+2

@Bludream Да, я понимаю, что призывы 'save' являются идемпотентными. См. Эту [нить] (http://stackoverflow.com/questions/161224/what-are-the-differences-between-the-different-saving-methods-in-hibernate) для более подробной информации. – Ralf