Рубрики
Без рубрики

Разница между save() и saveAndFlush() в Spring Data JPA

Узнайте о разнице между методами save() и saveAndFlush() в Spring Data JPA

Автор оригинала: baeldung.

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 .