Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 :

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

3. Метод save ()

Как следует из названия, метод save() позволяет нам сохранять объект в БД . Он принадлежит интерфейсу CrudRepository , определенному Spring Data. Давайте посмотрим, как мы можем его использовать:

employeeRepository.save(new Employee(1L, "John"));

Обычно Hibernate сохраняет постоянное состояние в памяти. Процесс синхронизации этого состояния с базовой БД называется сбросом.

Когда мы используем метод save() , данные, связанные с операцией сохранения, не будут сброшены в БД до тех пор, пока не будет сделан явный вызов `` метода flush() или commit() .

Если мы используем реализации JPA, такие как Hibernate, то эта конкретная реализация будет управлять операциями сброса и фиксации.

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

4. Метод saveAndFlush ()

В отличие от save() , метод saveAndFlush () сразу же сбрасывает данные во время выполнения. Этот метод принадлежит интерфейсу JpaRepository Spring Data JPA. Вот как мы это используем:

employeeRepository.saveAndFlush(new Employee(2L, "Alice"));

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

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

5. Вывод

В этой краткой статье мы сосредоточились на различии между методами save() и saveAndFlush() Spring Data JPA .

В большинстве случаев мы будем использовать метод save() . Но иногда нам может понадобиться использовать метод saveAndFlush() для конкретных случаев использования.

Как обычно, пример, который мы здесь обсуждали, можно найти на GitHub .