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 JpaRepository
yang 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:
- 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
Page
atau Pageable
dalam 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.
- 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 ReadOnlyRepository
yang 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 Long
untuk konsistensi. Antarmuka kedua biasanya memiliki semua find…(…)
metode yang disalin CrudRepository
dan PagingAndSortingRepository
tetapi 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.