5.8. Hibernate および JPA の移行の変更
5.8.1. Hibernate ORM 3.0
JBoss EAP 6.4 の Hibernate ORM 3 を簡単に使用できるようにする統合クラスは JBoss EAP 7 から削除されました。膨大な作業を行わないと JBoss EAP で Hibernate ORM 3 を実行できなくなったため、アプリケーションが Hibernate ORM 3 ライブラリーを使用する場合は、アプリケーションを移行して Hibernate ORM 5 を使用するようにすることが強く推奨されます。Hibernate ORM 5 へ移行できない場合は、Hibernate ORM 3 JAR のカスタム JBoss モジュールを定義し、アプリケーションから Hibernate ORM 5 のクラスを除外する必要があります。
5.8.2. Hibernate ORM 4.0 - 4.3
アプリケーションに対して 2 次キャッシュを有効にする必要がある場合、nfinispan 8.x が Hibernate ORM 5.0 と統合されたことに注意してください。Infinispan を Hibernate の 2 次キャッシュプロバイダーとして使用するためのサポートは、Hibernate ORM 5.3 の Infinispan プロジェクトに移されました。 そのため、hibernate-infinispan
モジュールは本リリースより削除されました。
Hibernate ORM 4.x で作成されたアプリケーションは Hibernate ORM 4.x を引き続き使用できます。Hibernate ORM 4.x JAR のカスタム JBoss モジュールを定義し、アプリケーションから Hibernate ORM 5 クラスを排除する必要があります。しかし、Hibernate ORM 5 を使用するようにアプリケーションコードを書き直すことが強く推奨されます。Hibernate ORM 5 への移行に関する情報は、「Hibernate ORM 5 への移行」を参照してください。
5.8.3. Hibernate ORM 5 への移行
JBoss EAP 7.0 には Hibernate ORM 5.0 が含まれていました。ここでは、Hibernate ORM をバージョン 4.3 からバージョン 5 に移行する際に必要な変更について説明します。Hibernate ORM 4 から Hibernate ORM 5 の間に実装された変更は、『Hibernate ORM 5.0 Migration Guide』を参照してください。
削除および非推奨となったクラス
以下のクラスは非推奨となり、Hibernate ORM 5 から削除されました。
クラスおよびパッケージのその他の変更
-
ブートストラップの再設計に合わせて、
org.hibernate.integrator.spi.Integrator
インターフェースが変更になりました。 -
新しいパッケージ
org.hibernate.engine.jdbc.env.spi
が作成されました。これには、org.hibernate.engine.jdbc.spi.JdbcServices
インターフェースから展開されたorg.hibernate.engine.jdbc.env.spi.JdbcEnvironment
インターフェースが含まれます。 -
org.hibernate.id.PersistentIdentifierGenerator
実装に影響する、新しいorg.hibernate.boot.model.relational.ExportableProducer
インターフェースが導入されました。 -
org.hibernate.id.Configurable
の署名が変更になり、org.hibernate.dialect.Dialect
のみでなくorg.hibernate.service.ServiceRegistry
を許可するようになりました。 -
org.hibernate.metamodel.spi.TypeContributor
インターフェースはorg.hibernate.boot.model.TypeContributor
に移行されました。 -
org.hibernate.metamodel.spi.TypeContributions
インターフェースはorg.hibernate.boot.model.TypeContributions
に移行されました。
タイプ処理
-
組み込みの
org.hibernate.type.descriptor.sql.SqlTypeDescriptor
実装は、org.hibernate.type.descriptor.sql.SqlTypeDescriptorRegistry
で自動登録しないようになりました。組み込みの実装を拡張し、その動作に依存するカスタムSqlTypeDescriptor
実装を使用するアプリケーションを更新し、SqlTypeDescriptorRegistry.addDescriptor()
を呼び出すようにする必要があります。 -
生成された UUID として定義された ID では、
BINARY(16)
を生成して適切に比較が行われるようにするため、一部のデータベースでは@Column(length=16)
を明示的に設定する必要があります。 -
name-mapping を希望する、javax.persistence.EnumType.STRING
hbm.xml
に定義されたEnumType
マッピングでは、useNamed(true)
設定を使用するか、VARCHAR の値を12
に指定して、設定を明示的に示す必要があります。
トランザクション管理
-
Hibernate ORM 5 では、トランザクションSPI が大幅に再設計されました。Hibernate ORM 4.3 では、
org.hibernate.Transaction
API を使用して異なるバックエンドトランザクションストラテジーに直接アクセスしました。Hibernate ORM 5 には間接参照のレベルが導入されました。org.hibernate.Transaction
実装はバックエンドで、バックエンドストラテジーに応じて指定のセッションのトランザクションコンテキストを表すorg.hibernate.resource.transaction.TransactionCoordinator
と対話するようになりました。開発者への直接的な影響はありませんが、ブートストラップの設定に影響する可能性があります。これまで、アプリケーションは非推奨となったhibernate.transaction.factory_class
プロパティーを指定し、org.hibernate.engine.transaction.spi.TransactionFactory
FQN (完全修飾名) を参照しました。Hibernate ORM 5 では、hibernate.transaction.coordinator_class
設定を指定し、org.hibernate.resource.transaction.TransactionCoordinatorBuilder
を参照します。詳細は、「org.hibernate.cfg.AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY
」を参照してください。 以下の短縮名が認識されるようになりました。
-
jdbc: JDBC
java.sql.Connection
を使用してトランザクションを管理します。これは、JPA 以外のトランザクションのデフォルトです。 jta: JTA を使用してトランザクションを管理します。
重要JPA アプリケーションが
hibernate.transaction.coordinator_class
プロパティーの設定を提供しない場合、Hibernate は永続化ユニットのトランザクションタイプを基にして自動的に適切なトランザクションコーディネーターを構築します。JPA でないアプリケーションが
hibernate.transaction.coordinator_class
プロパティーの設定を提供しない場合、Hibernate はデフォルトでjdbc
を使用してトランザクションを管理します。アプリケーションが実際に JTA ベースのトランザクションを使用する場合は、このデフォルトによって問題が発生します。JTA ベースのトランザクションを使用する JPA でないアプリケーションでは、hibernate.transaction.coordinator_class
プロパティーの値を明示的にjta
に設定するか、JTA ベースのトランザクションを適切に調整するorg.hibernate.resource.transaction.TransactionCoordinator
を構築するカスタムのorg.hibernate.resource.transaction.TransactionCoordinatorBuilder
を提供する必要があります。
-
jdbc: JDBC
Hibernate ORM 5 のその他の変更
-
cfg.xml
ファイルは完全に解析され、イベント、セキュリティー、およびその他の関数と統合されます。 -
EntityManagerFactory
を使用してcfg.xml
からロードされたプロパティーは、これまで名前の前にhibernate
が付きませんでした。これにより、一貫性が確立されました。 - 設定がシリアライズ不可能になりました。
-
org.hibernate.dialect.Dialect.getQuerySequencesString()
メソッドがカタログ、スキーマ、およびインクリメントの値を取得するようになりました。 -
AuditConfiguration
はorg.hibernate.envers.boot.internal.EnversService
から削除されました。 -
AuditStrategy
メソッドが変更され、廃止されたAuditConfiguration
を削除し、新しいEnversService
を使用するようになりました。 -
org.hibernate.hql.spi
パッケージおよびサブパッケージの複数のクラスおよびインターフェースが新しいorg.hibernate.hql.spi.id
に移動されました。これにはMultiTableBulkIdStrategy
クラスが含まれ、さらにAbstractTableBasedBulkIdHandler
、TableBasedDeleteHandlerImpl
、およびTableBasedUpdateHandlerImpl
インターフェースとそれらのサブクラスが含まれます。 - プロパティーアクセスコントラクトが完全に再設計されました。
-
有効な
hibernate.cache.default_cache_concurrency_strategy
設定の値は、org.hibernate.cache.spi.access.AccessType
列挙定数ではなく、org.hibernate.cache.spi.access.AccessType.getExternalName()
メソッドを使用して定義されるようになりました。これにより、他の Hibernate 設定と統一されます。
5.8.4. Hibernate ORM 5.0 から Hibernate ORM 5.1 への移行
JBoss EAP 7.1 には Hibernate ORM 5.1 が含まれていました。ここでは、この 2 つの違いと、Hibernate ORM のバージョン 5.0 からバージョン 5.1 に移行する際に必要な変更について説明します。
Hibernate ORM 5.1 の機能
このリリースの Hibernate には、JBoss EAP 7.1.0 リリースノート の Hibernate ORM 5.1 の機能 に記載されているパフォーマンスの改善やバグ修正が含まれます。Hibernate ORM 5.0 から Hibernate ORM 5.1 の間に実装された変更に関する詳細は、『Hibernate ORM 5.1 Migration Guide』を参照してください。
スキーマ管理ツールの変更
JBoss EAP 7 でのスキーマ管理ツールの変更
Hibernate ORM 5.1 のスキーマ管理ツールは、主に以下の項目を中心に変更されています。
-
hbm2ddl.auto
と Hibernate の JPAschema-generation
サポートの処理を統合。 - NoSQL データストアの Java Persistance (JPA) サポートを提供する永続化エンジンである Hibernate OGM の置き換えを容易にするため、SPI から JDBC の懸念事項を削除。
移行時にスキーマ管理ツールの変更に注意する必要があるのは、以下のクラスを直接使用するアプリケーションのみです。
-
org.hibernate.tool.hbm2ddl.SchemaExport
-
org.hibernate.tool.hbm2ddl.SchemaUpdate
-
org.hibernate.tool.hbm2ddl.SchemaValidator
-
org.hibernate.tool.schema.spi.SchemaManagementTool
またはこの委譲
JBoss EAP 7.1 でのスキーマ管理ツールの変更
JBoss EAP 7.1 に含まれる Hibernate ORM 5.1.10 には、SchemaMigrator
および SchemaValidator
のパフォーマンスを向上するデータベーステーブル取得の新しいストラテジーが導入されました。このストラテジーは、単一の java.sql.DatabaseMetaData#getTables(String, String, String, String[])
呼び出しを実行して、各 javax.persistence.Entity
がマップされたデータベーステーブルを持っているかどうかを判断します。これはデフォルトのストラテジーで、hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=grouped
プロパティー設定を使用します。このストラテジーには、hibernate.default_schema
や hibernate.default_catalog
を提供する必要があることがあります。
each javax.persistence.Entity
に java.sql.DatabaseMetaData#getTables(String, String, String, String[])
呼び出しを実行する旧式のストラテジーを使用するには、hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=individually
プロパティー設定を使用します。
5.8.5. Hibernate ORM 5.1 から Hibernate ORM 5.3 への移行
JBoss EAP 7.2 には Hibernate ORM 5.3 が含まれていました。ここでは、この 2 つの違いと、Hibernate ORM のバージョン 5.1からバージョン 5.3 に移行する際に必要な変更について説明します。
Hibernate ORM 5.2 の機能
Hibernate ORM 5.2 は、Java 8 JDK を使用して構築され、起動時に Java 8 JRE が必要になります。以下は、本リリースに追加された変更の一部を示しています。
-
The
hibernate-java8
モジュールはhibernate-core
にマージされ、Java 8 date/time データ型はネイティブにサポートされるようになりました。 -
hibernate-entitymanager
モジュールはhibernate-core
にマージされました。HibernateEntityManager
およびHibernateEntityManagerFactory
は非推奨となりました。 -
非推奨のクラスを削除し、JPA Metamodel API と適合させるため、
Session
、StatelessSession
、およびSessionFactory
クラスの階層がリファクタリングされました。 -
org.hibernate.persister
およびorg.hibernate.tuple
パッケージの SPI が変更になりました。これらの SPI を使用したカスタムクラスをすべて確認および更新する必要があります。 -
LimitHandler
の変更によって、レガシー Hibernate 4.3 の制限ハンドラーの動作を有効にできる新しいhibernate.legacy_limit_handler
設定が追加されました。これはデフォルトでfalse
に設定されています。 これは一部のダイアレクトに影響します。 -
SchemaMigrator
およびSchemaValidator
のパフォーマンスを向上する、データベーステーブル取得の新しいストラテジーが導入されました。 -
本リリースでは、PostgreSQL81Dialect とそのサブクラスの使用時に、
@Lob
アノテーションが付けられたString
、character[]
、およびCharacter[]
属性のCLOB
値を処理する方法が変更になりました。 -
@TableGenerator
および@SequenceGenerator
名の範囲がグローバルからローカルに変更になりました。
Hibernate 5.2 に実装された変更の完全リストは、『Hibernate ORM 5.2 Migration Guide』を参照してください。
Hibernate ORM 5.3 の機能
Hibernate ORM 5.3 には JPA 2.2 仕様のサポートが追加されました。本リリースにはこの仕様に準拠する変更と、その他の改善点が含まれています。以下にこれらの変更の一部を示します。
位置クエリーパラメーター処理の変更により、以下が変更になりました。
- HQL/JPQL クエリーの JDBC スタイルパラメーター宣言のサポートが削除されました。
- JPA 位置パラメーターは名前付きパラメーターのように動作します。
-
ネイティブクエリーの JDBC スタイルパラメーター宣言は、JPA との一貫性を保つため、ゼロベースではなく 1 ベースのパラメーターバインディングを使用します。ゼロベースのバインディングに戻すには、
hibernate.query.sql.jdbc_style_params_base
プロパティーをtrue
に設定します。
-
JPA に準拠するため、
@TableGenerator
値によって保存されるシーケンス値は最後に生成された値になります。これまで Hibernate は、次のシーケンス値を保存しました。このレガシー動作を有効にするには、hibernate.id.generator.stored_last_used
プロパティーを使用します。@TableGenerator
を使用し、Hibernate 5.3 に移行する既存のアプリケーションはhibernate.id.generator.stored_last_used configuration
プロパティーをfalse
に設定する必要があります。 -
org.hibernate.query.QueryParameter
クラスのgetType()
メソッドの名前がgetHibernateType()
に変更されました。 - さまざまなキャッシングプロバイダーの要件により多く適合するため、Hibernate の 2次レベルキャッシュ SPI が再設計されました。詳細は「HHH-11264」を参照してください。
- HHH-11356 の変更により、コンシューマーの変更も必要になりました。 これは Hibernate Statistics システムに影響します。
-
ネイティブアプリケーションの Hibernate ORM 5.1 から 5.3 への移行を容易にし、Hibernate 5.1 の改ページ調整動作を維持するため、一部のメソッドが一時的に
org.hibernate.Query
クラスに追加されましたが、これらのメソッドは非推奨となりました。今後のバージョンの Hibernate に移植できるようにするため、JPA メソッドを使用するようアプリケーションをアップデートする必要があります。 -
Infinispan を Hibernate の 2 次キャッシュプロバイダーとして使用するためのサポートは、Infinispan プロジェクトに移されました。そのため、
hibernate-infinispan
モジュールは削除されました。 -
org.hibernate.tool.enhance.EnhancementTask
Ant タスクの API が変更になりました。setBase()
およびsetDir()
メソッドが推奨されるため、addFileset()
メソッドは削除されました。詳細は「HHH-11264
」を参照してください。 - Hibernate 4.3 で見つかったバグにより、明示的にレイジーとしてマップした場合でも、埋め込み可能なコレクション要素と複合 ID の多対 1 の関連が集中的に取得されました。Hibernate 5.3.2 ではこのバグが修正されました。そのため、このような関連はマッピングで指定されたとおりに取得されるようになりました。詳細は「HHH-11264」を参照してください。
-
本リリースでは、Hibernate イベントリスナーの JPA とネイティブ実装が統一されました。そのため、
JpaIntegrator
クラスは廃止されました。org.hibernate.jpa.event.spi.JpaIntegrator
を拡張するクラスを変更し、org.hibernate.integrator.spi.Integrator
インターフェースを実装するように変更する必要があります。詳細は「HHH-11264」を参照してください。 -
org.hibernate.persister
パッケージの SPI が変更になりました。これらの SPI を使用したカスタムクラスをすべて確認および更新する必要があります。
Hibernate 5.3 に実装された変更の完全リストは、『Hibernate ORM 5.3 Migration Guide』を参照してください。
5.8.5.1. Hibernate 5.1 および Hibernate 5.3 間の例外処理の変更
Hibernate 5.2 と 5.3 では、JPA 仕様に準拠して、Hibernate のネイティブブートストラップを使用して構築される SessionFactory
の例外処理は HibernateException
をラッピングまたは変換しました。Session.save()
や Session.saveOrUpdate()
のように操作が Hibernate 固有の場合のみこの動作の例外となります。
Hibernate 5.3.3 では、hibernate.native_exception_handling_51_compliance
プロパティーが追加されました。このプロパティーは、Hibernate のネイティブブートストラップを使用して構築された SessionFactory
の例外処理が、Hibernate ORM 5.1 でのネイティブの例外処理と同じように動作すべきかどうかを示します。true
に設定すると HibernateException
は JPA 仕様のとおりにラップまたは変換されません。この設定は、JPA ブートストラップを使用して構築された SessionFactory
では無視されます。
5.8.5.2. 互換性トランスフォーマー
JBoss EAP 7.2 には、Hibernate ORM 5.1 との互換性がなくなった Hibernate ORM 5.3 API メソッドに対応する互換性トランスフォーマーが含まれています。トランスフォーマーは、Hibernate ORM 5.1 を使用して構築されたアプリケーションが JBoss EAP 7.2 の Hibernate 5.3 で同じ動作を実行できるようにする一時的な措置です。これは一時的な対策であり、これらのメソッド呼び出しを推奨される JPA メソッド呼び出しに置き換える必要があります。
トランスフォーマーを有効にするには、以下の方法の 1 つを使用します。
-
Hibernate51CompatibilityTransformer
システムプロパティーをtrue
に設定すると、トランスフォーマーをすべてのアプリケーションに対してグローバルに有効化できます。 jboss-deployment-structure.xml
ファイルを使用すると、アプリケーションレベルでトランスフォーマーを有効にできます。<jboss-deployment-structure> <deployment> <transformers> <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/> </transformers> </deployment> <sub-deployment name="main.war"> <transformers> <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/> </transformers> </sub-deployment> </jboss-deployment-structure>
以下の表は、変換前の Hibernate 5.1 メソッドと、変換後の Hibernate 5.3 メソッドを表しています。
Hibernate 5.1 のリファレンスまたはメソッド | 変換後の Hibernate 5.3 のリファレンスまたはメソッド |
---|---|