ORM 統合の一般的な考慮事項

このセクションでは、すべての ORM テクノロジーに適用される考慮事項について説明します。Hibernate セクションでは、詳細を提供し、これらの機能と構成を具体的なコンテキストで示します。

Spring の ORM 統合の主なゴールは、明確なアプリケーションレイヤーリング(データアクセスおよびトランザクションテクノロジを使用)およびアプリケーションオブジェクトの疎結合です。データアクセスまたはトランザクション戦略に対するビジネスサービスの依存関係、ハードコードされたリソースルックアップ、交換が困難なシングルトンが増え、カスタムサービスレジストリがなくなりました。ゴールは、アプリケーションオブジェクトをワイヤリングするための 1 つのシンプルで一貫したアプローチを持ち、可能な限りコンテナーの依存関係がないように再利用可能な状態に保つことです。個々のデータアクセス機能はすべて単独で使用できますが、Spring のアプリケーションコンテキストコンセプトとうまく統合し、Spring に対応する必要のないプレーンな JavaBean インスタンスの XML ベースの構成と相互参照を提供します。典型的な Spring アプリケーションでは、データアクセステンプレート、データアクセスオブジェクト、トランザクションマネージャー、データアクセスオブジェクトとトランザクションマネージャーを使用するビジネスサービス、Web ビューリゾルバー、ビジネスサービスを使用する Web コントローラーなど、多くの重要なオブジェクトが JavaBeans です。

リソースおよびトランザクション管理

典型的なビジネスアプリケーションは、反復的なリソース管理コードで散らかっています。多くのプロジェクトは独自のソリューションを発明しようとしますが、プログラミングの利便性のために障害の適切な処理を犠牲にすることもあります。Spring は、適切なリソース処理、つまり JDBC の場合はテンプレートを使用し、ORM テクノロジーに AOP インターセプターを適用する IoC の簡単なソリューションを提唱しています。

このインフラストラクチャは、適切なリソース処理と、特定の API 例外の未チェックのインフラストラクチャ例外階層への適切な変換を提供します。Spring では、あらゆるデータアクセス戦略に適用できる DAO 例外階層が導入されています。直接 JDBC の場合、前のセクションで説明した JdbcTemplate クラスは、接続処理と、データベース固有の SQL エラーコードの意味のある例外クラスへの変換を含む、SQLException から DataAccessException 階層への適切な変換を提供します。ORM テクノロジについては、同様の例外変換の利点を得る方法については、次のセクションを参照してください。

トランザクション管理に関しては、JdbcTemplate クラスは Spring トランザクションサポートに接続し、それぞれの Spring トランザクションマネージャーを介して JTA および JDBC トランザクションの両方をサポートします。サポートされている ORM テクノロジーについて、Spring は、Hibernate および JPA トランザクションマネージャーを介した Hibernate および JPA サポート、および JTA サポートを提供します。トランザクションサポートの詳細については、トランザクション管理の章を参照してください。

例外変換

DAO で Hibernate または JPA を使用する場合、永続化テクノロジーのネイティブ例外クラスの処理方法を決定する必要があります。DAO は、テクノロジーに応じて HibernateException または PersistenceException のサブクラスをスローします。これらの例外はすべてランタイム例外であり、宣言またはキャッチする必要はありません。IllegalArgumentException および IllegalStateException を処理する必要がある場合もあります。つまり、呼び出し元は、永続化テクノロジの独自の例外構造に依存する場合を除き、例外を一般に致命的なものとしてしか処理できないことを意味します。特定の原因(楽観的ロックの失敗など)をキャッチすることは、呼び出し元を実装戦略に結び付けない限り不可能です。このトレードオフは、強力な ORM ベースであるか、特別な例外処理を必要としない(またはその両方)アプリケーションに受け入れられる場合があります。ただし、Spring では、@Repository アノテーションを介して透過的に例外変換を適用できます。次の例(Java 構成用と XML 構成用)は、その方法を示しています。

  • Java

  • Kotlin

@Repository
public class ProductDaoImpl implements ProductDao {

	// class body here...

}
@Repository
class ProductDaoImpl : ProductDao {

	// class body here...

}
<beans>

	<!-- Exception translation bean post processor -->
	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

	<bean id="myProductDao" class="product.ProductDaoImpl"/>

</beans>

ポストプロセッサーは、すべての例外トランスレーター(PersistenceExceptionTranslator インターフェースの実装)を自動的に検索し、@Repository アノテーションでマークされたすべての Bean に通知して、検出されたトランスレーターがスローされた例外に対して適切な変換をインターセプトおよび適用できるようにします。

要約すると、Spring で管理されたトランザクション、依存性注入、Spring のカスタム例外階層への透過的な例外変換(必要に応じて)の恩恵を受けながら、プレーンな永続化テクノロジーの API とアノテーションに基づいて DAO を実装できます。