1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[メモ]Spring Boot 3.xでSpring Data JPAを使用する(Hibernate, MySQL)

Posted at

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の設定は以下のようになります。

build.gradle
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'
}
application.properties
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.propertiesspring.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へバージョンアップする際にもはまりそうなポイントだと思いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?