Apa perbedaan antara antarmuka CrudRepository dan JpaRepository di Spring Data JPA?

Jawaban:

956

JpaRepositorymeluas PagingAndSortingRepositoryyang pada gilirannya meluas CrudRepository.

Fungsi utamanya adalah:

  • CrudRepository terutama menyediakan fungsi CRUD.
  • PagingAndSortingRepository menyediakan metode untuk melakukan pagination dan menyortir catatan.
  • JpaRepository menyediakan beberapa metode terkait JPA seperti membilas konteks kegigihan dan menghapus catatan dalam satu batch.

Karena warisan yang disebutkan di atas, JpaRepositoryakan memiliki semua fungsi CrudRepositorydan PagingAndSortingRepository. Jadi, jika Anda tidak memerlukan repositori untuk memiliki fungsi yang disediakan oleh JpaRepositorydan PagingAndSortingRepository, gunakan CrudRepository.

Ken Chan
sumber
143
dan mengembalikan Daftar <> alih-alih Iterable <> di findAll () :-)
Hinotori
397

Jawaban Ken pada dasarnya benar, tetapi saya ingin mengatakan "mengapa Anda ingin menggunakannya?" bagian dari pertanyaan Anda.

Dasar-dasar

Antarmuka dasar yang Anda pilih untuk repositori Anda memiliki dua tujuan utama. Pertama, Anda mengizinkan infrastruktur repositori Spring Data untuk menemukan antarmuka Anda dan memicu pembuatan proksi sehingga Anda menyuntikkan instance antarmuka ke klien. Tujuan kedua adalah untuk menarik sebanyak mungkin fungsionalitas yang diperlukan ke antarmuka tanpa harus mendeklarasikan metode tambahan.

Antarmuka umum

Pustaka inti Spring Data dikirimkan dengan dua antarmuka dasar yang memperlihatkan serangkaian fungsi khusus:

  • CrudRepository - Metode CRUD
  • PagingAndSortingRepository- metode untuk pagination dan sorting (memanjang CrudRepository)

Antarmuka khusus toko

Modul-modul toko individual (misalnya untuk JPA atau MongoDB) memaparkan ekstensi khusus toko dari antarmuka dasar ini untuk memungkinkan akses ke fungsionalitas khusus toko seperti pembilasan atau pengumpulan khusus yang mempertimbangkan beberapa toko spesifik ke dalam akun. Contoh untuk ini adalah deleteInBatch(…)dari JpaRepositoryyang berbeda dari delete(…)karena menggunakan query untuk menghapus entitas yang diberikan yang lebih performant tapi datang dengan efek samping dari tidak memicu kaskade JPA-didefinisikan (sebagai mendefinisikan spec).

Kami umumnya merekomendasikan untuk tidak menggunakan antarmuka dasar ini karena mereka mengekspos teknologi persistensi yang mendasari kepada klien dan dengan demikian mempererat sambungan antara mereka dan repositori. Plus, Anda mendapatkan sedikit dari definisi asli repositori yang pada dasarnya adalah "kumpulan entitas". Jadi jika Anda bisa, tetaplah bersama PagingAndSortingRepository.

Antarmuka basis repositori kustom

Kelemahan dari secara langsung tergantung pada salah satu antarmuka dasar yang disediakan adalah dua kali lipat. Keduanya mungkin dianggap sebagai teori tetapi saya pikir mereka penting untuk diperhatikan:

  1. Bergantung pada antarmuka repositori Data Spring pasangan antarmuka repositori Anda ke perpustakaan. Saya tidak berpikir ini adalah masalah khusus karena Anda mungkin akan menggunakan abstraksi seperti Pageatau Pageabledalam kode Anda. Data Musim Semi tidak berbeda dari perpustakaan tujuan umum lainnya seperti commons-lang atau Guava. Asalkan memberikan manfaat yang masuk akal, tidak apa-apa.
  2. Dengan memperluas mis CrudRepository, Anda mengekspos satu set lengkap metode kegigihan sekaligus. Ini mungkin baik-baik saja di sebagian besar keadaan juga, tetapi Anda mungkin mengalami situasi di mana Anda ingin mendapatkan kontrol yang lebih baik atas metode mengekspos, misalnya untuk membuat ReadOnlyRepositoryyang tidak termasuk save(…)dan delete(…)metode CrudRepository.

