Cả hai đều là interface của Spring Data Repository. JpaRepository extends CrudRepository và PagingAndSortingRepository.
Bảng so sánh chi tiết
| STT | Tiêu chí | JpaRepository | CrudRepository |
|---|---|---|---|
| 1 | Đồng cấp (Hierarchy) | Extends CrudRepository + PagingAndSortingRepository |
Interface cơ sở (base), đóng vai trò marker interface |
| 2 | Batch support | Có: deleteInBatch(), flush(), saveAndFlush() |
Chỉ CRUD cơ bản: save, findById, delete... |
| 3 | Phân trang/Sắp xếp | Có sẵn: findAll(Pageable), findAll(Sort) |
Không có |
| 4 | Use case / Khuyến nghị | Gắn chặt với JPA persistence technology → nên tránh nếu muốn vendor-neutral | Nên dùng CrudRepository hoặc PagingAndSortingRepository tùy nhu cầu |
Ví dụ JpaRepository
@Repository
public interface BookDAO extends JpaRepository<Book, Long> {
Book findByAuthor(@Param("id") Integer id);
// Có sẵn: saveAndFlush, deleteInBatch, findAll(Pageable)...
}
Ví dụ CrudRepository
@Repository
public interface BookDAO extends CrudRepository<Book, Long> {
Book findById(@Param("id") Integer id);
// Chỉ CRUD cơ bản
}
Phân cấp interface Spring Data
Repository (marker)
└── CrudRepository (CRUD cơ bản)
└── PagingAndSortingRepository (findAll(Pageable), findAll(Sort))
└── JpaRepository (JPA-specific: flush, batch, getOne...)
└── JpaSpecificationExecutor (Criteria API)
Best Practice
- Ưu tiên CrudRepository hoặc PagingAndSortingRepository để code ít phụ thuộc vào JPA implementation.
- Chỉ dùng JpaRepository khi thực sự cần:
flush(),saveAndFlush(),deleteInBatch(),getOne()(deprecated, dùnggetReference()). - Spring Data JPA 3.x:
getOne()đã deprecated, thay bằnggetReference()(lazy load).