JPAとHibernateの違いは何ですか?[閉まっている]


680

JPA 2は仕様であり、HibernateはORMのツールであることを理解しています。また、HibernateにはJPA 2よりも多くの機能があることを理解しています。しかし、実際的な観点から見ると、実際の違いは何ですか?

iBatisの使用経験があり、現在HibernateまたはJPA2のいずれかを習得しようとしています。Pro JPA2の本を手に取りましたが、それでも「JPAプロバイダー」を参照し続けています。例えば:

機能を標準化する必要があると思われる場合は、発言してJPAプロバイダーにリクエストする必要があります。

これは私を混乱させるので、いくつか質問があります:

  • JPA2を単独で使用すると、POJOに注釈を付けるだけでDBからデータをフェッチできます
  • JPA2は、TopLinkやHibernateなどの「JPAプロバイダー」で使用することになっていますか?その場合、JPA2単独と比較した場合、またはHibernate単独と比較した場合、JPA2 + Hibernateを使用する利点は何ですか?
  • あなたは良い実用的なJPA2本をお勧めできますか?「プロJPA2」は、聖書とJPA2のリファレンスのように見えます(本の後半までは、クエリには入りません)。JPA2への問題/解決アプローチを取る本はありますか?

2
「JPAとHibernateの違い」に関する質問は正しくありません。HibernateとJPAの戦いは無意味です。異なるORMの実装を回避するために、JPA APIでJPAの実装を使用することをお勧めします。
ベルギガモハメドアミン2014

18
@ Berguiga.M.Amine、上記の質問が正しくないことがすでにわかっている場合。もう尋ねる必要はありません。このトピックにも興味があります。
2014

私は春に使用されているJpaTemplateと混同しています "org.springframework.orm.jpa.JpaTemplate"は、persist()、find()、merge()などの独自の関数を持っています。
nitin verma

@nitinverma:それは本当に別の質問です。それでも答えが必要な場合は、フィードバックを集めるために、独自に質問することをお勧めします。
Wouter 2017年

回答:


776

JPAは単なる仕様であり、実装がないことを示しています。JPAアノテーションを使用して好きなだけクラスにアノテーションを付けることができますが、実装がなければ何も起こりません。JPAは従わなければならないガイドラインまたはインターフェースであると考えてください。一方、HibernateのJPA実装は、JPA仕様で定義されたAPIに適合し、内部機能を提供するコードです。

JPAでHibernateを使用する場合、実際にはHibernate JPA実装を使用しています。これの利点は、JPAのHibernateの実装を、JPA仕様の別の実装と交換できることです。ストレートHibernateを使用すると、他のORMが異なるメソッド/構成およびアノテーションを使用する可能性があるため、実装にロックされます。したがって、別のORMに切り替えるだけではできません。

詳細については、私のブログエントリをご覧ください。


5
したがって、JPAでHibernateを使用している場合、{java.persistence}アノテーションが機能するか、{org.hibernate}アノテーションを使用する必要がありますか?
アムルタ2014

62
あるORMを別のORMに置き換えることは非常にまれな機会であることを付け加えたいので、JPAを使用してもこの利点は得られないでしょう。JPAで得られるものは、他のユーザーとの通信に使用できるプロトコル、標準、命名、およびその他の規則です。
恥ずかしさ2014

3
@pubsy同意しますが、原則的には仕様のセールスポイントの1つです。
Kevin Bowersox 2014

6
@Amrutaが質問に回答します。JPAでHibernateを使用している場合、{java.persistence}アノテーションは機能し、{org.hibernate}アノテーションを使用する必要はありません。
学習者

3
@JavaGeekは、コードがJPAで言及されているインターフェースのみを使用している限り当てはまります。休止状態に固有の機能を使用する場合は、org.hibernateアノテーションを使用する必要があります。詳細
Suryavanshi

632

JPAはダンス、Hibernateはダンサーです。


189
JPAはアート、Hibernateはアーティストです。
ラッキー

10
私はこのユーモアのセンスが好きです:) JPAはディレクター、Hibernateは俳優です。
user3278897 2016

7
しかし、Dancer(Hibernate)はDance(JPA)なしで実行できますよね:/
RevanthKrishnaKumar V.

3
この答えは何も説明せず、あいまいなことを言います。
Amir Kost 2017年

11
この比喩は理解を深めるものではありません。すでに違いを知っているなら、あなたはそれがすごいことに気付くでしょう。違いがわからない場合でも、違いはわかりません。
Nick Volynkin 2017

158

言語の歴史的視点とJCPの理解なしに、理解するのが難しいものがあります。

多くの場合、公式のJDKの一部ではない機能を実行する、またはギャップを埋めるパッケージを開発するサードパーティがあります。さまざまな理由により、その機能はJCP(Java Community Process)を通じてJava JDKの一部になる可能性があります

