Pengenalan JPA Spring Data

1. Gambaran keseluruhan

Artikel ini akan memberi tumpuan untuk memperkenalkan Spring Data JPA ke dalam projek Spring dan sepenuhnya mengkonfigurasi lapisan kegigihan. Untuk pengenalan langkah demi langkah mengenai pengaturan konteks Spring menggunakan konfigurasi berbasis Java dan Maven pom asas untuk projek ini, lihat artikel ini.

2. DAO yang dihasilkan oleh Spring Data - Tiada Lagi Pelaksanaan DAO

Seperti yang telah kita bincangkan dalam artikel sebelumnya, lapisan DAO biasanya terdiri daripada banyak kod boilerplate yang dapat dan harus dipermudahkan. Kelebihan penyederhanaan seperti itu adalah banyak: penurunan jumlah artifak yang perlu kita tentukan dan pertahankan, konsistensi corak akses data dan konsistensi konfigurasi.

Spring Data mengambil penyederhanaan ini selangkah ke depan dan memungkinkan untuk menghapus pelaksanaan DAO sepenuhnya . Antara muka DAO adalah satu-satunya artifak yang perlu kita jelaskan secara eksplisit.

Untuk mula memanfaatkan model pengaturcaraan Spring Data dengan JPA, antara muka DAO perlu memperluas antara muka Repositori khusus JPA - JpaRepository . Ini akan membolehkan Spring Data mencari antara muka ini dan secara automatik membuat pelaksanaan untuknya.

Dengan memperluaskan antara muka, kami mendapat kaedah CRUD yang paling relevan untuk akses data standard yang tersedia dalam DAO standard.

3. Kaedah dan Pertanyaan Akses Tersuai

Seperti yang telah dibincangkan, dengan menerapkan salah satu antara muka Repositori , DAO akan mempunyai beberapa kaedah CRUD (dan pertanyaan) asas yang ditentukan dan dilaksanakan .

Untuk menentukan kaedah akses yang lebih khusus, Spring JPA menyokong beberapa pilihan:

  • hanya menentukan kaedah baru di antara muka
  • berikan pertanyaan JPQL sebenar dengan menggunakan anotasi @Query
  • gunakan sokongan Spesifikasi dan Querydsl yang lebih maju dalam Spring Data
  • tentukan pertanyaan tersuai melalui Pertanyaan Dinamakan JPA

Pilihan ketiga - spesifikasi dan sokongan Querydsl - serupa dengan Kriteria JPA tetapi menggunakan API yang lebih fleksibel dan mudah digunakan. Ini menjadikan keseluruhan operasi lebih mudah dibaca dan digunakan semula. Kelebihan API ini akan menjadi lebih jelas ketika menangani sebilangan besar pertanyaan tetap, kerana kami berpotensi untuk menyatakannya dengan lebih ringkas melalui sebilangan kecil blok yang dapat digunakan kembali.

Pilihan terakhir ini mempunyai kelemahan kerana ia melibatkan XML atau membebankan kelas domain dengan pertanyaan.

3.1. Pertanyaan Peribadi Automatik

Apabila Spring Data membuat implementasi Repositori baru , ia menganalisis semua kaedah yang ditentukan oleh antara muka dan berusaha menghasilkan pertanyaan dari nama-nama kaedah secara automatik . Walaupun ini mempunyai beberapa batasan, cara yang sangat kuat dan elegan untuk menentukan kaedah akses khusus baru dengan sedikit usaha.

Mari lihat contohnya: jika entiti mempunyai bidang nama (dan kaedah getName dan setName standard Java Bean ), kami akan menentukan kaedah findByName dalam antara muka DAO ; ini secara automatik akan menghasilkan pertanyaan yang betul:

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

Ini adalah contoh yang agak mudah. Mekanisme pembuatan pertanyaan menyokong sekumpulan kata kunci yang jauh lebih besar.

Sekiranya pengurai tidak dapat memadankan properti dengan bidang objek domain, kami akan melihat pengecualian berikut:

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

3.2. Pertanyaan Tersuai Manual

Sekarang mari kita lihat pertanyaan 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 kawalan yang lebih terperinci terhadap pembuatan pertanyaan, seperti menggunakan parameter bernama atau mengubah pertanyaan yang ada, rujukan adalah tempat yang baik untuk memulakan.

4. Konfigurasi Transaksi

Pelaksanaan sebenar DAO yang dikendalikan musim bunga sememangnya disembunyikan kerana kami tidak bekerja dengannya secara langsung. Walau bagaimanapun, ini adalah pelaksanaan cukup mudah - yang SimpleJpaRepository - yang mentakrifkan semantik transaksi menggunakan anotasi .

Lebih jelas lagi, ini menggunakan anotasi @Transactional yang hanya boleh dibaca di peringkat kelas, yang kemudiannya diganti untuk kaedah bukan-baca sahaja. Semantik transaksi yang selebihnya adalah lalai, tetapi ini dapat diganti dengan mudah setiap kaedah.

4.1. Terjemahan Pengecualian Hidup dan Baik

Persoalannya sekarang - kerana Spring Data JPA tidak bergantung pada templat ORM lama ( JpaTemplate , HibernateTemplate ) dan mereka telah dikeluarkan sejak Spring 5 - adakah kita masih akan mendapatkan pengecualian JPA kita kepada hierarki DataAccessException Spring ?

Sudah tentu, kami - terjemahan pengecualian masih diaktifkan dengan penggunaan anotasi @Repository di DAO . Anotasi ini membolehkan pemprosesan biji kacang untuk menasihati semua kacang @Repository dengan semua kejadian PersistenceExceptionTranslator yang terdapat di dalam bekas, dan memberikan terjemahan pengecualian seperti sebelumnya.

Mari sahkan terjemahan pengecualian dengan ujian integrasi:

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

Perlu diingat bahawa terjemahan pengecualian dilakukan melalui proksi. Agar Spring dapat membuat proksi di sekitar kelas DAO, ini tidak boleh dinyatakan akhir .

5. Konfigurasi Repositori Data JPA Spring

Untuk mengaktifkan sokongan repositori JPA Spring, kami dapat menggunakan anotasi @EnableJpaRepositories dan menentukan pakej yang mengandungi antara muka DAO:

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

Kita boleh melakukan perkara yang sama dengan konfigurasi XML:

6. Konfigurasi Java atau XML

Kami telah membincangkan secara terperinci bagaimana mengkonfigurasi JPA pada musim bunga dalam artikel sebelumnya. Spring Data juga memanfaatkan sokongan Spring untuk anotasi JPA @PersistenceContext . Ia menggunakan ini untuk memasukkan EntityManager ke kilang kilang Spring yang bertanggungjawab untuk mewujudkan pelaksanaan DAO yang sebenarnya - JpaRepositoryFactoryBean .

Sebagai tambahan kepada konfigurasi yang telah dibincangkan, kami juga perlu memasukkan Spring Data XML Config - jika kami 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.

Pelaksanaan Tutorial JPA Spring Data ini boleh didapati di projek GitHub.