私は春を見た、JPAはリポジトリ(DAOレイヤー:私が間違っていない場合)を回避します。それでは、「Spring JPA + Hibernate」を使用する場合と「Hibernate」を直接使用する場合の違いは何ですか?
あなたが言ったように、JPAは、ある仕様ながら、Hibernateはその仕様の特定の実装である(これらの実装は、通常と呼ばれるプロバイダー)。Hibernateを使用することで、必要に応じて別のオプションに切り替える自由を制限するプロバイダーに縛られます(たとえば、Hibernateには開発プロセスを停止させるバグがあるため、代わりにEclipseLinkまたはObjectDBを使用したい)。
Spring Data JPAのドキュメントを引用:
アプリケーションのデータアクセスレイヤーの実装は、かなり長い間面倒でした。多すぎる定型コードを作成する必要がありました。ドメインクラスは貧弱で、実際のオブジェクト指向またはドメイン駆動の方法で設計されていません。
これらの両方のテクノロジーを使用すると、リッチドメインモデルの永続性に関して開発者の作業がはるかに楽になります。それにもかかわらず、リポジトリを実装するための定型コードの量は、特にまだ非常に多くなっています。したがって、Spring Dataのリポジトリ抽象化の目的は、さまざまな永続ストアのデータアクセス層を実装する労力を大幅に削減することです。
要約すると、これはJPAの上に、抽象化の別のレイヤーを追加するものであり、Springコンテキストで永続性レイヤーをサポートするための標準ベースの設計を定義するようなものです。これらの定義されたインターフェース(Springで知られています)は、JPAを使用して結果を提供するためにフレームワークが処理するサービスを提供します。Springがプロジェクトをスキャンして見つけられるようにリポジトリを定義します。
<repositories base-package="com.acme.repositories" />
したがって、コンテナのコンテキスト内またはコンテナの外で使用できるようにします。
では、Springとは具体的にはJPAです。Springであるか、JPAはJPAにいくつかの機能(インターフェース)を追加しましたが、それでも指定されているだけですか、それともJPAプロバイダーでもありますか?
Spring Data JPAは、定義したプロバイダーを使用してJPA仕様を参照することにより、内部でサポートされるリポジトリーを実装するための定義を提供します。