Spring Boot 3.x(Spring Framework 6.x)+Hibernate+MySQLでSpring Data JPAを使おうとすると、バージョンによって動作しないことがあり、調べても明確に設定が書かれた記述を見つけられなかったので、メモを残しておきます。
使用したライブラリの組み合わせ
使用したライブラリは以下の組み合わせになります。
- Spring Boot 3.2.1
- Spring Framework 6.1.2
- Hibernate 6.3.1
- MySQL JDBC Driver 8.1.0
build.gradle
の設定で書く以下のようになります。
結論
ライブラリのバージョンの指定(Gradleの場合)とapplication.properties
の設定は以下のようになります。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.2.1'
implementation 'org.hibernate:hibernate-core:6.3.1.Final'
runtimeOnly 'com.mysql:mysql-connector-j:8.1.0'
}
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
調べた限りでは余計な設定をすると起動時にエラーが出るため、その点については後述しています。
設定のポイント
試した結果わかったポイントは以下の2点です。
Spring Frameweork 6.xではJakartaEE 9+をサポートするようになっているため、Hibernate 6.xを使用する必要がある
Spring Framework 6.xでHibernate 5.xを使用すると、起動時に以下のエラーが発生します。
Class org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider
このため、Sprnig Framework 6.xを使用する場合は、Hibernate 6.xを使用する必要が出てきます。
spring.jpa.database=mysql
を指定すると、MySQL57Dialectを参照しにいく
application.properties
でspring.jpa.database=mysql
を指定すると、以下のエラーが発生します。
defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: org/hibernate/dialect/MySQL57Dialect
Hibernate 5.xではMySQL57Dialectは存在しますが、Hibernate 6.xでは削除されており、MySQLDialectを使用するように変わっています。
spring.jpa.database=mysql
の設定は、spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
の設定よりも優先されるようで、spring.jpa.database=mysql
の設定を行うと、spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
の設定を行ってもMySQL57Dialect
を探しにいくようです。
どうすればいいのか
先に設定を示しましたが、設定のポイントは
- Spring Framework 6.xでSpring Data JPAを使用し、JPA ProviderとしてHibernateを使用する場合は、6.xを使用する
- dialectの指定を有効にするためには
spring.jpa.database=mysql
の設定は使用してはいけない
の2点になります。
新規構築時もそうですが、Spring Framwork 5.xから6.xへバージョンアップする際にもはまりそうなポイントだと思いました。