HibernateとSpring Data JPAの違いは何ですか


207

HibernateとSpring Data JPAの主な違いは何ですか?HibernateまたはSpring Data JPAを使用すべきでないのはいつですか?また、Spring JDBCテンプレートのパフォーマンスはHibernate / Spring Data JPAよりも優れているのでしょうか?


7
@NeilStocktonが2つのテクノロジーの比較を求めることは、意見を求めることではありません。
フィリップレゴ2018

回答:


262

HibernateはJPA実装ですが、Spring Data JPAはJPAデータアクセス抽象化です。Spring Data JPAは、JPAプロバイダーなしでは機能しません。

Spring Dataは、DDD RepositoryパターンまたはレガシーGenericDaoカスタム実装のソリューションを提供します。また、メソッド名の規則を使用してJPAクエリを生成することもできます。

Spring Dataでは、Hibernate、Eclipse Link、またはその他のJPAプロバイダーを使用できます。SpringまたはJava EEを使用することの非常に興味深い利点は@Transactionalアノテーションを使用して宣言的にトランザクション境界を制御できることです

Spring JDBCははるかに軽量であり、ネイティブクエリを対象としています。JDBCのみを使用する場合は、Spring JDBCを使用してJDBCの冗長性を処理することをお勧めします。

したがって、HibernateとSpring Dataは、競合他社ではなく補完的なものです。


52
それでは、Spring Data JPA自体が存在できないということですか?つまり、内部では、JPAプロバイダー(Hibernate、Eclipselink、またはその他のJPAプロバイダーなど)の1つを使用していますか?
CuriousMind 2016年

つまり、休止状態のみを使用する場合、休止状態レベルの構成はほとんどありません。春のデータjpaを使用する場合、休止状態よりもはるかに簡単に見えます。この意味で私はあなたにその質問をしました。
Asif Mushtaq 2018年

1
より正確には、これまでのところすべてが正常に機能し、トップレベル、つまりSpring Data JPAを理解するだけで十分です。最初の例外を除いて、下位レベル、つまりHibernate、JDBC 、およびデータベースを知る必要がある可能性があります。
マーマイト爆撃機

138

ここで使用している3つの異なるものがあります。

  1. JPA:Javaオブジェクトからデータベースの関係へのデータの永続化、読み取り、管理の仕様を提供するJava永続化API。
  2. Hibernate:jpaを実装するさまざまなプロバイダーがあります。Hibernateはその1つです。したがって、他のプロバイダーもいます。ただし、Springでjpaを使用すると、将来、別のプロバイダーに切り替えることができます。
  3. Spring Data JPA:これは、JPAの上にある別のレイヤーで、Springはあなたの人生を楽にするために提供します。

では、Spring Data JPAと Spring + Hibernateがどのように機能するかを理解しましょう-


Spring Data JPA:

アプリケーションにSpring + Hibernateを使用しているとしましょう。これで、休止状態のSessionFactoryを使用してクラッド操作を作成するdaoインターフェースと実装が必要になります。たとえば、従業員クラスのdaoクラスを書いているとします。明日、アプリケーションで、他のエンティティの同様のクラッド操作を作成する必要があるかもしれません。したがって、ここで確認できる定型コードがたくさんあります。

Spring data jpaでは、リポジトリ(crudrepository、jparepository)を拡張してdaoインターフェースを定義できるようになり、実行時にdaoを実装できるようになりました。daoの実装を記述する必要はありません。このように、Spring Data JPAを使用すると、作業が簡単になります。


3
では、Spring Data JPAの基礎となる実装は何ですか?それは休止状態ですか?PagingAndSortingRepositoryを使用すると、コンソールにHibernateログが表示されるためです。
ヴィッキー

2
Spring Data JPAはデフォルトでHibernate実装を使用しました。spring-boot-starter-data-jpaの推移的な依存関係が見られる場合は、hibernate-coreがそこにあります
IamVickyAV

28

SpringJPAはライブを簡単にすることに同意しません。はい、それはいくつかのクラスを提供し、いくつかの単純なDAOを高速にすることができますが、実際には、それがあなたができるすべてです。findById()または保存以外のことをしたい場合は、地獄を通過する必要があります:

  • org.springframework.data.repositoryクラスでのEntityManagerアクセス​​なし(これは基本的なJPAクラスです!)
  • 独自のトランザクション管理(休止状態のトランザクションは許可されていません)
  • 複数のデータソース構成での大きな問題
  • データソースプーリングなし(HikariCPがサードパーティライブラリとして使用されている必要があります)

なぜ自分のトランザクション管理が不利なのですか?Java 1.8では、インターフェースへのデフォルトのメソッド、Springアノテーションベースのトランザクションが許可されているため、simpleは機能しません。

