DAO サポート
Spring のデータアクセスオブジェクト(DAO)サポートは、データアクセステクノロジ(JDBC、Hibernate、JPA など)を一貫した方法で簡単に操作できるようにすることを目的としています。これにより、前述の永続化テクノロジーを非常に簡単に切り替えることができ、各テクノロジーに固有の例外をキャッチすることを心配せずにコーディングすることもできます。
一貫した例外階層
Spring は、SQLException
などのテクノロジー固有の例外から、DataAccessException
をルート例外として持つ独自の例外クラス階層への便利な変換を提供します。これらの例外は元の例外をラップするため、何が間違っていたのかについての情報を失うリスクはありません。
JDBC 例外に加えて、Spring は JPA および Hibernate 固有の例外をラップして、集中的なランタイム例外のセットに変換することもできます。これにより、DAO で煩わしい定型的なキャッチアンドスローブロックや例外宣言を行うことなく、適切なレイヤーでのみ、ほとんどの回復不可能な永続化例外を処理できます。(ただし、必要に応じて例外をトラップして処理できます)前述のように、JDBC 例外(データベース固有のダイアレクトを含む)も同じ階層に変換されます。つまり、一貫したプログラミングモデル内で JDBC を使用して一部の操作を実行できます。
上記の説明は、Spring のさまざまな ORM フレームワークのサポートにおけるさまざまなテンプレートクラスに当てはまります。インターセプターベースのクラスを使用する場合、アプリケーションは SessionFactoryUtils
の convertHibernateAccessException(..)
メソッドまたは convertJpaAccessException(..)
メソッドに委譲することにより、HibernateExceptions
および PersistenceExceptions
自体の処理に注意する必要があります。これらのメソッドは、例外を org.springframework.dao
例外階層の例外と互換性のある例外に変換します。PersistenceExceptions
はチェックされていないため、スローされる可能性があります(ただし、例外に関して汎用 DAO 抽象化を犠牲にします)。
次の図は、Spring が提供する例外階層を示しています。(イメージで詳細に示されているクラス階層は、DataAccessException
階層全体のサブセットのみを示していることに注意してください。)
DAO またはリポジトリクラスの構成に使用されるアノテーション
データアクセスオブジェクト(DAO)またはリポジトリが例外変換を提供することを保証する最良の方法は、@Repository
アノテーションを使用することです。また、このアノテーションにより、コンポーネントスキャンサポートは、XML 構成エントリを提供することなく、DAO およびリポジトリを検索および構成できます。次の例は、@Repository
アノテーションの使用方法を示しています。
Java
Kotlin
@Repository (1)
public class SomeMovieFinder implements MovieFinder {
// ...
}
1 | @Repository アノテーション。 |
@Repository (1)
class SomeMovieFinder : MovieFinder {
// ...
}
1 | @Repository アノテーション。 |
使用される永続化テクノロジーに応じて、DAO またはリポジトリの実装は永続化リソースにアクセスする必要があります。例: JDBC ベースのリポジトリは JDBC DataSource
にアクセスする必要があり、JPA ベースのリポジトリは EntityManager
にアクセスする必要があります。これを実現する最も簡単な方法は、@Autowired
、@Inject
、@Resource
または @PersistenceContext
アノテーションのいずれかを使用して、このリソース依存関係を注入することです。次の例は、JPA リポジトリに対して機能します。
Java
Kotlin
@Repository
public class JpaMovieFinder implements MovieFinder {
@PersistenceContext
private EntityManager entityManager;
// ...
}
@Repository
class JpaMovieFinder : MovieFinder {
@PersistenceContext
private lateinit var entityManager: EntityManager
// ...
}
従来の Hibernate API を使用する場合、次の例に示すように、SessionFactory
を注入できます。
Java
Kotlin
@Repository
public class HibernateMovieFinder implements MovieFinder {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// ...
}
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
// ...
}
ここで示す最後の例は、一般的な JDBC サポート用です。DataSource
を初期化メソッドまたはコンストラクターに挿入し、この DataSource
を使用して JdbcTemplate
およびその他のデータアクセスサポートクラス(SimpleJdbcCall
など)を作成できます。次の例は、DataSource
をオートワイヤーします。
Java
Kotlin
@Repository
public class JdbcMovieFinder implements MovieFinder {
private JdbcTemplate jdbcTemplate;
@Autowired
public void init(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// ...
}
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {
private val jdbcTemplate = JdbcTemplate(dataSource)
// ...
}
これらのアノテーションを活用するためにアプリケーションコンテキストを構成する方法の詳細については、各永続化テクノロジの特定のカバレッジを参照してください。 |