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 .