Solusi untuk kedua kelemahan ini adalah membuat antarmuka repositori dasar Anda sendiri atau bahkan satu set. Dalam banyak aplikasi saya telah melihat sesuatu seperti ini:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

Antarmuka repositori pertama adalah beberapa antarmuka basis tujuan umum yang sebenarnya hanya memperbaiki titik 1 tetapi juga mengikat tipe ID Longuntuk konsistensi. Antarmuka kedua biasanya memiliki semua find…(…)metode yang disalin CrudRepositorydan PagingAndSortingRepositorytetapi tidak mengekspos yang memanipulasi. Baca lebih lanjut tentang pendekatan itu dalam dokumentasi referensi .

Ringkasan - tl; dr

Abstraksi repositori memungkinkan Anda untuk memilih repositori dasar yang sepenuhnya digerakkan oleh kebutuhan arsitektur dan fungsional Anda. Gunakan yang disediakan di luar kotak jika sesuai, buat antarmuka basis repositori Anda sendiri jika perlu. Jauhi antarmuka repositori khusus toko kecuali tidak dapat dihindari.

Oliver Drotbohm
sumber
84

masukkan deskripsi gambar di sini

Ringkasan:

  • PagingAndSortingRepository meluas CrudRepository

  • JpaRepository memperluas PagingAndSortingRepository

The CrudRepository antarmuka menyediakan metode untuk operasi CRUD, sehingga memungkinkan Anda untuk membuat, membaca, memperbarui dan catatan delete tanpa harus menentukan metode Anda sendiri.

The PagingAndSortingRepository menyediakan metode tambahan untuk mengambil entitas menggunakan pagination dan penyortiran.

Akhirnya JpaRepository menambahkan beberapa fungsionalitas lain yang khusus untuk JPA.

Joby Wilson Mathews
sumber
Bagaimana dengan "extends Repository <>"? Metode apa yang akan dimilikinya? Sama seperti CrudRepository?
s-kaczmarek
15

Saya belajar Spring Data JPA. Ini mungkin membantu Anda: masukkan deskripsi gambar di sini

Evan
sumber
3

Semua jawaban memberikan rincian yang cukup untuk pertanyaan itu. Namun, izinkan saya menambahkan sesuatu yang lebih.

Mengapa kami menggunakan Antarmuka ini:

  • Mereka memungkinkan Spring untuk menemukan antarmuka repositori Anda dan membuat objek proxy untuk mereka.
  • Ini memberi Anda metode yang memungkinkan Anda untuk melakukan beberapa operasi umum (Anda juga dapat menentukan metode kustom Anda). Saya suka fitur ini karena membuat metode (dan mendefinisikan kueri dan menyiapkan pernyataan dan kemudian menjalankan kueri dengan objek koneksi) untuk melakukan operasi sederhana benar-benar menyebalkan!

Antarmuka yang melakukan apa:

  • CrudRepository : menyediakan fungsi CRUD
  • PagingAndSortingRepository : menyediakan metode untuk melakukan pagination dan mengurutkan catatan
  • JpaRepository : menyediakan metode terkait JPA seperti membilas konteks kegigihan dan menghapus catatan dalam batch

Kapan harus menggunakan antarmuka mana:

Menurut http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

Secara umum ide terbaik adalah menggunakan CrudRepository atau PagingAndSortingRepository tergantung pada apakah Anda perlu menyortir dan paging atau tidak.

The JpaRepository harus dihindari jika mungkin, karena hubungan Anda repositori untuk teknologi kegigihan JPA, dan dalam kebanyakan kasus Anda mungkin bahkan tidak akan menggunakan metode ekstra yang disediakan oleh itu.

Rahul Vala
sumber