Jakarta Persistence と Hibernate のややこしい依存関係


はじめに

Hibernate 5系と6系と、JPAの名前空間の変更(javax.persistence -> jakarta.persistence)対応がややこしいので、と言うか経緯知らないと正しくバージョン選択できないので、ここにまとめておきます。

Hibernate ver Java ver Jakarta Persistence(JPA) 名前空間
Hibernate 5.3+ Java 8+ 2.2 javax.persistence
Hibernate 5.5+ Java 8+ 2.2 / 3.0 javax.persistence / jakarta.persistence
Hibernate 5.6+ Java 8+ 2.2 / 3.0 javax.persistence / jakarta.persistence
Hibernate 6.1+ Java 11+ 3.0 / 3.1 jakarta.persistence
Hibernate 6.2+ Java 11+ 3.1 jakarta.persistence

Hibernate 5.5 ~ 5.6 は、名前空間が javax.persistence のものと jakarta.persistence のもの2系統が提供されています。


Java Persistence API 2.2 (Jakarta Persistence 2.2)

Java EE8 に含まれる JPA仕様は JPA 2.2 です。 この時期に Jakarta EE8 に改名され、JPA は Jakarta Persistence 2.2 となりました。

JPA 2.2 と Jakarta Persistence 2.2 は名前こそ違うものの、同等品です。APIの名前空間も javax.persistence から変更ありません。

Jakarta Persistence 2.2 を使う場合は以下の依存定義となります。

dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:2.2.3")
    implementation("org.hibernate:hibernate-core:5.6.15.Final")
}

Java EE8 時代の javax.persistence:javax.persistence-api:2.2 も存在しますが、改名後の jakarta のものを使うべきでしょう。

Hibernate 5系では、Java8 以降がサポートされています。 もし Java11 などを使う場合には以下の依存を追加する必要があります。

dependencies {
    // ...
    implementation("org.glassfish.jaxb:jaxb-runtime:2.3.8")
}

Java 9 で導入されたモジュールにより、非推奨であった JAXB が削除され、JAXB(XML Binding) は EE9 仕様に移管されました。

Hibernate は XML Binding の実装を利用すため、これを依存に追加する必要があります(Java 8 利用時には不要です)。


Jakarta Persistence 3.x

Jakarta EE9 では、javax.persistence -> jakarta.persistence への名前空間の変更が行われました。

これに伴い、Jakarta Persistence は Jakarta Persistence 3.0 になりました。 Jakarta Persistence 3.0 は Java EE9、 Jakarta Persistence 3.1 は Java EE10 に相当します。

Hibernate 5.x 系(正確には 5.5.x と 5.6.x)では、javax.persistencejakarta.persistence の2系統が提供されています。 Jakarta Persistence 3.X を、Hibernate 5.x 系で使う場合は以下の依存定義となります。

dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:3.1.0")
    implementation("org.hibernate:hibernate-core-jakarta:5.6.15.Final")
    implementation("org.glassfish.jaxb:jaxb-runtime:4.0.2")
}

名前空間 jakarta.persistence に対応した hibernate-core-jakarta を利用します。


Jakarta XML Binding 3.X は Jakarta EE9(つまり名前空間は jakarta.xml.bind)、Jakarta XML Binding 4.X は Jakarta EE10 の仕様に含まれます。 Jakarta XML Binding の実装である jaxb-runtime のメジャーバージョンもこれに該当します。

Jakarta EE の同一バージョンの組み合わせは以下のようになります。

  • jakarta.persistence-api:3.0.x -> org.glassfish.jaxb:jaxb-runtime:3.x.x
  • jakarta.persistence-api:3.1.x -> org.glassfish.jaxb:jaxb-runtime:4.x.x


Hibernate 6.x

Hibernate 6.x からは名前空間 jakarta.persistence への完全移行が行われました。 hibernate-core-jakarta のような2系統リリースは無くなり、1本に統一されています。

以下のような依存定義になります。

dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:3.1.0")
    implementation("org.hibernate.orm:hibernate-core:6.1.7.Final")
    implementation("org.glassfish.jaxb:jaxb-runtime:4.0.2")
}

グループIDは、org.hibernate -> org.hibernate.orm へ変更されているので注意が必要です。


まとめ

依存は以下のパターンでの定義になるでしょう。

  • Jakarta Persistence 2.2(名前空間 javax.persistence) - Java8 - Jakarta EE8
dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:2.2.3")
    implementation("org.hibernate:hibernate-core:5.6.15.Final")
}
  • Jakarta Persistence 2.2(名前空間 javax.persistence) - Java11 - Jakarta EE8
dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:2.2.3")
    implementation("org.hibernate:hibernate-core:5.6.15.Final")
    implementation("org.glassfish.jaxb:jaxb-runtime:2.3.8")
}
  • Jakarta Persistence 3.0(名前空間 jakarta.persistence) - Java11 - Jakarta EE9 - Hibernate 5
dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:3.0.0")
    implementation("org.hibernate:hibernate-core-jakarta:5.6.15.Final")
    implementation("org.glassfish.jaxb:jaxb-runtime:3.0.2")
}
  • Jakarta Persistence 3.1(名前空間 jakarta.persistence) - Java11 - Jakarta EE10 - Hibernate 6
dependencies {
    compileOnly("jakarta.persistence:jakarta.persistence-api:3.1.0")
    implementation("org.hibernate.orm:hibernate-core:6.1.7.Final")
    implementation("org.glassfish.jaxb:jaxb-runtime:4.0.2")
}