Spring Data JPA @Modifying Annotation

1. Perkenalan

Dalam tutorial singkat ini, kita akan mempelajari cara membuat kueri pembaruan dengan anotasi JPA @Query Spring Data . Kami akan mencapai ini dengan menggunakan anotasi @Modifying .

Pertama, kami akan menyegarkan memori kami dan melihat cara membuat kueri menggunakan Spring Data JPA. Setelah itu, kita akan mendalami penggunaan @Query dan anotasi @Modifying . Akhirnya, kita akan melihat bagaimana mengelola keadaan konteks ketekunan kita saat menggunakan kueri modifikasi.

2. Querying di Spring Data JPA

Pertama, mari kita rekap 3 mekanisme yang disediakan Spring Data JPA untuk membuat kueri data dalam database :

  • Metode kueri
  • @ Anotasi kueri
  • Penerapan repositori kustom

Mari buat kelas Pengguna dan repositori JPA Data Musim Semi yang cocok untuk menggambarkan mekanisme ini:

@Entity @Table(name = "users", schema = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; private LocalDate creationDate; private LocalDate lastLoginDate; private boolean active; private String email; }
public interface UserRepository extends JpaRepository {}

Mekanisme metode kueri memungkinkan kita untuk memanipulasi data dengan mendapatkan kueri dari nama metode:

List findAllByName(String name); void deleteAllByCreationDateAfter(LocalDate date);

Dalam contoh ini, kita bisa menemukan kueri yang mengambil pengguna menurut namanya, atau kueri yang menghapus pengguna yang memiliki tanggal pembuatan setelah tanggal tertentu.

Sedangkan untuk anotasi @Query , ini memberi kita kemungkinan untuk menulis kueri JPQL atau SQL tertentu di anotasi @Query :

@Query("select u from User u where u.email like '%@gmail.com'") List findUsersWithGmailAddress();

Dalam cuplikan kode ini, kita dapat melihat kueri yang mengambil pengguna yang memiliki alamat email @ gmail.com .

Mekanisme pertama memungkinkan kita untuk mengambil atau menghapus data. Sedangkan untuk yang kedua, ini memungkinkan kita untuk mengeksekusi hampir semua kueri. Namun, untuk memperbarui kueri, kita harus menambahkan anotasi @Modifying . Ini akan menjadi topik tutorial ini.

3. Menggunakan Anotasi @Modifying

The @Modifying penjelasan digunakan untuk meningkatkan @query penjelasan untuk mengeksekusi tidak hanya SELECT query tetapi juga INSERT , UPDATE , DELETE , dan bahkan DDL query.

Mari bermain-main dengan anotasi ini sedikit dan lihat terbuat dari apa.

Pertama, mari kita lihat contoh kueri @Modifying UPDATE:

@Modifying @Query("update User u set u.active = false where u.lastLoginDate < :date") void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);

Di sini, kami menonaktifkan pengguna yang tidak masuk sejak tanggal tertentu.

Mari coba yang lain di mana kami akan menghapus pengguna yang dinonaktifkan:

@Modifying @Query("delete User u where u.active = false") int deleteDeactivatedUsers();

Seperti yang bisa kita lihat, metode ini mengembalikan integer. Ini adalah fitur kueri Spring Data JPA @Modifying yang memberi kami jumlah entitas yang diperbarui.

Kami harus dicatat bahwa mengeksekusi query delete dengan @query bekerja secara berbeda dari musim semi data JPA ini deleteBy metode query nama yang diturunkan. Yang terakhir pertama mengambil entitas dari database dan kemudian menghapusnya satu per satu. Jadi, ini berarti metode siklus hidup @PreRemove akan dipanggil pada entitas tersebut. Namun, dengan yang pertama, satu kueri dieksekusi terhadap database.

Terakhir, mari tambahkan kolom yang dihapus ke tabel USERS dengan kueri DDL :

@Modifying @Query(value = "alter table USERS.USERS add column deleted int(1) not null default 0", nativeQuery = true) void addDeletedColumn();

Sayangnya, menggunakan kueri modifikasi membuat konteks ketekunan yang mendasarinya menjadi usang. Bagaimanapun, adalah mungkin untuk mengelola situasi ini. Itulah pokok bahasan pada bagian selanjutnya.

4. Mengelola Konteks Ketekunan

Jika kueri modifikasi kami mengubah entitas yang terdapat dalam konteks persistensi, maka konteks ini menjadi usang. Salah satu cara untuk mengelola situasi ini adalah dengan menghapus konteks persistensi. Dengan melakukan itu, kami memastikan bahwa konteks persistensi akan mengambil entitas dari database di lain waktu.

Namun, kita tidak harus memanggil metode clear () secara eksplisit di EntityManager . Kita bisa menggunakan properti clearAutomatically dari anotasi @Modifying :

@Modifying(clearAutomatically = true)

Dengan begitu, kami memastikan bahwa konteks persistensi dihapus setelah eksekusi kueri kami.

Tapi, bagaimana jika konteks ketekunan kita mengandung perubahan yang tidak jelas? Oleh karena itu, menghapusnya berarti menghapus perubahan yang belum disimpan. Untungnya, ada properti anotasi lain yang bisa kita gunakan - flushAutomatically :

@Modifying(flushAutomatically = true)

Sekarang, EntityManager dihapus sebelum kueri kami dieksekusi.

5. Kesimpulan

Sekian artikel singkat tentang anotasi @Modifying ini . Kami telah melihat cara menggunakan anotasi ini untuk menjalankan kueri pembaruan seperti INSERT, UPDATE, DELETE, dan bahkan DDL . Setelah itu, kita belajar cara mengelola status konteks persistensi dengan properti clearAutomatically dan flushAutomatically .

Seperti biasa, kode lengkap untuk artikel ini tersedia di GitHub.