Spring Data JPA @Modifikasi Anotasi

1. Pengenalan

Dalam tutorial ringkas ini, kita akan belajar bagaimana membuat pertanyaan kemas kini dengan anotasi Spring Data JPA @Query . Kami akan mencapainya dengan menggunakan anotasi @Modifying .

Pertama, kita akan menyegarkan semula ingatan kita dan melihat bagaimana membuat pertanyaan menggunakan Spring Data JPA. Selepas itu, kami akan menyelam jauh ke dalam penggunaan @query dan @Modifying penjelasan. Akhirnya, kita akan melihat bagaimana mengurus keadaan konteks kegigihan kita ketika menggunakan mengubah suai pertanyaan.

2. Membuat pertanyaan dalam JPA Data Spring

Pertama, mari kita susun semula 3 mekanisme yang disediakan oleh Spring Data JPA untuk membuat pertanyaan data dalam pangkalan data :

  • Kaedah pertanyaan
  • @query anotasi
  • Pelaksanaan repositori tersuai

Mari buat kelas Pengguna dan repositori Spring Data JPA yang sepadan 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 kaedah pertanyaan membolehkan kita memanipulasi data dengan memperoleh pertanyaan dari nama kaedah:

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

Dalam contoh ini, kita dapat mencari pertanyaan yang mengambil pengguna dengan nama mereka, atau pertanyaan yang menghilangkan pengguna yang mempunyai tarikh pembuatan setelah tarikh tertentu.

Mengenai anotasi @Query , ini memberi kita kemungkinan untuk menulis pertanyaan JPQL atau SQL tertentu dalam anotasi @Query :

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

Dalam coretan kod ini, kita dapat melihat pertanyaan mendapatkan pengguna yang mempunyai alamat e-mel @ gmail.com .

Mekanisme pertama membolehkan kita mengambil atau menghapus data. Bagi yang kedua, ini memungkinkan kita untuk melakukan banyak pertanyaan. Walau bagaimanapun, untuk mengemas kini pertanyaan, kami mesti menambahkan anotasi @Modify . Ini akan menjadi topik tutorial ini.

3. Menggunakan Anotasi @Modifying

The @Modifying anotasi digunakan untuk meningkatkan @query anotasi untuk melaksanakan bukan sahaja SELECT pertanyaan tetapi juga INSERT , UPDATE , DELETE , dan juga DDL pertanyaan.

Mari bermain dengan anotasi ini sedikit dan melihatnya.

Pertama, mari kita lihat contoh pertanyaan @Modifying UPDATE:

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

Di sini, kami menyahaktifkan pengguna yang tidak log masuk sejak tarikh tertentu.

Mari cuba yang lain di mana kita akan memadamkan pengguna yang dinyahaktifkan:

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

Seperti yang kita lihat, kaedah ini mengembalikan bilangan bulat. Ini adalah ciri pertanyaan Spring Data JPA @Modifying yang memberi kami bilangan entiti yang dikemas kini.

Kita harus perhatikan bahawa melaksanakan query delete dengan @Query berfungsi berbeza dari kaedah query yang dikeluarkan oleh Spring Data JPA's deleteBy . Yang terakhir pertama mengambil entiti dari pangkalan data dan kemudian menghapusnya satu persatu. Oleh itu, ini bermaksud bahawa kaedah kitaran hidup @PreRemove akan dipanggil pada entiti tersebut. Namun, dengan yang pertama, satu pertanyaan dijalankan terhadap pangkalan data.

Akhirnya, mari tambahkan lajur yang dihapuskan ke jadual PENGGUNA kami dengan pertanyaan DDL :

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

Malangnya, menggunakan mengubah suai pertanyaan menjadikan konteks kegigihan yang mendasari ketinggalan zaman. Walau bagaimanapun, adalah mungkin untuk menguruskan keadaan ini. Itulah tajuk bahagian seterusnya.

4. Menguruskan Konteks Kegigihan

Sekiranya pertanyaan pengubahsuaian kami mengubah entiti yang terdapat dalam konteks kegigihan, maka konteks ini menjadi ketinggalan zaman. Salah satu cara untuk menguruskan keadaan ini adalah membersihkan konteks kegigihan. Dengan melakukan itu, kami memastikan bahawa konteks kegigihan akan mengambil entiti dari pangkalan data lain kali.

Namun, kita tidak perlu memanggil kaedah jelas () pada EntityManager . Kami hanya boleh menggunakan harta clearAutomatically dari anotasi @Modifying :

@Modifying(clearAutomatically = true)

Dengan cara itu, kami memastikan bahawa konteks kegigihan dihapus setelah pelaksanaan pertanyaan kami.

Tetapi, bagaimana jika konteks kegigihan kita mengandung perubahan yang tidak diselesaikan? Oleh itu, membersihkannya bermaksud menjatuhkan perubahan yang belum disimpan. Mujurlah, terdapat satu lagi harta anotasi kita boleh menggunakan - flushAutomatically :

@Modifying(flushAutomatically = true)

Sekarang, EntityManager dihapus sebelum pertanyaan kami dijalankan.

5. Kesimpulan

Itu menyimpulkan artikel pendek ini mengenai anotasi @Modifying . Kami telah melihat cara menggunakan anotasi ini untuk melaksanakan pertanyaan kemas kini seperti INSERT, UPDATE, DELETE, dan bahkan DDL . Selepas itu, kami belajar bagaimana menguruskan keadaan konteks kegigihan dengan sifat jelasAutomatik dan flushAutomatik .

Seperti biasa, kod penuh untuk artikel ini terdapat di GitHub.