残念ながら、SpringJPAはリフレクションに基づいており、メソッド名またはエンティティパッケージを注釈(!)にポイントする必要がある場合があります。これが、リファクタリングが大きなクラッシュを引き起こす理由です。残念ながら、@ TransactionalはプライマリDSでのみ機能します:(したがって、複数のDataSourceがある場合は、トランザクションがプライマリDSでのみ機能することを覚えておいてください。)

HibernateとSpring Data JPAの主な違いは何ですか?

HibernateはJPA互換、SpringJPA Spring互換です。SpringJPAをSpring-SpringBootなどで使用できる場合、HibernateJPA DAOをJavaEEまたはHibernateスタンドアロンで使用できます。

HibernateまたはSpring Data JPAを使用すべきでないのはいつですか?また、Spring JDBCテンプレートのパフォーマンスはHibernate / Spring Data JPAよりも優れているのでしょうか?

多くの結合を使用する必要がある場合、または複数のデータソース接続を持つSpringを使用する必要がある場合にのみ、Spring JDBCを使用してください。一般に、結合にはJPAを使用しないでください。

しかし、私の一般的なアドバイスは、新鮮なソリューションであるダオバブ(http://www.daobab.io)を使用することです。ダオバブは私のJavaであり、あらゆるJPAエンジンインテグレーターであり、私はそれがあなたのタスクに大いに役立つと信じています:)


2
ダオバブ、本当に?タイプセーフのjpqlが好きではない場合(私は好きではありません)、JPAにはタイプセーフの基準APIがあります。標準のJPAは、その貧弱な代替手段よりも優れています。
ymajoros

8

Spring Dataは、JPA多くのことを抽象化し、永続化ストアへのアクセスにSpringの魔法(好むと好まざるとにかかわらず)をもたらす便利なライブラリです。主にリレーショナルデータベースを操作するために使用されます。つまり、findByNameOrderByAge(String name);実行時に解析され、適切なJPAクエリに変換されるようなメソッドを持つインターフェースを宣言することができます。

その上に配置JPAすると、その使用が魅力的になります。

  1. SQLそれを知らないか、よく知らない新人開発者。これは災害のレシピですが、プロジェクトが些細なものであれば、彼らはそれを回避できます。

  2. 自分が何をしているかを理解しており、物事をすばやくスピンドルアップしたい経験豊富なエンジニア。これは実行可能な戦略かもしれません(しかし、さらに読む)。

での私の経験からSpring Data、その魔法は多すぎます(これはSpring一般的に当てはまります)。私は1つのプロジェクトでそれを頻繁に使用し始め、最終的にライブラリを自分の道から外すことができず、醜い回避策に終わったいくつかのコーナーケースにぶつかりました。後で他のユーザーの苦情を読んだところ、これらの問題はの典型的なものであることがわかりましたSpring Data。たとえば、何時間にも及ぶ調査/非難の原因となったこの問題を確認します。

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

私は最終的にレベルを下げて使い始めましたJDBI-ボイラープレートからあなたを救うのにちょうど十分な「魔法」を備えた素晴らしいライブラリー。これにより、SQLクエリを完全に制御でき、ライブラリと戦う必要がほとんどなくなります。


これは良い答えですが、コーナーケースをリストアップしてさらに詳しく説明できれば、非常に役立ちます。それは素晴らしい答えになるでしょう。ありがとう
John

ええと、Spring Dataを長い間使用していないので、覚えるのは簡単ではありません。古いコードを調べて、コメントを追加する必要があります。ただし、私の頭から直に迷惑の1つ-JPAでは、オブジェクトが相互に参照しなければならないことがよくあります(たとえば、カスケード操作の場合)。これにより、Springがシリアル化を試行すると、(循環参照が原因で)スタックオーバーフローエラーが発生し、醜いフィドル/回避策を強制されます。ただし、この問題はJPAの問題であるため、Spring Dataの正接です。ただし、JPAはSpring Dataの基礎となっているため、「無料」で入手できます。
1

投稿を編集して、もう1つの例を追加しました。
1

1

Hibernateは、データベース内のJavaオブジェクトの仕様である「JPA」の実装です。

異なるORMSを切り替えることができるので、wrt JPAを使用することをお勧めします。

JDBCを使用する場合はSQLクエリを使用する必要があるため、SQLに精通している場合はJDBCを使用してください。


1

SQLクエリをよりシンプルに、より詳細に制御したい場合は、Spring Data / Spring JDBCを使用することをお勧めします。

JPAにおける学習曲線の量が多く、問題のデバッグが難しい場合があります。一方、SQLを完全に制御できる一方で、クエリを最適化してパフォーマンスを向上させることがはるかに容易になります。SQLは、DBAやデータベースをよく理解している人と簡単に共有できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.