JpaRepository

Базовый Spring
≈ 1 мин чтения

Готовый CRUD-интерфейс для JPA

Вместо того чтобы объявлять базовые операции вручную, JPA-репозиторий обычно наследуют от JpaRepository. Он уже содержит методы сохранения, поиска по идентификатору, проверки существования, подсчёта и удаления сущностей.

interface CustomerRepository extends JpaRepository<Customer, Long> {
}

@Service
class CustomerService {
    private final CustomerRepository repository;

    CustomerService(CustomerRepository repository) {
        this.repository = repository;
    }

    Customer rename(long id, String name) {
        Customer customer = repository.findById(id).orElseThrow();
        customer.setName(name);
        return repository.save(customer);
    }
}

У интерфейса снова два типа: сущность Customer и её идентификатор Long. После этого доступны, например, findById, findAll, save, existsById и deleteById.

Что означает save

save не является отдельной от JPA системой сохранения. Для новой сущности Spring Data JPA использует JPA-операцию создания, а для сущности, которую считает существующей, — JPA-механику объединения состояния. Поэтому жизненный цикл сущностей и правила persistence context продолжают иметь значение.

Не вызывайте save после каждого изменения автоматически. Если управляемая сущность изменяется внутри подходящей транзакции, JPA умеет обнаружить изменение самостоятельно. Подробно границы транзакций будут разбираться в отдельном разделе.