Gymterview
junior

В чём разница между Repository, CrudRepository и JpaRepository?

Эти интерфейсы образуют иерархию наследования, каждый следующий добавляет функциональность.

Интерфейс Что добавляет
Repository Маркерный интерфейс (без методов)
CrudRepository Базовые CRUD: save, findById, findAll, count, delete
ListCrudRepository (3.0+) То же, но возвращает List вместо Iterable
PagingAndSortingRepository findAll(Sort), findAll(Pageable)
JpaRepository flush, saveAndFlush, deleteInBatch, getReferenceById

Ключевые различия CrudRepository vs JpaRepository

Метод CrudRepository JpaRepository
findAll() Iterable<T> List<T>
flush() Нет Есть
saveAndFlush() Нет Есть
deleteInBatch() Нет Есть (эффективнее)
getReferenceById() Нет Есть (lazy proxy)

Когда что использовать

Пример
// Для большинства случаев -- JpaRepository
public interface UserRepository extends JpaRepository<User, Long> { }

// Если нужен минимум -- CrudRepository
public interface AuditLogRepository extends CrudRepository<AuditLog, Long> { }

// Если нужно ограничить набор методов
@NoRepositoryBean
public interface ReadOnlyRepository<T, ID> extends Repository<T, ID> {
    Optional<T> findById(ID id);
    List<T> findAll();
}

На собеседовании: покажите знание иерархии и когда использовать какой интерфейс. Частая ошибка – использовать getReferenceById() вместо findById() (getReferenceById возвращает прокси, и при обращении к полям вне транзакции будет LazyInitializationException).