Spring Data JDBC/Spring Data JPA vs Hibernateを選択する典型的な実際のシナリオは何ですか?これらの実装のいずれかが最適なシナリオを理解したいと思います。
@Narosが言ったように、現在タイトルにあるような質問は実際には機能しません。私たちは本当に4つのオプションを見て、各アプローチの長所をリストする必要がありますが、短所は他の長所がないことです:
SpringデータなしのJDBC
何が起こっているかを100%きめ細かく制御できます。フレームワークによって何も生成または注入されません。これは詐欺のように聞こえるかもしれませんが、マッピングと設定を微調整してJPA実装を取得して、JavaおよびSQL大きなプロになることができます。
JPAもSpring Dataも学ぶ必要はありません。私は個人的にはSpring Dataは簡単だと思っていますが、偏見があります(プロフィールをご覧ください)。しかし、JPAは、ささいなエンティティとセットアップの領域を離れると、間違いなく挑戦的なものになります。
定型コードを削減するために、おそらくいくつかのライブラリを使用する必要があります。を見てみましょう:
JOOQ
MyBatis
Spring JdbcTemplate(残りのSpringなしで使用可能)
QueryDsl
JDBC with Spring Data
JDBCの利点と組み合わせて、Spring Dataの利点を取得します(上記を参照)。
CRUDメソッドをそのまま使用できるリポジトリ。
トランザクション処理、依存性注入、エラー変換、ページングのための、Springインフラストラクチャでの優れた統合...
まだ非常にシンプルなプログラミングモデルです。 SQLステートメントは、予想されるタイミングで発生します。必要に応じて、抽象化を壊すことなく、他のフレームワークのサポートの有無にかかわらず、単純なJDBCにフォールバックできます。
まだ利用できませんが、今後のアップデートでさらに多くの特典が得られます:
クエリメソッドでリポジトリを拡張する素敵で簡単な方法(インターフェイスを定義してfindByLastName
メソッドを作成し、Springがその場で生成する)または@query
アノテーションまたはカスタムメソッド。
ページングのサポート
Spring Dataを使用しないHibernate(または他のJPA実装)
JPAはJDBC上で多くのことを行います
キャッシング(1次、2次、およびクエリキャッシュ)
クエリからのインスタンスの自動作成
エンティティ間のナビゲーション
遅延読み込み
これらすべてが起こっていると、何が起こっているのか、なぜそれを理解するのが難しい場合があります。もちろん[〜#〜] iff [〜#〜]アプリケーションを適切に構築します。JPAが提供しない場合はJDBCにフォールバックできますあなたが欲しいもの。しかし、人々がそれが機能するために必要な構造を維持できなかったことを何度も見ました。 JPAのしくみを適切に理解していない場合、明らかにこれは特に困難です。
Hibernate(または他のJPA実装)とSpring Data
上記のSpring Dataの利点をリストアップしましたが、メンタルコピー&ペーストを実行するだけです。
もちろん、これによりスタック全体がさらに複雑になります。 spring-dataとhibernateでタグ付けされた多くの質問から、多くの開発者はどのツールが何をするのかを特定するのに問題があるようです。しかし、これらの質問を見ると、ほとんどはSpring DataではなくHibernate/JPAの問題を説明しています。
それをまとめるには:
きめ細かな制御が必要な場合は、JDBCを使用します。
JPAを使用する場合は、早い段階で理解してください。
永続化テクノロジーにSpring Dataがモジュールを提供している場合は、それを使用します。生活が楽になります。しかし、やはり私は偏見があります。
あなたの質問の1つの問題は、Spring Data JPAがHibernateのようなものであり、実際にはそうではないことを暗示しているように見えることです。 Spring Data JPAは、Hibernateが実装の1つであるJPAプロバイダーをラップする、弾力のあるセマンティクスと機能を提供する、単にスプリング中心のラッパーです。
エルゴ、HibernateのようないくつかのJPA実装を含めずにSpring Data JPAを使用することはできません。
あなたが尋ねている基本的な質問は、JDBCとORMを使用する理由です。 ORMの利点を理解するのに時間がかかることを理解するために。それをあなたに与えることができる多くの記事がインターネット上にあります。
しかし、ORM駆動型アプリケーションであっても、JDBCの場合と同じようにORMフレームワークをバイパスしてネイティブSQLを使用する必要がある場合があります。これらのケースはめったにありませんが、サポートされていないデータベース機能を利用したい場合や、結果の操作などを最終的に制御したい場合に必要です。
最終的に使用する決定要因は、アプリケーションのニーズによって異なります。ただし、ORMフレームワークの使用を選択したからといって、JDBCの場合のようにネイティブクエリとSQLステートメントを実行する機能を相互に排除するわけではありません。これらの機能は引き続き利用できますが、通常はまれにしか使用しません。
requery.io をチェックして、requeryがパフォーマンスとORMを提供します。
spring-data-requery もチェックしてください
実は、jpaのSpringデータはjpaの抽象化であり、これはJDBCの抽象化です。ニースの機能を提供する場合、jpaがなくてもjpaを使用できます。 Spring data restを使用すると、非常に強力になります。
しかし、フレームワークがあなたのためにすればするほど、基礎となるテクノロジーを理解する必要が増えます。 spring-data-restを使用する場合はさらに真実です。最良の方法は、SQL(設計とクエリ)、jpa(遅延読み込み、インスタンス状態、エンティティ、埋め込み可能ファイル、キャッシュ、クエリ、トランザクション同期)を理解することから始めることです。
次に、spring-data-jpaを試して、プロジェクトに価値があるかどうかを判断します。 idによる保存、更新、削除、および検索の操作では、基本的にpersist
のmerge
、remove
、find
およびEntityManager
メソッドのラッパーです。 SpringデータJPAの主な利点はクエリのサポートですが、querydslもナイスオプションです。どちらの場合も、JPAの仕組みを明確に理解する必要があります。最初に行うことは、SQLロギングをオンにして、特定のdbアクセスに対して、jpa実装がdbaが正しいと見なすクエリを実行するかどうかを確認することです。たとえば、キャッシュにないエンティティに積極的にロードすると、1 + nの選択が行われ、ユニットテストに合格し、運用環境で問題が始まります。 spring-data-jpaは問題を解決しません。
Spring-data-jpa以外にも多くのspring-data- *があり、それらのいくつかはマッピング注釈(たとえば、spring-data-cassandra)も提供します。これは、object-dbマッピングがない場合に便利です。