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).