Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?
Webで例を見ると、同じ意味で使用されていることがわかります。
それらの違いは何ですか?
なぜあなたは一方を他方の上に使いたいのですか?
Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?
Webで例を見ると、同じ意味で使用されていることがわかります。
それらの違いは何ですか?
なぜあなたは一方を他方の上に使いたいのですか?
JpaRepository
extendsPagingAndSortingRepository
は次に extends を拡張しCrudRepository
ます。
主な機能は次のとおりです。
CrudRepository
主に CRUD 機能を提供します。PagingAndSortingRepository
ページネーションとレコードの並べ替えを行うメソッドを提供します。JpaRepository
永続コンテキストのフラッシュやバッチでのレコードの削除など、いくつかの JPA 関連のメソッドを提供します。上記の継承により、 JpaRepository
は と のすべての機能をCrudRepository
持ちPagingAndSortingRepository
ます。JpaRepository
したがって、およびによって提供される機能をリポジトリに持たせる必要がない場合はPagingAndSortingRepository
、 を使用してCrudRepository
ください。
ケンの答えは基本的に正しいですが、「なぜ一方を他方に使いたいのですか?」という質問に答えたいと思います。あなたの質問の一部。
リポジトリ用に選択する基本インターフェースには、主に 2 つの目的があります。まず、Spring Data リポジトリ インフラストラクチャがインターフェイスを検出し、プロキシの作成をトリガーして、クライアントにインターフェイスのインスタンスを挿入できるようにします。2 つ目の目的は、追加のメソッドを宣言することなく、必要なだけの機能をインターフェイスに取り込むことです。
Spring Data コア ライブラリには、専用の機能セットを公開する 2 つの基本インターフェイスが付属しています。
CrudRepository
- CRUD メソッドPagingAndSortingRepository
- ページネーションとソートのメソッド (extends CrudRepository
)個々のストア モジュール (JPA や MongoDB など) は、これらの基本インターフェイスのストア固有の拡張機能を公開して、フラッシュや専用のバッチ処理など、ストア固有の機能を考慮したストア固有の機能にアクセスできるようにします。これの例は、クエリを使用して特定のエンティティを削除するdeleteInBatch(…)
のJpaRepository
とは異なりdelete(…)
ます。これはよりパフォーマンスが高いですが、JPA 定義のカスケードをトリガーしないという副作用があります (仕様で定義されているように)。
これらのベース インターフェイスは、基盤となる永続化テクノロジをクライアントに公開し、クライアントとリポジトリ間の結合を強化するため、通常は使用しないことをお勧めします。さらに、基本的に「エンティティのコレクション」であるリポジトリの元の定義から少し離れます。できれば、一緒にいてPagingAndSortingRepository
ください。
提供されている基本インターフェースの 1 つに直接依存することの欠点は 2 つあります。どちらも理論的なものと見なされるかもしれませんが、知っておくことが重要だと思います。
Page
またはのような抽象化を使用する可能性があるため、これは特定の問題ではないと思います。Pageable
Spring Data は、commons-lang や Guava などの他の汎用ライブラリと何ら変わりはありません。それが合理的な利益を提供する限り、それは問題ありません。CrudRepository
、永続化メソッドの完全なセットを一度に公開します。これはおそらくほとんどの状況で問題ありませんが、公開されているメソッドをよりきめ細かく制御したい状況に遭遇する場合があります。たとえば、およびのメソッドをReadOnlyRepository
含まないを作成する場合などです。save(…)
delete(…)
CrudRepository
これら両方の欠点に対する解決策は、独自のベース リポジトリ インターフェイスまたはそれらのセットを作成することです。多くのアプリケーションで、次のようなものを見てきました。
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
Long
最初のリポジトリ インターフェイスは、実際にはポイント 1 のみを修正するだけでなく、一貫性のために ID タイプを結び付ける汎用ベース インターフェイスです。2 番目のインターフェイスには、通常、すべてのfind…(…)
メソッドがコピーされていますが、操作するメソッドは公開されCrudRepository
てPagingAndSortingRepository
いません。このアプローチの詳細については、リファレンス ドキュメントを参照してください。
リポジトリの抽象化により、アーキテクチャと機能のニーズによって完全に駆動されるベース リポジトリを選択できます。必要に応じて独自のリポジトリ ベース インターフェイスを作成し、そのまま使用できます。やむを得ない場合を除き、ストア固有のリポジトリ インターフェイスには近づかないでください。
Crud リポジトリは基本インターフェースであり、マーカー インターフェースとして機能します。
JPA リポジトリは、PagingAndSorting リポジトリも拡張します。ページネーションの実装に役立つすべてのメソッドを提供します。Crud リポジトリは、ページネーションとソートを実装するためのメソッドを提供しません