Hibernate(2003年)は、SQLを抽象化する方法を提供し、開発者が永続オブジェクト(ORM)の観点から考えることを可能にしました。EntityオブジェクトについてHibernateに通知すると、それらを永続化する戦略が自動的に生成されます。Hibernateは、これを行うための実装と、XML構成またはアノテーションのいずれかを介して実装を実行するAPIを提供しました。

現在の根本的な問題は、多くの人々がより一般的であると考えているもののために、コードが特定のベンダー(Hibernate)と密に結合することです。したがって、一般的な永続性APIが必要です。

その間、Hibernateや他のORMツールベンダーからの多くの入力を持つJCPは、JSR 220(Java Specification Request)を開発し、その結果、JPA 1.0(2006)、そして最終的にはJPA 2.0(2009)であるJSR 317が生まれました。これらは、一般的なJava Persistence APIの仕様です。APIは一連のインターフェースとしてJDKで提供されるため、クラスはjavax.persistenceに依存し、オブジェクトを永続化する作業を行っている特定のベンダーについて心配する必要はありません。これは単なるAPIであり、実装ではありません。Hibernateは、JPA 2.0仕様を実装する多くのベンダーの1つになりました。JPAに向けてコードを記述し、準拠しているORMベンダーをニーズに合わせて選択できます。

HibernateがJPAで体系化されていない機能を提供する場合があります。この場合、JPAはそれを行うためのインターフェースを提供しないため、Hibernate固有のアノテーションをクラスに直接挿入することを選択できます。

出典:http : //www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
良い歴史部分。他の答えは問題の内容を繰り返すだけですが。
ロバート

1
それらを啓発する精度をありがとう。JPAは、Hibernateと緊密に結合されたアプリケーションが抽象化の必要性だったからです。しかし、それは無限の問題ではありませんか?代わりに、アプリケーションがJPAに密結合されていませんか?ここの本当のメリットは何ですか?私はすでにHibernateを抽象レイヤーとして見ています...
Aphax

4
@Aphaxもちろん、.javaファイルをコーディングすると、Javaとも緊密に結合されるので、明日Pythonに切り替えたい場合はどうしますか?
スムティエ2016年

100

JPAはインターフェースであり、Hibernateは実装です。

従来、複数のJava ORMソリューションがありました。

独自のマッピング定義またはクライアントAPIを定義する各実装。JPAエキスパートグループは、これらすべてのツールの中で最高のものを集め、Java Persistence API標準を作成しました。

標準の永続性APIはクライアントの観点から非常に便利で、ある実装を別の実装に切り替えるのが比較的簡単です(ただし、実際には大規模なプロジェクトでは特定の非標準機能を使用する必要があるため、それほど単純ではありません)。 。

標準のJPAはJava ORMの競争を新しいレベルに押し上げており、これはより良い実装につながるだけです。

私の著書「ハイパフォーマンスJavaパーシステンス」で説明されているように、HibernateはJPAでまだサポートされていない機能を提供します

これらの追加機能により、Hibernateは大規模エンタープライズアプリケーションで要求される多くの永続性要件に対応できます。


これは良いものです。以前に他のORMツールについて知りませんでした
Avdhut

すばらしい答えで、私は本をものすごく楽しんでいます!リリースしてくれてありがとう!
JonasJSchreiber

高性能Java Persistenceの本をお楽しみいただきありがとうございます。
Vlad Mihalcea

これはJPAがインターフェースで、Hibernateが実装です
Eddie B

57

Wikiから。

Java Persistence APIを作成する動機

多くのエンタープライズJava開発者は、エンティティBeanの代わりに、オープンソースフレームワークまたはデータアクセスオブジェクトによって提供される軽量の永続オブジェクトを使用します。エンティティBeanとエンタープライズBeanは、重すぎて複雑であるという評判があり、Java EEアプリケーションサーバーでしか使用できませんでした。サードパーティの永続フレームワークの機能の多くはJava Persistence APIに組み込まれており、2006年からHibernate(バージョン3.2)やオープンソースバージョンのTopLink EssentialsなどのプロジェクトがJava Persistence APIの実装になっています。

JCPページで説明されているように、EclipseリンクはJPAのリファレンス実装です。これについてもう少し詳しくは、この回答をご覧ください。

JPA自体には、標準のORMフレームワークを補う機能があります。JPAはJava EE仕様の一部であるため、プロジェクトでJPAを単独で使用でき、Java EE互換サーバーで動作するはずです。はい、これらのサーバーにはJPA仕様の実装があります。

Hibernateは最も人気のあるORMフレームワークです。JPAが導入されると、HibernateはJPA仕様に準拠します。hibernateが従うべき基本的な仕様のセットは別として、追加のものがたくさんあります。


