Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa CrudRepository và JpaRepository trong Spring Data

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ùng getReference()).
  • Spring Data JPA 3.x: getOne() đã deprecated, thay bằng getReference() (lazy load).