Spring を使用した ORM の概要

Spring Framework は、Java Persistence API(JPA)との統合をサポートし、リソース管理、データアクセスオブジェクト(DAO)の実装、トランザクション戦略のためのネイティブ Hibernate をサポートします。例: Hibernate には、多くの典型的な Hibernate 統合の課題に対処するいくつかの便利な IoC 機能を備えたファーストクラスのサポートがあります。依存性注入を介して、OR(オブジェクトリレーショナル)マッピングツールでサポートされているすべての機能を構成できます。Spring のリソースおよびトランザクション管理に参加でき、Spring の一般的なトランザクションおよび DAO 例外階層に準拠しています。推奨される統合スタイルは、プレーンな Hibernate または JPA API に対して DAO をコーディングすることです。

Spring は、データアクセスアプリケーションを作成するときに、選択した ORM レイヤーに大幅な機能強化を追加します。必要なだけ統合サポートを活用できます。また、この統合の取り組みを、同様のインフラストラクチャを社内で構築するコストとリスクと比較する必要があります。すべてが再利用可能な JavaBeans のセットとして設計されているため、テクノロジーに関係なく、ライブラリと同じように ORM サポートの多くを使用できます。Spring IoC コンテナーの ORM は、構成とデプロイを容易にします。このセクションのほとんどの例は、Spring コンテナー内の構成を示しています。

Spring Framework を使用して ORM DAO を作成する利点は次のとおりです。

  • より簡単なテスト。Spring の IoC アプローチにより、Hibernate SessionFactory インスタンス、JDBC DataSource インスタンス、トランザクションマネージャー、マッピングされたオブジェクトの実装(必要な場合)の実装と構成場所を簡単に交換できます。これにより、永続性に関連する各コードを個別にテストすることがはるかに簡単になります。

  • 一般的なデータアクセス例外。Spring は、ORM ツールからの例外をラップし、独自の(潜在的にチェックされる)例外を共通のランタイム DataAccessException 階層に変換できます。この機能を使用すると、適切なレイヤーでのみ、回復不可能なほとんどの永続性例外を処理できます。煩わしい定型的なキャッチ、スロー、例外宣言はありません。必要に応じて、例外をトラップして処理できます。JDBC 例外(DB 固有のダイアレクトを含む)も同じ階層に変換されることに注意してください。つまり、一貫したプログラミングモデル内で JDBC を使用していくつかの操作を実行できます。

  • 一般的なリソース管理。Spring アプリケーションコンテキストは、Hibernate SessionFactory インスタンス、JPA EntityManagerFactory インスタンス、JDBC DataSource インスタンス、およびその他の関連リソースの場所と構成を処理できます。これにより、これらの値の管理と変更が容易になります。Spring は、永続化リソースの効率的、簡単、安全な処理を提供します。例: Hibernate を使用する関連コードは、通常、同じ Hibernate Session を使用して、効率と適切なトランザクション処理を保証する必要があります。Spring では、Hibernate SessionFactory を介して現在の Session を公開することにより、Session を作成し、現在のスレッドに透過的に簡単にバインドできます。Spring は、ローカルまたは JTA トランザクション環境での典型的な Hibernate の使用に関する多くの慢性的な問題を解決します。

  • 統合トランザクション管理@Transactional アノテーションを使用するか、XML 構成ファイルでトランザクション AOP アドバイスを明示的に構成することにより、ORM コードを宣言型アスペクト指向プログラミング(AOP)スタイルのメソッドインターセプターでラップできます。どちらの場合も、トランザクションセマンティクスと例外処理(ロールバックなど)が処理されます。リソースおよびトランザクション管理で説明したように、ORM 関連のコードに影響を与えることなく、さまざまなトランザクションマネージャーを交換することもできます。例: 両方のシナリオで利用可能な同じ完全なサービス(宣言トランザクションなど)を使用して、ローカルトランザクションと JTA を交換できます。さらに、JDBC 関連のコードは、ORM の実行に使用するコードとトランザクション的に完全に統合できます。これは、ORM(バッチ処理や BLOB ストリーミングなど)には適していないが、ORM 操作と共通のトランザクションを共有する必要があるデータアクセスに役立ちます。

MongoDB などの代替データベーステクノロジのサポートを含む、より包括的な ORM サポートについては、Spring Data プロジェクトスイートをチェックアウトすることをお勧めします。JPA ユーザーの場合、spring.ioJPA を使用したデータへのアクセスの開始ガイドが優れた導入を提供します。