今回はJPAを使います。実装としてHibernateを利用します。
まず、Spring Data JPA、Hibernate、H2のライブラリをdependenciesに追加します。これまでと同様に、更新とArtifactの設定を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apply plugin: 'java' sourceCompatibility = 1.5 version = '1.0' repositories { mavenCentral() } dependencies { compile 'org.springframework:spring-context:4.0.6.RELEASE' compile 'org.springframework:spring-webmvc:4.0.6.RELEASE' compile 'org.thymeleaf:thymeleaf-spring4:2.1.3.RELEASE' compile 'org.springframework.data:spring-data-jpa:1.6.1.RELEASE' compile 'org.hibernate:hibernate-entitymanager:4.3.5.Final' compile 'com.h2database:h2:1.4.179' testCompile group: 'junit', name: 'junit', version: '4.11' } |
次に、設定用のクラスを作成します。Thymeleafの設定と同様に、configパッケージ内にDatabaseConfigクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
package net.teachingprogramming.myfirstspringapp.config; import org.hibernate.dialect.H2Dialect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.hibernate4.HibernateExceptionTranslator; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; /** * DatabaseConfig */ @Configuration @EnableTransactionManagement @EnableJpaRepositories("net.teachingprogramming.myfirstspringapp.repository") public class DatabaseConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(org.h2.Driver.class.getName()); dataSource.setUrl("jdbc:h2:tcp://localhost/~/tmp/myfirstspringapp"); dataSource.setUsername("sa"); dataSource.setPassword("password"); return dataSource; } @Bean public EntityManagerFactory entityManagerFactory() { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); // デバッグ用 LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("net.teachingprogramming.myfirstspringapp.entity"); factory.setDataSource(dataSource()); Properties properties = new Properties(); properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); factory.setJpaProperties(properties); factory.afterPropertiesSet(); return factory.getObject(); } @Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(entityManagerFactory()); return txManager; } @Bean public HibernateExceptionTranslator hibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } } |
- 22行目: @Configurationアノテーションで設定用のクラスであることを示す。
- 23行目: @EnableTransactionManagementアノテーションでトランザクションの管理を有効にする。
- 23行目: @EnableJpaRepositoriesアノテーションでJPA Repositoriesを有効にする。Repositoryが格納されるパッケージを引数とする。
- 27〜35行目: データソースをBean登録する。設定内容はH2の設定と同じにする。
- 37〜54行目: EntityManagerFactoryをBean登録する。44行目で対象となるentityが含まれるパッケージを指定している。48行目でdialectを設定する。これによりHibernateがデータベースに適した動作をするようになる。49行目でテーブル等の自動生成について設定している。「create-drop」はdeply時に、テーブルを削除(drop)して作りなおす(create)という設定である。他に設定可能な値として、
- none
- 何もしない
- create
- テーブルがない場合に作成する
- update
- テーブルの構造が変わった時に変更する
- validate
- テーブルの構造をチェックする
等がある。開発時にはcreate-drop、create、updateを使い、運用時にvalidateにするといった使い分けをする。
- 56〜61行目: トランザクションマネージャーをBean登録する。
- 63〜66行目: 例外を変換するTranslatorをBean登録する。