Pengantar Spring Data JPA

1. Ikhtisar

Artikel ini akan fokus pada pengenalan Spring Data JPA ke dalam proyek Spring dan mengonfigurasi sepenuhnya lapisan persistensi. Untuk pengenalan langkah demi langkah tentang menyiapkan konteks Spring menggunakan konfigurasi berbasis Java dan pom Maven dasar untuk proyek tersebut, lihat artikel ini.

2. DAO Data Musim Semi yang Dihasilkan - Tidak Ada Lagi Implementasi DAO

Seperti yang telah kita bahas di artikel sebelumnya, lapisan DAO biasanya terdiri dari banyak kode boilerplate yang dapat dan harus disederhanakan. Keuntungan dari penyederhanaan ini sangat banyak: penurunan jumlah artefak yang perlu kita definisikan dan pertahankan, konsistensi pola akses data dan konsistensi konfigurasi.

Spring Data membawa penyederhanaan ini selangkah lebih maju dan memungkinkan untuk menghapus implementasi DAO seluruhnya . Antarmuka DAO sekarang adalah satu-satunya artefak yang perlu kita definisikan secara eksplisit.

Untuk mulai memanfaatkan model pemrograman Data Musim Semi dengan JPA, antarmuka DAO perlu memperluas antarmuka Repositori khusus JPA - JpaRepository . Ini akan memungkinkan Spring Data menemukan antarmuka ini dan secara otomatis membuat implementasi untuknya.

Dengan memperluas antarmuka kami mendapatkan metode CRUD yang paling relevan untuk akses data standar yang tersedia dalam DAO standar.

3. Metode dan Kueri Akses Kustom

Seperti yang telah dibahas, dengan menerapkan salah satu antarmuka Repositori , DAO sudah memiliki beberapa metode CRUD dasar (dan kueri) yang ditentukan dan diimplementasikan .

Untuk menentukan metode akses yang lebih spesifik, Spring JPA mendukung beberapa opsi:

  • cukup tentukan metode baru di antarmuka
  • berikan kueri JPQL aktual dengan menggunakan anotasi @Query
  • menggunakan spesifikasi lebih lanjut dan dukungan Querydsl di Spring Data
  • tentukan kueri khusus melalui Kueri Bernama JPA

Opsi ketiga - spesifikasi dan dukungan Querydsl - mirip dengan Kriteria JPA tetapi menggunakan API yang lebih fleksibel dan nyaman. Ini membuat seluruh operasi lebih mudah dibaca dan digunakan kembali. Keuntungan dari API ini akan menjadi lebih jelas saat menangani sejumlah besar kueri tetap, karena kami berpotensi mengungkapkannya secara lebih ringkas melalui sejumlah kecil blok yang dapat digunakan kembali.

Opsi terakhir ini memiliki kelemahan karena melibatkan XML atau membebani kelas domain dengan kueri.

3.1. Kueri Kustom Otomatis

Saat Spring Data membuat implementasi Repositori baru , Spring Data menganalisis semua metode yang ditentukan oleh antarmuka dan mencoba menghasilkan kueri secara otomatis dari nama metode . Meskipun ini memiliki beberapa batasan, ini adalah cara yang sangat kuat dan elegan untuk menentukan metode akses ubahsuaian dengan sedikit usaha.

Mari kita lihat contoh: jika entitas memiliki field nama (dan metode getName dan setName standar Java Bean ), kita akan mendefinisikan metode findByName di antarmuka DAO ; ini secara otomatis akan menghasilkan kueri yang benar:

public interface IFooDAO extends JpaRepository { Foo findByName(String name); }

Ini adalah contoh yang relatif sederhana. Mekanisme pembuatan kueri mendukung kumpulan kata kunci yang jauh lebih besar.

Jika parser tidak dapat mencocokkan properti dengan bidang objek domain, kita akan melihat pengecualian berikut:

java.lang.IllegalArgumentException: No property nam found for type class com.baeldung.spring.data.persistence.model.Foo

3.2. Kueri Kustom Manual

Sekarang mari kita lihat kueri khusus yang akan kita tentukan melalui anotasi @Query :

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)") Foo retrieveByName(@Param("name") String name);

