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 .