921

Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?

Webで例を見ると、同じ意味で使用されていることがわかります。

それらの違いは何ですか?

なぜあなたは一方を他方の上に使いたいのですか?

4

7 に答える 7

1273

JpaRepositoryextendsPagingAndSortingRepositoryは次に extends を拡張しCrudRepositoryます。

主な機能は次のとおりです。

  • CrudRepository主に CRUD 機能を提供します。
  • PagingAndSortingRepositoryページネーションとレコードの並べ替えを行うメソッドを提供します。
  • JpaRepository永続コンテキストのフラッシュやバッチでのレコードの削除など、いくつかの JPA 関連のメソッドを提供します。

上記の継承により、 JpaRepositoryは と のすべての機能をCrudRepository持ちPagingAndSortingRepositoryます。JpaRepositoryしたがって、およびによって提供される機能をリポジトリに持たせる必要がない場合はPagingAndSortingRepository、 を使用してCrudRepositoryください。

于 2012-12-24T19:36:34.490 に答える
451

ケンの答えは基本的に正しいですが、「なぜ一方を他方に使いたいのですか?」という質問に答えたいと思います。あなたの質問の一部。

基本

リポジトリ用に選択する基本インターフェースには、主に 2 つの目的があります。まず、Spring Data リポジトリ インフラストラクチャがインターフェイスを検出し、プロキシの作成をトリガーして、クライアントにインターフェイスのインスタンスを挿入できるようにします。2 つ目の目的は、追加のメソッドを宣言することなく、必要なだけの機能をインターフェイスに取り込むことです。

共通インターフェース

Spring Data コア ライブラリには、専用の機能セットを公開する 2 つの基本インターフェイスが付属しています。

  • CrudRepository- CRUD メソッド
  • PagingAndSortingRepository- ページネーションとソートのメソッド (extends CrudRepository)

店舗固有のインターフェース

個々のストア モジュール (JPA や MongoDB など) は、これらの基本インターフェイスのストア固有の拡張機能を公開して、フラッシュや専用のバッチ処理など、ストア固有の機能を考慮したストア固有の機能にアクセスできるようにします。これの例は、クエリを使用して特定のエンティティを削除するdeleteInBatch(…)JpaRepositoryとは異なりdelete(…)ます。これはよりパフォーマンスが高いですが、JPA 定義のカスケードをトリガーしないという副作用があります (仕様で定義されているように)。

これらのベース インターフェイスは、基盤となる永続化テクノロジをクライアントに公開し、クライアントとリポジトリ間の結合を強化するため、通常は使用しないことをお勧めします。さらに、基本的に「エンティティのコレクション」であるリポジトリの元の定義から少し離れます。できれば、一緒にいてPagingAndSortingRepositoryください。

カスタム リポジトリ ベース インターフェース

提供されている基本インターフェースの 1 つに直接依存することの欠点は 2 つあります。どちらも理論的なものと見なされるかもしれませんが、知っておくことが重要だと思います。

  1. Spring Data リポジトリ インターフェースに応じて、リポジトリ インターフェースをライブラリに結合します。とにかくコードでPageまたはのような抽象化を使用する可能性があるため、これは特定の問題ではないと思います。PageableSpring Data は、commons-lang や Guava などの他の汎用ライブラリと何ら変わりはありません。それが合理的な利益を提供する限り、それは問題ありません。
  2. eg を拡張することにより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…(…)メソッドがコピーされていますが、操作するメソッドは公開されCrudRepositoryPagingAndSortingRepositoryいません。このアプローチの詳細については、リファレンス ドキュメントを参照してください。

まとめ - tl;dr

リポジトリの抽象化により、アーキテクチャと機能のニーズによって完全に駆動されるベース リポジトリを選択できます。必要に応じて独自のリポジトリ ベース インターフェイスを作成し、そのまま使用できます。やむを得ない場合を除き、ストア固有のリポジ​​トリ インターフェイスには近づかないでください。

于 2013-12-26T11:25:27.650 に答える
0

Crud リポジトリは基本インターフェースであり、マーカー インターフェースとして機能します。

JPA リポジトリは、PagingAndSorting リポジトリも拡張します。ページネーションの実装に役立つすべてのメソッドを提供します。Crud リポジトリは、ページネーションとソートを実装するためのメソッドを提供しません

参照できます - https://www.tutorialspoint.com/difference-between-crudrepository-and-jparepository-in-java#:~:text=Crud%20Repository%20is%20the%20base,acts%20as%20a%20marker %20interface.&text=JPA%20repository%20also%20extends%20the,for%20implementing%20pagination%20and%20sorting .

于 2021-09-28T07:00:37.030 に答える