1. Обзор
В этом коротком уроке мы обсудим разницу между методами save() и saveAndFlush() в Spring Data JPA .
Несмотря на то, что оба эти метода используются для сохранения сущностей в базе данных, существуют некоторые фундаментальные различия.
2. Пример применения
Давайте сначала посмотрим, как использовать методы save() и saveAndFlush() на примере. В качестве первого шага давайте создадим класс сущностей:
@Entity public class Employee { @Id private Long id; private String name; // constructors // standard getters and setters }
Далее, давайте создадим репозиторий JPA для операций CRUD в классе Employee entity:
public interface EmployeeRepository extends JpaRepository{ }
3. Метод save()
Как видно из названия, метод save() позволяет нам сохранить объект в БД . Он принадлежит интерфейсу CrudRepository , определяемому данными Spring. Давайте посмотрим, как мы можем его использовать:
employeeRepository.save(new Employee(1L, "John"));
Обычно режим гибернации сохраняет постоянное состояние в памяти. Процесс синхронизации этого состояния с базовой БД называется сбросом.
Когда мы используем метод save () , данные, связанные с операцией сохранения, не будут сброшены в БД, если и до тех пор, пока не будет выполнен явный вызов метода flush () | или commit () .
Если мы используем реализации JPA, такие как Hibernate, то эта конкретная реализация будет управлять операциями сброса и фиксации.
Одна вещь, которую мы должны иметь в виду здесь, заключается в том, что если мы решим очистить данные самостоятельно, не фиксируя их, то изменения не будут видны внешней транзакции , если в этой транзакции не будет выполнен вызов фиксации или уровень изоляции внешней транзакции не будет READ_UNCOMMITTED .
4. Метод saveAndFlush()
В отличие от save() , метод saveAndFlush () | сбрасывает данные сразу во время выполнения. Этот метод принадлежит JpaRepository интерфейсу Spring Data JPA. Вот как мы его используем:
employeeRepository.saveAndFlush(new Employee(2L, "Alice"));
Обычно мы используем этот метод, когда нашей бизнес-логике необходимо прочитать сохраненные изменения в более поздний момент во время той же транзакции, но до фиксации.
Например, представьте себе сценарий, в котором мы должны выполнить хранимую процедуру, которая ожидает свойство сущности, которое мы собираемся сохранить. В этом случае метод save() не будет работать, так как изменения не синхронизированы с базой данных и хранимая процедура не знает об изменениях. Метод saveAndFlush() идеально подходит для такого сценария.
5. Заключение
В этой краткой статье мы сосредоточились на разнице между методами Spring Data JPA save() и saveAndFlush () .
В большинстве случаев мы будем использовать метод save () . Но иногда нам может потребоваться использовать метод saveAndFlush() также для конкретных случаев использования.
Как обычно, краткий пример, который мы обсуждали здесь, можно найти на GitHub .