1. Gambaran keseluruhan
Tutorial ini menunjukkan cara mengatur Spring dengan JPA , menggunakan Hibernate sebagai penyedia kegigihan.
Untuk pengenalan langkah demi langkah tentang mengatur konteks Spring menggunakan konfigurasi berbasis Java dan Maven pom asas untuk projek ini, lihat artikel ini.
Kita akan mulakan dengan menyiapkan JPA dalam projek Spring Boot, kemudian kita akan melihat konfigurasi penuh yang kita perlukan jika kita mempunyai projek Spring standard.
Berikut adalah video mengenai penyediaan Hibernate 4 dengan Spring 4 (saya cadangkan menontonnya sepenuhnya 1080p):
2. JPA dalam Spring Boot
Projek Spring Boot bertujuan untuk membuat aplikasi Spring lebih cepat dan mudah. Ini dilakukan dengan penggunaan pemula dan konfigurasi automatik untuk pelbagai fungsi Spring, JPA antaranya.
2.1. Ketergantungan Maven
Untuk mengaktifkan JPA dalam aplikasi Spring Boot, kami memerlukan pergantungan spring-boot-starter dan spring-boot-starter-data-jpa :
org.springframework.boot spring-boot-starter 2.2.6.RELEASE org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE
The bunga-boot-starter mengandungi perlu auto-konfigurasi untuk Spring JPA. Juga, projek spring-boot-starter-jpa merujuk semua kebergantungan yang diperlukan seperti hibernate-core .
2.2. Konfigurasi
Spring Boot mengkonfigurasi Hibernate sebagai penyedia JPA lalai , jadi tidak perlu lagi untuk menentukan entitiManagerFactory bean kecuali jika kita mahu menyesuaikannya.
Spring Boot juga dapat mengkonfigurasi secara automatik dataSan bean, bergantung pada pangkalan data yang kami gunakan . Dalam kes pangkalan data dalam memori jenis H2 , HSQLDB, dan Apache Derby , Boot secara automatik mengkonfigurasi Sumber Data jika ketergantungan pangkalan data yang sesuai ada pada classpath.
Sebagai contoh, jika kita ingin menggunakan pangkalan data H2 dalam memori dalam aplikasi Spring Boot JPA, kita hanya perlu menambahkan kebergantungan h2 ke fail pom.xml :
com.h2database h2 1.4.200
Dengan cara ini, kita tidak perlu menentukan dataSource bean, tetapi kita dapat melakukannya jika kita ingin menyesuaikannya.
Sekiranya kita ingin menggunakan JPA dengan pangkalan data MySQL , maka kita memerlukan ketergantungan mysql-connector-java , dan juga untuk menentukan konfigurasi DataSource .
Kita boleh melakukannya di kelas @Configuration , atau dengan menggunakan sifat Spring Boot standard.
Konfigurasi Java kelihatan sama seperti pada projek Spring standard:
@Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUsername("mysqluser"); dataSource.setPassword("mysqlpass"); dataSource.setUrl( "jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true"); return dataSource; }
Untuk mengkonfigurasi sumber data menggunakan fail sifat, kita harus menetapkan sifat awalan dengan spring.datasource :
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=mysqluser spring.datasource.password=mysqlpass spring.datasource.url= jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
Spring Boot secara automatik akan mengkonfigurasi sumber data berdasarkan sifat ini.
Juga pada Spring Boot 1, kumpulan sambungan lalai adalah Tomcat , tetapi dengan Spring Boot 2 ia telah diubah menjadi HikariCP .
Anda boleh mendapatkan lebih banyak contoh mengkonfigurasi JPA dalam Spring Boot dalam projek GitHub.
Seperti yang kita lihat, konfigurasi JPA asas agak mudah jika kita menggunakan Spring Boot.
Namun, jika kita mempunyai projek Spring standard, maka kita memerlukan konfigurasi yang lebih eksplisit, menggunakan Java atau XML. Itulah yang akan kita fokuskan pada bahagian seterusnya.
3. Konfigurasi Musim Semi JPA Dengan Java - dalam Projek Tanpa Boot
Untuk menggunakan JPA dalam projek Spring, kita perlu menubuhkan EntityManager.
Ini adalah bahagian utama konfigurasi dan kita dapat melakukannya melalui kacang kilang Spring. Ini boleh menjadi sama ada mudah LocalEntityManagerFactoryBean atau yang lebih fleksibel LocalContainerEntityManagerFactoryBean .
Mari lihat bagaimana kita boleh menggunakan pilihan terakhir:
@Configuration @EnableTransactionManagement public class PersistenceJPAConfig{ @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); em.setJpaProperties(additionalProperties()); return em; } // ... }
Kami juga perlu secara jelas menentukan kacang DataSource yang telah kami gunakan di atas:
@Bean public DataSource dataSource(){ DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa"); dataSource.setUsername( "tutorialuser" ); dataSource.setPassword( "tutorialmy5ql" ); return dataSource; }
Bahagian akhir konfigurasi adalah sifat Hibernate tambahan dan TransactionManager dan pengecualianTranslation kacang:
@Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ return new PersistenceExceptionTranslationPostProcessor(); } Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); return properties; }
4. Konfigurasi JPA Spring Dengan XML
Seterusnya, mari kita lihat Spring Configuration yang sama dengan XML:
create-drop org.hibernate.dialect.MySQL5Dialect
Terdapat perbezaan yang agak kecil antara XML dan konfigurasi berasaskan Java yang baru. Yaitu, dalam XML, rujukan kacang lain boleh menunjukkan kilang kacang atau kilang kacang untuk kacang itu.
Di Java, bagaimanapun, kerana jenisnya berbeza, penyusun tidak membenarkannya, dan oleh itu EntityManagerFactory pertama kali diambil dari kilang kacangnya dan kemudian diserahkan kepada pengurus transaksi:
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
5. Akan kurang penuh XML
Biasanya, JPA menentukan unit kegigihan melalui fail META-INF / persistence.xml . Bermula dengan Spring 3.1, kegigihan.xml tidak lagi diperlukan . The LocalContainerEntityManagerFactoryBean kini menyokong packagesToScan harta jika pakej untuk mengimbas @Entity kelas boleh dinyatakan.
Fail ini merupakan bahagian terakhir XML yang perlu kami alih keluar. Kita sekarang boleh menyediakan JPA sepenuhnya tanpa XML.
We would usually specify JPA properties in the persistence.xml file. Alternatively, we can add the properties directly to the entity manager factory bean:
factoryBean.setJpaProperties(this.additionalProperties());
As a side note, if Hibernate would be the persistence provider, then this would be the way to specify Hibernate specific properties as well.
6. The Maven Configuration
In addition to the Spring Core and persistence dependencies – show in detail in the Spring with Maven tutorial – we also need to define JPA and Hibernate in the project, as well as a MySQL connector:
org.hibernate hibernate-core 5.2.17.Final runtime mysql mysql-connector-java 8.0.19 runtime
Note that the MySQL dependency is included here as an example. We need a driver to configure the datasource, but any Hibernate-supported database will do.
7. Conclusion
Tutorial ini menggambarkan cara mengkonfigurasi JPA dengan Hibernate pada musim bunga di Spring Boot dan aplikasi Spring standard.
Seperti biasa, kod yang disajikan dalam artikel ini terdapat di GitHub.