@DynamicUpdate dengan Spring Data JPA

1. Ikhtisar

Saat kami menggunakan Spring Data JPA dengan Hibernate, kami juga dapat menggunakan fitur tambahan Hibernate. @DynamicUpdate adalah salah satu fiturnya.

@DynamicUpdate adalah anotasi tingkat kelas yang dapat diterapkan ke entitas JPA. Ini memastikan bahwa Hibernate hanya menggunakan kolom yang dimodifikasi dalam pernyataan SQL yang dihasilkannya untuk pembaruan entitas .

Dalam artikel ini, kita akan melihat anotasi @DynamicUpdate , dengan bantuan contoh JPA Data Musim Semi .

2. JPA @Entity

Saat aplikasi dimulai, Hibernate menghasilkan pernyataan SQL untuk operasi CRUD semua entitas. Pernyataan SQL ini dibuat sekali dan di-cache, dalam memori, untuk meningkatkan kinerja.

Pernyataan pembaruan SQL yang dihasilkan mencakup semua kolom dari suatu entitas. Jika kami memperbarui entitas, nilai kolom yang dimodifikasi diteruskan ke pernyataan pembaruan SQL. Untuk kolom yang tidak diperbarui, Hibernate menggunakan nilai yang ada untuk pembaruan.

Mari kita coba memahami ini dengan sebuah contoh. Pertama, mari pertimbangkan entitas JPA bernama Akun :

@Entity public class Account { @Id private int id; @Column private String name; @Column private String type; @Column private boolean active; // Getters and Setters }

Selanjutnya, mari tulis repositori JPA untuk entitas Akun :

@Repository public interface AccountRepository extends JpaRepository { }

Sekarang, kita akan menggunakan AccountRepository untuk memperbarui bidang nama objek Akun :

Account account = accountRepository.findOne(ACCOUNT_ID); account.setName("Test Account"); accountRepository.save(account);

Setelah kami menjalankan pembaruan ini, kami dapat memverifikasi pernyataan SQL yang dihasilkan. Pernyataan SQL yang dihasilkan akan menyertakan semua kolom Akun :

update Account set active=?, name=?, type=? where id=?

3. JPA @ Entity dengan @DynamicUpdate

Kami telah melihat bahwa meskipun kami hanya memodifikasi kolom nama , Hibernate telah menyertakan semua kolom dalam pernyataan SQL.

Sekarang, mari tambahkan anotasi @DynamicUpdate ke entitas Akun :

@Entity @DynamicUpdate public class Account { // Existing data and methods }

Selanjutnya, mari kita jalankan kode pembaruan yang sama yang kita gunakan di bagian sebelumnya. Kita dapat melihat bahwa SQL yang dihasilkan oleh Hibernate, dalam hal ini, hanya menyertakan kolom nama :

update Account set name=? where id=?

Jadi, apa yang terjadi jika kita menggunakan @DynamicUpdate di sebuah entitas ?

Sebenarnya, saat kami menggunakan @DynamicUpdate di entitas, Hibernate tidak menggunakan pernyataan SQL yang di-cache untuk pembaruan. Sebagai gantinya, ini akan menghasilkan pernyataan SQL setiap kali kita memperbarui entitas. SQL yang dihasilkan ini hanya mencakup kolom yang diubah .

Untuk mengetahui kolom yang diubah, Hibernate perlu melacak status entitas saat ini. Jadi, ketika kita mengubah bidang entitas apa pun, itu membandingkan status entitas saat ini dan yang dimodifikasi.

Artinya, @ DynamicUpdate memiliki overhead performa yang terkait dengannya . Oleh karena itu, kita sebaiknya hanya menggunakannya jika memang diperlukan.

Tentu saja, ada beberapa skenario di mana kita harus menggunakan anotasi ini - misalnya, jika entitas mewakili tabel yang memiliki banyak kolom dan hanya beberapa dari kolom ini yang perlu sering diperbarui. Selain itu, saat kami menggunakan penguncian optimis tanpa versi, kami perlu menggunakan @DynamicUpdate .

4. Kesimpulan

Dalam tutorial ini, kita telah melihat anotasi @DynamicUpdate dari Hibernate. Kami telah menggunakan contoh JPA Data Musim Semi untuk melihat @DynamicUpdate beraksi. Juga, kami telah membahas kapan kami harus menggunakan fitur ini dan kapan kami tidak boleh.

Seperti biasa, contoh kode lengkap yang digunakan dalam tutorial ini tersedia di Github.