3
つまり、プロジェクトでJPAを単独で使用できます。Hibernate、TopLink、またはその他のJPA実装を使用しないことを意味しますか?
abbas 2013年

2
@abbasはい。Java EE仕様はJPAのみを使用します。hibernateを追加すると、いくつかの追加機能が提供されます。
ManuPK 2013年

1
JPAはインターフェース/仕様にすぎないと聞きました。プロジェクトでJPAを単独で使用する場合、その実装はどこから取得しますか?
abbas 2013年

@abbasコメントありがとうございます。回答に詳細を追加しました。お役に立てれば。
ManuPK 2013年

1
@Forhadサーバーアーキテクチャに埋め込まれているかどうかに関係なく、常に実装が必要です。JPAライブラリをダウンロードして永続化する方法はありません。
Kevin Bowersox 2014

15

JPAは、具体的な実装が必要な仕様にすぎません。デフォルトの実装オラクル今「のEclipseLink」で提供しています。(TopLinkはOracleからEclipse Foundationに寄付され、Eclipseリンクと統合されます)

(参照:http : //www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php

Eclipselinkを使用すると、必要に応じて、コードを実装に移植可能にすることができます。Hibernateは、完全なJPA実装+ MORE(一種のJPA Plus)でもあります。Hibernateは、追加のHibernate固有の機能を備えたJPAのスーパーセットです。そのため、Hibernateで開発されたアプリは、他の実装に切り替えると互換性がない場合があります。それでも休止状態は、JPA実装として広く使用されている開発者の大多数の選択です。

別のJPA実装は、Kodo実装の拡張であるOpenJPA(openjpa.apache.org)です。


15

JPA:インターフェースのようなもので、JPAにある関数を使用するための具体的な実装はありません。

Hibernate:は単なるJPAプロバイダーですの機能の実装を備えであり、JPAにはない追加の機能をいくつか持つことができます。

ヒント:使用できます

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

コンボ1:休止状態ではパフォーマンスが向上しないと感じ、JPAプロバイダーを変更する必要があるときに、JPAを再度作成する必要がない場合に使用します。別のJPAプロバイダーを作成することもできます。また、何度でも変更できます。

コンボ2:少しでもJPAプロバイダーを変更しない場合のように、あまり使用されません。

http://blog-tothought.rhcloud.com//post/2にアクセスすると、完全な混乱が明らかになります。


11

JPAはインターフェースであり、Hibernateはそのインターフェースの1つの実装です。


2
その上に、Hibernateはいくつかの機能/メソッドを追加します。
rai.skumar 2015

10

JPAはORM-APIを標準化するための仕様です。HibernateはJPA実装のベンダーです。したがって、JPAをhibernateで使用する場合は、標準のJPA APIを使用できます。hibernateは内部で動作し、いくつかの非標準機能を提供します。http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/およびhttp://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/を参照してください


5

JPAは単なる仕様です。市場には、JPAを実装する多くのベンダーがあります。ベンダーの種類によって、JPAの実装方法は異なります。そのため、ベンダーの種類によって提供される機能が異なるため、要件に基づいて適切なベンダーを選択してください。

JPAの代わりにHibernateまたは他のベンダーを使用している場合は、EclipseLinkまたはOpenJPAからHibernateに簡単に移行することはできません。 JPA。


4

JPAはHibernateが実装するAPIです。HibernateはJPAよりも古いものです。JPAの前に、ORMを実行するネイティブの休止状態コードを記述します。JPAは単なるインターフェースなので、ここでJPAコードを記述し、実装を見つける必要があります。Hibernateはたまたま実装です。

だからあなたの選択はこれです:休止状態、トップリンクなど...

JPAの利点は、必要に応じて実装を交換できることです。欠点は、ネイティブのhibernate / toplink / etc ... APIがJPA仕様でサポートされていない機能を提供する可能性があることです。



3

Java-その独立性はオペレーティングシステムからだけでなく、ベンダーからもです。

したがって、アプリケーションをさまざまなアプリケーションサーバーにデプロイできるはずです。JPAはJava EE準拠のアプリケーションサーバーに実装されており、アプリケーションサーバーを交換できますが、実装も変化しています。Hibernateアプリケーションを別のアプリケーションサーバーにデプロイする方簡単な場合があります。


3

JPAは、データベース操作、ORマッピング、その他の必要なタスクを実行するためにデータ層に実装する仕様です。

これは単なる仕様であるため、実装するにはツールが必要です。そのツールは、Hibernate、TopLink、iBatis、spring-dataなどのいずれかです。

データレイヤーでHibernateを使用している場合、必ずしもJPAは必要ありません。ただし、HibernateにJPA仕様を使用すると、仕様は他のユーザーにも共通しているため、将来的にはiBatis、TopLinkなどの他のORMツールへの切り替えが容易になります。

*(覚えているならimport javax.persistence.*;、HibernateでORマッピング(@ Id、@ Column、@ GeneratedValueなど)の注釈を使用するときに行います。HibernateでJPAを使用している場合は、JPAの@Queryおよびその他の機能を使用できます。よく


2

JPAは、Javaプラットフォームを使用するアプリケーションでのリレーショナルデータの管理を記述するJava API仕様です。ここで、HibernateはJPA仕様に準拠したORM(オブジェクト関係マッピング)ライブラリです。

JPAは、Hibernateによって実装される一連のルールと考えることができます。


2

JPAはJSRです。つまり、オブジェクトリレーショナルマッピングを実装するためのJava仕様の要件であり、その実装に固有のコードはありません。これは、Javaオブジェクトとリレーショナルデータベース間のデータへのアクセス、永続化、および管理のための特定のルールセットを定義します。その導入により、EJBはJava開発者コミュニティから重いものであると批判されたため、置き換えられました。Hibernateは、ガイドラインを使用してJPAを実装する方法の1つです。Hibernateは、オープンソースのGNU Lesser General Public License(LGPL)の下でライセンスされる高性能のオブジェクト/リレーショナル永続性およびクエリサービスです。これの利点は、 HibernateのJPAの実装を、JPA仕様の別の実装と交換できます。


1

JPAは、具体的な実装が必要な仕様にすぎません。oracleが提供するデフォルトの実装は「Eclipselink」です。Toplinkはeclipselinkと統合するためにEclipse FoundationにOracleから寄贈されました。

Eclipselinkを使用すると、必要に応じて、コードを実装に移植可能にすることができます。Hibernateは、完全なJPA実装+ MOREでもあります。Hibernateは、追加のHibernate固有の機能を備えたJPAのスーパーセットです。そのため、Hibernateで開発されたアプリケーションは、他の実装に切り替えると互換性がない場合があります。それでも休止状態は、JPA実装として広く使用されている開発者の大多数の選択です。

もう1つのJPA実装は、OpenJPAです。これは、Kodo実装の拡張です。

JPAとHibernate


1

私はとても簡単な言葉で説明しようとします。

私たちは皆、メルセデス、BMW、AUDIなどのAクラスメーカーであることを知っているので、車が必要だとします。

さて、上記の記述では、CAR(仕様)はすべての車に4つの車輪を持つもののような共通の機能があり、道路で運転できるので、JPAのようです。また、MERCEDES、BMW、AUDIなどは、一般的な車の機能を使用し、顧客ベースに応じて機能を追加しているため、休止状態、iBATISなどの車の仕様を実装しています。

したがって、この共通機能によりjpaに移行し、hibernateはjbossのニーズに応じた単なる実装です。

もう1つ

JPAにはいくつかの基本的なプロパティが含まれているため、将来、休止状態を他の実装に変更したい場合は、簡単に切り替えることができます。これらの基本的なプロパティには、実装テクノロジ、JPQLクエリで機能するJPAアノテーションが含まれます。

したがって、クライアントのニーズに応じて実装を切り替えたい場合に備えて、主にJPAタイプのテクノロジーを使用してhibernateを実装します。一般的な機能の一部がJPAに含まれているため、少ないコードで記述できます。誰かがまだ明確でない場合は、スタックオーバーフローでim newとしてコメントできます。

ありがとうございました


アドバイスありがとう
rajiv baghel

0

JPAは単なる仕様ですが、HibernateはJPAプロバイダーの1つです。つまり、HibernateはJPA契約で言及されているさまざまなことを実装しています。



-1

JPAはJava Persistence APIです。これは、APIの仕様のみを指定します。APIを作成するための一連のルールとガイドラインを意味します。別のコンテキストで言うと、これらのAPIを作成するためのラッパーを提供する標準のセットであり、データベースからエンティティオブジェクトにアクセスするために使用できます。JPAはoracleによって提供されます。データベースアクセスを行う場合は、必ずその実装が必要です。JPAはAPIを実装するためのガイドラインのみを指定していることを意味します。Hibernateは、そのAPIの実装を担当するJPAプロバイダー/ベンダーです。Hibernate TopLinkやOpen JPAのように、JPA APIプロバイダーの例の一部です。そのため、休止状態を通じてJPAで指定された標準APIを使用します。


-2

比喩的に言えば、JPAは単なるインターフェース、Hibernate / TopLink-クラス(つまりインターフェースの実装)です。

インターフェイスを使用するには、インターフェイスの実装が必要です。ただし、インターフェースを介してクラスを使用できます。つまり、JPA APIを介してHibernateを使用するか、実装を直接使用して、つまり純粋なJPA APIを介さずにHibernateを直接使用できます。

JPAについての良い本は、Vlad Mihalceaの「高性能Java Persistence」です。

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