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

Spring Data - метод CrudRepository save ()

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

1. Обзор

CrudRepository — это интерфейс данных Spring для общих операций CRUD в репозитории определенного типа. Он предоставляет несколько готовых методов для взаимодействия с базой данных.

В этом руководстве мы объясним, как и когда использовать метод save() CrudRepository . ``

Чтобы узнать больше о репозиториях Spring Data, ознакомьтесь с нашей статьей , в которой CrudRepository сравнивается с другими интерфейсами репозиториев фреймворка.

2. Зависимости

Нам нужно будет добавить зависимости базы данных Spring Data и H2 в наш файл pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

3. Пример приложения

Во-первых, давайте создадим нашу сущность Spring Data с именем MerchandiseEntity . Этот класс будет определять типы данных, которые будут сохраняться в базе данных при вызове `` метода save() :

@Entity
public class MerchandiseEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private double price;

private String brand;

public MerchandiseEntity() {
}

public MerchandiseEntity(String brand, double price) {
this.brand = brand;
this.price = price;
}
}

Далее давайте создадим интерфейс CrudRepository для работы с MerchandiseEntity :

@Repository
public interface InventoryRepository
extends CrudRepository<MerchandiseEntity, Long> {
}

Здесь мы указываем класс объекта и класс идентификатора объекта, MerchandiseEntity и Long . Когда создается экземпляр этого репозитория, базовая логика автоматически устанавливается для работы с нашим классом MerchandiseEntity .

Таким образом, с очень небольшим количеством кода мы уже можем начать использовать метод save() .

4. CrudRepository save() для добавления нового экземпляра

Давайте создадим новый экземпляр MerchandiseEntity и сохраним его в базе данных с помощью InventoryRepository :

InventoryRepository repo = context
.getBean(InventoryRepository.class);

MerchandiseEntity pants = new MerchandiseEntity(
"Pair of Pants", BigDecimal.ONE);
pants = repo.save(pants);

Запуск этого создаст новую запись в таблице базы данных для MerchandiseEntity . Обратите внимание, что мы никогда не указывали идентификатор . Экземпляр изначально создается с нулевым значением для его идентификатора, и когда мы вызываем метод save() , идентификатор генерируется автоматически.

Метод save() возвращает сохраненный объект, включая обновленное поле идентификатора .

5. CrudRepository save() для обновления экземпляра

Мы можем использовать тот же метод save() для обновления существующей записи в нашей базе данных . Предположим, мы сохранили экземпляр MerchandiseEntity с определенным заголовком:

MerchandiseEntity pants = new MerchandiseEntity(
"Pair of Pants", 34.99);
pants = repo.save(pants);

Позже мы обнаружили, что хотели обновить цену товара. Затем мы могли бы просто получить объект из базы данных, внести изменения и использовать метод save() , как и раньше.

Предполагая, что мы знаем идентификатор элемента ( antsId ), мы можем использовать метод CRUDRepository findById для получения нашей сущности из базы данных:

MerchandiseEntity pantsInDB = repo.findById(pantsId).get(); 
pantsInDB.setPrice(44.99);
repo.save(pantsInDB);

Здесь мы обновили нашу исходную сущность новой ценой и сохранили изменения обратно в базу данных.

Мы должны помнить, что вызов save() для обновления объекта внутри транзакционного метода не является обязательным .

Когда мы используем findById() для извлечения объекта в транзакционном методе, возвращенный объект управляется поставщиком постоянства . Таким образом, любое изменение этого объекта будет автоматически сохраняться в базе данных, независимо от того, вызываем ли мы метод save() . Теперь давайте создадим простой тестовый пример, чтобы подтвердить это:

@Test
@Transactional
public void shouldUpdateExistingEntryInDBWithoutSave() {
MerchandiseEntity pants = new MerchandiseEntity(
ORIGINAL_TITLE, BigDecimal.ONE);
pants = repository.save(pants);

Long originalId = pants.getId();

// Update using setters
pants.setTitle(UPDATED_TITLE);
pants.setPrice(BigDecimal.TEN);
pants.setBrand(UPDATED_BRAND);

Optional<MerchandiseEntity> resultOp = repository.findById(originalId);

assertTrue(resultOp.isPresent());
MerchandiseEntity result = resultOp.get();

assertEquals(originalId, result.getId());
assertEquals(UPDATED_TITLE, result.getTitle());
assertEquals(BigDecimal.TEN, result.getPrice());
assertEquals(UPDATED_BRAND, result.getBrand());
}

6. Заключение

В этой краткой статье мы рассмотрели использование метода save() CrudRepository . Мы можем использовать этот метод для добавления новой записи в нашу базу данных, а также для обновления существующей.

Как обычно, код статьи закончился на GitHub .