CrudRepository, JpaRepository, dan PagingAndSortingRepository di Spring Data

1. Ikhtisar

Dalam artikel singkat ini, kami akan fokus pada berbagai jenis antarmuka repositori Spring Data dan fungsinya. Kami akan membahas:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

Sederhananya, setiap repositori di Spring Data memperluas antarmuka Repositori generik , tetapi di luar itu, masing-masing memiliki fungsionalitas yang berbeda.

2. Repositori Data Musim Semi

Mari kita mulai dengan JpaRepository - yang memperluas PagingAndSortingRepository dan, pada gilirannya, CrudRepository .

Masing-masing mendefinisikan fungsinya sendiri:

  • CrudRepository menyediakan fungsi CRUD
  • PagingAndSortingRepository menyediakan metode untuk melakukan pagination dan mengurutkan record
  • JpaRepository menyediakan metode terkait JPA seperti membersihkan konteks persistensi dan menghapus catatan dalam satu kelompok

Jadi, karena hubungan pewarisan ini, JpaRepository berisi API CrudRepository dan PagingAndSortingRepository lengkap .

Saat kita tidak membutuhkan fungsionalitas penuh yang disediakan oleh JpaRepository dan PagingAndSortingRepository , kita cukup menggunakan CrudRepository .

Sekarang mari kita lihat contoh singkat untuk memahami API ini dengan lebih baik.

Kami akan mulai dengan entitas Produk sederhana :

@Entity public class Product { @Id private long id; private String name; // getters and setters }

Dan mari kita terapkan operasi sederhana - temukan Produk berdasarkan namanya:

@Repository public interface ProductRepository extends JpaRepository { Product findByName(String productName); }

Itu saja. Spring Data Repository akan secara otomatis menghasilkan implementasi berdasarkan nama yang kami berikan.

Ini adalah contoh yang sangat sederhana; Anda dapat mempelajari JPA Spring Data lebih dalam di sini.

3. CrudRepository

Sekarang mari kita lihat kode untuk antarmuka CrudRepository :

public interface CrudRepository extends Repository {  S save(S entity); T findOne(ID primaryKey); Iterable findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }

Perhatikan fungsionalitas CRUD yang khas:

  • simpan (…) - s ave sebuah Iterable dari entitas. Di sini, kita dapat mengirimkan beberapa objek untuk menyimpannya dalam satu batch
  • findOne (…) - dapatkan entitas tunggal berdasarkan nilai kunci utama yang diteruskan
  • findAll () - dapatkan Iterable dari semua entitas yang tersedia dalam database
  • count () - kembali menghitung total entitas dalam sebuah tabel
  • delete (…) - menghapus entitas berdasarkan objek yang dilewatkan
  • existing (…) - verifikasi apakah entitas ada berdasarkan nilai kunci utama yang diteruskan

Antarmuka ini terlihat cukup umum dan sederhana, tetapi sebenarnya, ini menyediakan semua abstraksi kueri dasar yang diperlukan dalam aplikasi.

4. PagingAndSortingRepository

Sekarang, mari kita lihat antarmuka repositori lain, yang memperluas CrudRepository :

public interface PagingAndSortingRepository extends CrudRepository { Iterable findAll(Sort sort); Page findAll(Pageable pageable); }

Antarmuka ini menyediakan metode findAll (Pageable pageable) , yang merupakan kunci untuk mengimplementasikan Pagination.

Saat menggunakan Pageable , kami membuat objek Pageable dengan properti tertentu dan kami telah menentukan setidaknya:

  1. Ukuran halaman
  2. Nomor halaman saat ini
  3. Penyortiran

Jadi, mari kita asumsikan bahwa kita ingin menampilkan halaman pertama dari kumpulan hasil yang diurutkan berdasarkan lastName, ascending, yang masing-masing memiliki tidak lebih dari lima record. Ini adalah bagaimana kita bisa mencapai ini menggunakan definisi PageRequest dan Sort :

Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName")); Pageable pageable = new PageRequest(0, 5, sort);

Meneruskan objek yang dapat halaman ke kueri data Spring akan mengembalikan hasil yang dimaksud (parameter pertama PageRequest adalah berbasis nol).

5. JpaRepository

Terakhir, kita akan melihat antarmuka JpaRepository :

public interface JpaRepository extends PagingAndSortingRepository { List findAll(); List findAll(Sort sort); List save(Iterable entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable entities); }

Sekali lagi, mari kita lihat masing-masing metode ini secara singkat:

  • findAll () - dapatkan Daftar semua entitas yang tersedia dalam database
  • findAll (…) - dapatkan Daftar semua entitas yang tersedia dan urutkan mereka menggunakan kondisi yang disediakan
  • simpan (…) - s ave sebuah Iterable dari entitas. Di sini, kita dapat mengirimkan beberapa objek untuk menyimpannya dalam satu batch
  • flush () - untuk memasukkan semua tugas yang tertunda ke database
  • saveAndFlush (…) - simpan entitas dan hapus perubahan segera
  • deleteInBatch (…) - menghapus Iterable entitas. Di sini, kita dapat mengirimkan beberapa objek untuk menghapusnya dalam satu batch

Jelas, antarmuka di atas memperluas PagingAndSortingRepository yang berarti memiliki semua metode yang ada di CrudRepository juga.

6. Kerugian dari Spring Data Repositories

Beyond all the very useful advantages of these repositories, there are some basic downsides of directly depending on these as well:

  1. we couple our code to the library and to its specific abstractions, such as `Page` or `Pageable`; that's of course not unique to this library – but we do have to be careful not to expose these internal implementation details
  2. by extending e.g. CrudRepository, we expose a complete set of persistence method at once. This is probably fine in most circumstances as well but we might run into situations where we'd like to gain more fine-grained control over the methods exposed, e.g. to create a ReadOnlyRepository that doesn't include the save(…) and delete(…) methods of CrudRepository

7. Conclusion

Artikel ini membahas beberapa perbedaan dan fitur singkat namun penting dari antarmuka repositori JPA Spring Data.

Untuk informasi lebih lanjut, lihat seri Spring Persistence.