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 階層全体のサブセットのみを示していることに注意してください。)

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)

	// ...
}
これらのアノテーションを活用するためにアプリケーションコンテキストを構成する方法の詳細については、各永続化テクノロジの特定のカバレッジを参照してください。