SpringとJPAのガイド
目次
1概要
これは、Hibernateを永続化プロバイダとして使用して、SpringとJPAを設定する方法を示すチュートリアルです。
Javaベースの設定とプロジェクトのための基本的なMaven pomを使ってSpringコンテキストを設定することについてのステップバイステップの紹介はリンクを見てください:記事]。
-
NEW ** :これはHibernate 4とSpring 4のセットアップに関するビデオです(フル1080pで見ることをお勧めします)。
2 Java
を使用したJPA Springの設定
SpringプロジェクトでJPAを使用するには、**
EntityManager
を設定する必要があります。
これは設定の主要部分です – そしてそれはSpringファクトリビーン – より単純な
LocalEntityManagerFactoryBean
または
より柔軟な
LocalContainerEntityManagerFactoryBean
のどちらかを通して行われます。後者のオプションは、追加のプロパティを設定できるようにここで使用されています。
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[]{ "org.baeldung.persistence.model" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
@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;
}
@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;
}
}
また、Spring 3.2より前のバージョンでは、
cglib **
はJava
@ Configuration
クラスが機能するためにクラスパス上になければならなかったことに注意してください。依存関係としての
cglib
の必要性をよりよく理解するためには、リンク:/bootstraping-the-spring-and-java-based-configuration#cglib
gone[Springのcglibアーティファクトに関するこの議論]を参照してください。
3 XMLを使ったJPA Springの設定
XMLと同じSpring構成:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id="myEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="org.baeldung.persistence.model"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create-drop</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring__jpa"/>
<property name="username" value="tutorialuser"/>
<property name="password" value="tutorialmy5ql"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf"/>
</bean>
<tx:annotation-driven/>
<bean id="persistenceExceptionTranslationPostProcessor" class=
"org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
SpringがXMLで設定される方法と新しいJavaベースの設定との間には、比較的小さな違いがあります。XMLでは、別のBeanへの参照は、そのBeanのBeanまたはBeanファクトリーを指すことができます。
ただし、Javaでは型が異なるため、コンパイラはそれを許可していません。そのため、
EntityManagerFactory
が最初にBeanファクトリから取得され、次にトランザクションマネージャに渡されます。
txManager.setEntityManagerFactory(
this.entityManagerFactoryBean()。getObject()
);
4完全なXMLレス
へ
通常、JPAは
META-INF/persistence.xml
ファイルを通して永続化単位を定義します。 ** Spring 3.1以降、
persistence.xml
は不要になりました。
このファイルは削除されるXMLの最後の部分でした – 今、JPAは
no XML
で完全にセットアップできます。
4.1. JPAのプロパティ
JPAプロパティは通常
persistence.xml
ファイルで指定されます。あるいは、プロパティをエンティティマネージャファクトリBeanに直接指定することもできます。
factoryBean.setJpaProperties(this.additionalProperties());
ちなみに、Hibernateが永続化プロバイダになる場合、これがHibernate固有のプロパティを指定する方法になります。
5 Mavenの設定
Spring Coreと永続性の依存関係に加えて – リンクに詳細を表示:/spring-with-maven[Spring with Mavenチュートリアル] – MySQLコネクタと同様に、プロジェクトでJPAとHibernateも定義する必要があります。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.10.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
<scope>runtime</scope>
</dependency>
MySQLの依存関係は参照として含まれていることに注意してください – ドライバはデータソースを設定するために必要ですが、どんなhttp://community.jboss.org/wiki/SupportedDatabases2[Hibernate supported database]でも構いません。
6. JPA in Spring Boot
Spring Bootプロジェクトは、Springアプリケーションの作成をはるかに速く簡単にすることを目的としています。これは、さまざまなSpring機能(JPAなど)のスターターと自動構成を使用して行われます。
Spring BootアプリケーションでJPAを有効にするには、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter%22%20AND%20g%3A%22orgが必要です。 .springframework.boot%22[spring-boot-starter]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-data-jpa%22[spring -boot-starter-data-jpa]依存関係:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
spring-boot-start-start
にはSpring JPAに必要な自動設定が含まれており、
spring-boot-start-start-jpa
プロジェクトは
hibernate-entitymanager
などの必要なすべての依存関係を参照しています。
Spring Bootは
Hibernate
をデフォルトのJPAプロバイダとして設定しているので、カスタマイズしない限り
entityManagerFactory
Beanを定義する必要はなくなりました。
-
Spring Bootは、使用するデータベースに応じて
dataSource
beanを自動設定することもできます** 。
H2
、
HSQLDB
、および
Apache Derby
タイプのインメモリデータベースの場合、対応するデータベース依存関係がクラスパスに存在する場合、Bootは自動的に
DataSource
を設定します。
たとえば、Spring Boot JPAアプリケーションでインメモリ
H2
データベースを使用する場合は、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%を追加するだけで済みます。 22h2%22%20AND 20g%3A%22com.h2データベース%22
pom.xml
ファイルへの依存関係:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.195</version>
</dependency>
この方法では、
dataSource
Beanを定義する必要はありませんが、カスタマイズしたい場合は定義できます。
MySQL
データベースでJPAを使用したい場合は、
DataSource
設定を定義するのと同様に、
mysql-connector-java
依存関係が必要です。
これは
@ Configuration
クラスで、または標準のSpring Bootプロパティを使用して実行できます。
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でJPAを設定する他の例はhttps://github.com/eugenp/tutorials/tree/master/spring-boot[GitHubプロジェクト]にあります。
7. 結論
このチュートリアルでは、XMLとJavaの両方の設定を使用して、Spring
でHibernateを使用して
JPAを設定する方法を説明しました。
また、通常JPAに関連付けられている最後のXML、つまり__persistence.xmlを削除する方法についても説明しました。最終的な結果は、コンパイル時にSpringにほとんど依存しない、軽量でクリーンなDAO実装です。
いつものように、この記事で紹介されているコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa[Githubでさらに入手]です。これはMavenベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。