ここでは、前述の各テクノロジーの概要を示します。
春だお
Spring-DAOは厳密な意味でのSpringモジュールではなく、DAOを記述し、それらを適切に記述しなければならない規則です。そのため、データにアクセスするためのインターフェースも実装もテンプレートも提供しません。DAOを作成するとき@Repository
は、基盤となるテクノロジー(JDBC、Hibernate、JPAなど)にリンクされた例外が一貫して適切なDataAccessException
サブクラスに変換されるように、それらに注釈を付ける必要があります。
例として、現在Hibernateを使用HibernateException
していて、それに反応するためにサービスレイヤーがキャッチするとします。JPAに変更しても、DAOのインターフェースは変更されず、サービスレイヤーはHibernateException
catchするブロックを使用してコンパイルされますが、DAOがJPAをスローしているため、これらのブロックに入ることはありませんPersistenceException
。@Repository
DAOで使用することにより、基盤となるテクノロジーにリンクされた例外がSpringに変換されDataAccessException
ます。サービスレイヤーがこれらの例外をキャッチし、永続化テクノロジを変更する場合DataAccessExceptions
でも、Spring がネイティブの例外を変換しているため、同じSpring が引き続きスローされます。
ただし、次の理由により、これには使用制限があります。
- プロバイダーは(正確な例外サブタイプに応じて)トランザクションをロールバックした可能性があるため、通常は永続化例外をキャッチしないでください。したがって、代替パスで実行を継続しないでください。
- 例外の階層は通常、Springが提供するものよりもプロバイダーで豊富であり、プロバイダー間での明確なマッピングはありません。これに依存することは危険です。ただし
@Repository
、Beanはスキャン手順によって自動的に追加されるため、DAOにで注釈を付けることをお勧めします。さらに、Springは他の便利な機能を注釈に追加する場合があります。
Spring-JDBC
Spring-JDBCが提供するJdbcTemplateクラスは、配管コードを削除し、SQLクエリとパラメーターに集中するのに役立ちます。あなたはそれをで構成する必要があるだけDataSource
で、次のようなコードを書くことができます:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBCはJdbcDaoSupportも提供します。これを拡張してDAOを開発できます。基本的に2つのプロパティを定義します。DAOメソッドの実装に使用できるDataSourceとJdbcTemplateです。また、SQL例外からSpring DataAccessExceptionsへの例外トランスレーターを提供します。
プレーンなjdbcを使用する場合は、これが使用する必要のあるモジュールです。
Spring-ORM
Spring-ORMは、JPA、JDO、Hibernate、iBatisなど、多くの永続化技術をカバーする包括的なモジュールです。これらのテクノロジごとに、Springは統合クラスを提供し、Springの構成原則に従って各テクノロジを使用できるようにし、Springトランザクション管理とスムーズに統合します。
各技術のために、構成が基本的に注入することからなるDataSource
、いくつかの種類に豆をSessionFactory
、またはEntityManagerFactory
等ビーン。純粋なJDBCの場合、JDBCはDataSourceにのみ依存するため、JdbcTemplateを除いて、そのような統合クラスは必要ありません。
JPAやHibernateなどのORMを使用する場合は、spring-jdbcは必要ありませんが、このモジュールのみが必要です。
春のデータ
Spring-Dataは、より一般的な方法でデータ(DAO +注釈)にアクセスする方法を定義するための共通APIを提供する包括的なプロジェクトであり、SQLおよびNOSQLデータソースの両方をカバーします。
最初のアイデアは、開発者がDAO(ファインダーメソッド)とエンティティクラスのインターフェイスをテクノロジにとらわれない方法で記述し、構成のみ(DAOとエンティティの注釈+ Spring構成に基づく)に基づいてテクノロジを提供することですxml-またはjava-based)は、JPA(SQL)、redis、hadoopなど(NOSQL)の実装テクノロジを決定します。
finderメソッド名について、springによって定義された命名規則に従う場合、最も単純なケースでは、finderメソッドに対応するクエリ文字列を提供する必要すらありません。その他の状況では、ファインダーメソッドのアノテーション内にクエリ文字列を提供する必要があります。
アプリケーションコンテキストが読み込まれると、Springは、データアクセステクノロジーに関連するすべてのボイラープレートコードを含むDAOインターフェースのプロキシを提供し、構成されたクエリを呼び出します。
Spring-Dataは非SQLテクノロジーに集中していますが、JPA(唯一のSQLテクノロジー)のモジュールを提供しています。
次は何ですか
これをすべて理解したら、次に何を選ぶかを決定する必要があります。ここでの朗報は、テクノロジの最終的な最終決定を行う必要がないことです。これが実際にSpringパワーが存在する場所です。開発者は、コードを書くときにビジネスに集中します。うまくやれば、基盤となるテクノロジーの変更は実装または構成の詳細になります。
- エンティティのPOJOクラスを使用してデータモデルを定義し、エンティティの属性と他のエンティティとの関係を表すget / setメソッドを定義します。確かに、テクノロジーに基づいてエンティティーのクラスとフィールドに注釈を付ける必要がありますが、今のところ、POJOで十分です。とりあえず、ビジネス要件に集中してください。
- DAOのインターフェースを定義します。1つのDAOは正確に1つのエンティティをカバーしますが、関係をナビゲートすることで追加のエンティティをロードできるはずなので、それぞれにDAOは必要ありません。厳密な命名規則に従ってファインダーメソッドを定義します。
- これに基づいて、DAOのモックを使用して、他の誰かがサービス層の作業を開始できます。
- さまざまな永続化テクノロジ(sql、no-sql)を学習してニーズに最適なものを見つけ、それらの1つを選択します。これに基づいて、エンティティに注釈を付けてDAOを実装します(または、spring-dataの使用を選択した場合は、Springにエンティティを実装させます)。
- ビジネス要件が進化し、データアクセステクノロジーがそれをサポートするのに十分でない場合(たとえば、JDBCといくつかのエンティティから始めたが、より豊富なデータモデルが必要であり、JPAがより適切な選択肢である場合)、実装を変更する必要があります。 DAOのいくつかのアノテーションをエンティティに追加し、Spring構成を変更します(EntityManagerFactory定義を追加します)。ビジネスコードの残りの部分には、変更による他の影響はありません。
注:トランザクション管理
Springはトランザクション管理用のAPIを提供します。データアクセスにSpringを使用する場合は、Springをトランザクション管理にも使用する必要があります。これらは非常によく統合されているためです。Springでサポートされている各データアクセステクノロジには、ローカルトランザクションに対応するトランザクションマネージャーがあり、分散トランザクションが必要な場合はJTAを選択できます。それらはすべて同じAPIを実装しているため、(ここでも)テクノロジの選択は、ビジネスコードに影響を与えることなく変更できる構成にすぎません。
注:Springのドキュメント
あなたが言及したSpringのドキュメントへのリンクはかなり古いです。以下は最新リリースのドキュメントです(4.1.6、すべてのトピックをカバー):
Spring-dataはSpringフレームワークの一部ではありません。原則に慣れるために最初に読む必要がある共通モジュールがあります。ドキュメントはここにあります: