SpringでのJPAのガイド
1. 概要
このチュートリアルshows how to set up Spring with JPAは、永続性プロバイダーとしてHibernateを使用しています。
Javaベースの構成とプロジェクトの基本的なMavenpomを使用したSpringコンテキストのセットアップに関するステップバイステップの紹介については、this articleを参照してください。
まず、Spring BootプロジェクトでJPAを設定し、次に、標準のSpringプロジェクトがある場合に必要な完全な構成を調べます。
参考文献:
Hibernateを使用したSpring Boot
Spring BootとHibernate / JPAを統合するための迅速で実用的な入門書。
NEW:これはSpring4でHibernate4をセットアップするビデオです(フル1080pで視聴することをお勧めします):
[.iframe-fluid] ##
2. SpringBootのJPA
Spring Bootプロジェクトは、Springアプリケーションの作成をはるかに高速かつ簡単にすることを目的としています。 これは、さまざまなSpring機能のJPAをはじめとするスターターと自動構成を使用して行われます。
2.1. Mavenの依存関係
Spring BootアプリケーションでJPAを有効にするには、spring-boot-starterとspring-boot-starter-data-jpaの依存関係が必要です。
org.springframework.boot
spring-boot-starter
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-data-jpa
2.1.4.RELEASE
spring-boot-starterには、SpringJPAに必要な自動構成が含まれています。 また、spring-boot-starter-jpaプロジェクトは、hibernate-entitymanagerなどの必要なすべての依存関係を参照します。
2.2. 設定
Spring Boot configures Hibernate as the default JPA providerなので、カスタマイズする必要がない限り、entityManagerFactoryBeanを定義する必要はありません。
Spring Boot can also auto-configure the dataSource bean, depending on the database we’re using。 タイプH2、HSQLDB、およびApache Derbyのインメモリデータベースの場合、対応するデータベースの依存関係がクラスパスに存在する場合、Bootは自動的にDataSourceを構成します。
たとえば、Spring Boot JPAアプリケーションでインメモリH2データベースを使用する場合は、h2依存関係をpom.xmlファイルに追加するだけで済みます。
com.h2database
h2
1.4.197
このように、dataSource Beanを定義する必要はありませんが、カスタマイズしたい場合は定義できます。
MySQLデータベースでJPAを使用する場合は、mysql-connector-java依存関係と、DataSource構成を定義する必要があります。
これは、@Configurationクラスで行うか、標準のSpringBootプロパティを使用して行うことができます。
Javaの構成は、標準のSpringプロジェクトと同じように見えます。
@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;
}
プロパティファイルを使用してデータソースを構成するには、接頭辞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は、これらのプロパティに基づいてデータソースを自動的に構成します。
また、Spring Boot 1ではデフォルトの接続プールはTomcatでしたが、Spring Boot 2ではHikariCPに変更されました。
Spring BootでJPAを構成するその他の例は、GitHub projectにあります。
ご覧のとおり、Spring Bootを使用している場合、基本的なJPA構成はかなり単純です。
ただし、if we have a standard Spring project, then we need more explicit configuration, using either Java or XML.これは次のセクションで焦点を当てます。
3. Javaを使用したJPASpring構成–非ブートプロジェクト
SpringプロジェクトでJPAを使用するには、we need to set up the EntityManager.
これは構成の主要部分であり、SpringファクトリBeanを介して実行できます。 これは、より単純なLocalEntityManagerFactoryBeanまたはthe more flexible LocalContainerEntityManagerFactoryBeanのいずれかです。
後者のオプションを使用する方法を見てみましょう。
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.example.persistence.model" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
// ...
}
上記で使用したWe also need to explicitly define the DataSource bean:
@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;
}
構成の最後の部分は、追加のHibernateプロパティとTransactionManagerおよびexceptionTranslationBeanです。
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
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. XMLを使用したJPA Spring構成
次に、XMLを使用した同じSpring構成を見てみましょう。
create-drop
org.hibernate.dialect.MySQL5Dialect
XMLと新しいJavaベースの構成との間には比較的小さな違いがあります。 つまり、XMLでは、別のBeanへの参照は、BeanまたはそのBeanのBeanファクトリのいずれかを指すことができます。
ただし、Javaでは、タイプが異なるため、コンパイラはそれを許可しません。そのため、EntityManagerFactoryは最初にBeanファクトリから取得され、次にトランザクションマネージャに渡されます。
txManager.setEntityManagerFactory(this.entityManagerFactoryBean().getObject());
5. 完全なXMLレス化
通常、JPAはMETA-INF/persistence.xmlファイルを介して永続性ユニットを定義します。 Starting with Spring 3.1, the persistence.xml is no longer necessary。 LocalContainerEntityManagerFactoryBeanは、@Entityクラスをスキャンするパッケージを指定できる‘packagesToScan'プロパティをサポートするようになりました。
このファイルは、削除する必要がある最後のXMLです。 We can now set up JPA fully with no XML.
通常、persistence.xmlファイルでJPAプロパティを指定します。 または、プロパティをエンティティマネージャファクトリBeanに直接追加することもできます。
factoryBean.setJpaProperties(this.additionalProperties());
補足として、Hibernateが永続プロバイダーである場合、これはHibernate固有のプロパティを指定する方法になります。
6. Maven構成
Spring Coreと永続性の依存関係(Spring with Maven tutorialで詳細に示されています)に加えて、プロジェクトでJPAとHibernate、およびMySQLコネクタも定義する必要があります。
org.hibernate
hibernate-entitymanager
5.4.2.Final
runtime
mysql
mysql-connector-java
6.0.6
runtime
MySQL依存関係が例として含まれていることに注意してください。 データソースを構成するためのドライバーが必要ですが、Hibernate supported databaseであれば問題ありません。
7. 結論
このチュートリアルでは、Spring Bootと標準のSpringアプリケーションの両方でJPA with Hibernate in Springを構成する方法を説明しました。
いつものように、この記事で紹介されているコードはover on Githubで利用できます。