Untuk kontrol yang lebih cermat atas pembuatan kueri, seperti menggunakan parameter bernama atau mengubah kueri yang ada, referensi adalah tempat yang baik untuk memulai.

4. Konfigurasi Transaksi

Implementasi aktual DAO yang dikelola musim semi memang tersembunyi karena kami tidak bekerja dengannya secara langsung. Namun, ini adalah cukup implementasi sederhana - yang SimpleJpaRepository - yang mendefinisikan semantik transaksi menggunakan penjelasan .

Lebih eksplisitnya, ini menggunakan anotasi @Transactional read-only di tingkat kelas, yang kemudian diganti untuk metode non-read-only. Semantik transaksi lainnya adalah default, tetapi ini dapat dengan mudah diganti secara manual per metode.

4.1. Pengecualian Terjemahan Hidup dan Sehat

Pertanyaannya sekarang - karena Spring Data JPA tidak bergantung pada template ORM lama ( JpaTemplate , HibernateTemplate ) dan telah dihapus sejak Spring 5 - apakah kita masih akan mendapatkan pengecualian JPA kita diterjemahkan ke hierarki DataAccessException Spring ?

Tentu saja, kami adalah - terjemahan pengecualian masih diaktifkan dengan penggunaan anotasi @Repository di DAO . Anotasi ini memungkinkan postprocessor kacang Spring untuk menyarankan semua kacang @Repository dengan semua instance PersistenceExceptionTranslator yang ditemukan di wadah, dan menyediakan terjemahan pengecualian seperti sebelumnya.

Mari verifikasi terjemahan pengecualian dengan uji integrasi:

@Test(expected = DataIntegrityViolationException.class) public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() { service.create(new Foo()); }

Perlu diingat bahwa terjemahan pengecualian dilakukan melalui proxy. Agar Spring dapat membuat proxy di sekitar kelas DAO, ini tidak boleh dinyatakan final .

5. Konfigurasi Repositori JPA Data Musim Semi

Untuk mengaktifkan dukungan repositori Spring JPA, kita dapat menggunakan anotasi @EnableJpaRepositories dan menentukan paket yang berisi antarmuka DAO:

@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.repository") public class PersistenceConfig { ... }

Kita bisa melakukan hal yang sama dengan konfigurasi XML:

6. Konfigurasi Java atau XML

Kami sudah membahas dengan sangat rinci cara mengkonfigurasi JPA di Spring di artikel sebelumnya. Spring Data juga memanfaatkan dukungan Spring untuk anotasi @PersistenceContext JPA . Ia menggunakan ini untuk menyambungkan EntityManager ke Spring factory bean yang bertanggung jawab untuk membuat implementasi DAO yang sebenarnya - JpaRepositoryFactoryBean .

Selain konfigurasi yang telah dibahas, kita juga perlu menyertakan Konfigurasi XML Data Musim Semi - jika kita menggunakan XML:

@Configuration @EnableTransactionManagement @ImportResource("classpath*:*springDataConfig.xml") public class PersistenceJPAConfig { ... }

7. Ketergantungan Maven

In addition to the Maven configuration for JPA, like in a previous article, we'll add the spring-data-jpa dependency:

 org.springframework.data spring-data-jpa 2.2.7.RELEASE 

8. Using Spring Boot

We can also use the Spring Boot Starter Data JPA dependency that will automatically configure the DataSource for us.

We also need to make sure that the database we want to use is present in the classpath. In our example, we've added the H2 in-memory database:

 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE   com.h2database h2 1.4.200 

As a result, just by doing these dependencies, our application is up and running and we can use it for other database operations.

The explicit configuration for a standard Spring application is now included as part of Spring Boot auto-configuration.

We can, of course, modify the auto-configuration by adding our customized explicit configuration.

Spring Boot provides an easy way to do this using properties in the application.properties file:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=sa

In this example, we've changed the connection URL and credentials.

9. Conclusion

This article covered the configuration and implementation of the persistence layer with Spring 5, JPA 2, and Spring Data JPA (part of the Spring Data umbrella project), using both XML and Java-based configuration.

We discussed ways to define more advanced custom queries, as well as transactional semantics, and a configuration with the new jpa namespace. The final result is a new and elegant take on data access with Spring, with almost no actual implementation work.

Implementasi Tutorial JPA Spring Data ini dapat ditemukan di proyek GitHub.