web-dev-qa-db-ja.com

JPAとHibernateの違いは何ですか?

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

私はiBatisの使用経験があり、今はHibernateかJPA2のどちらかを学ぼうとしています。私はプロJPA2本を拾って、それは「JPAプロバイダー」を参照し続けます。例えば:

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

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

  • JPA2を単独で使用すると、POJOの注釈を付けるだけでDBからデータを取得できます。
  • JPA2はTopLinkやHibernateなどの「JPAプロバイダ」と一緒に使用することになっていますか?もしそうなら、それではJPA2単独またはHibernate単独と比較してJPA2 + Hibernateを使用することの利点は何ですか?
  • あなたは良い実用的なJPA2本を推薦できますか。 "Pro JPA2"は、JPA2に関する聖書と参考書のようなものです(本の後半までQueriesに取り込まれません)。 JPA2に問題解決のアプローチを取った本はありますか?
682
Anthony

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

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

より詳しい説明はmy blog entry を読んでください。

777
Kevin Bowersox

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

634
johnm

歴史的観点から見た言語とJCPの理解がなければ、理解するのが困難なこともあります。

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

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

根本的な問題は、多くの人がより一般的であるべきだと考えるために、あなたのコードが特定のベンダー(Hibernate)と密接に結び付いていることです。そのため、一般的な永続化APIが必要です。

一方、Hibernateや他のORMツールベンダから多くの意見を得たJCPは、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/

158
Ken Block

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

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

独自のマッピング定義またはクライアントAPIを定義する各実装。 JPA専門家グループは、これらすべてのツールのベストを集め、Java Persistence API標準を作成しました。

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

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

私の本、High-Performance Java Persistence で説明されているように、 HibernateはJPAでまだサポートされていない機能を提供しています

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

100
Vlad Mihalcea

Wiki から。

Java Persistence APIを作成する動機

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

JCP page で述べたように、EclipseリンクはJPAの参照実装です。これについてもう少し詳しくは この回答 をご覧ください。

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

_ jpa _ が導入されたHibernateが _ jpa _ の仕様に準拠すると、Hibernateは最も普及している _ orm _ フレームワークです。それが従うべきである仕様の基本的なセットは別として、Hibernateは追加のものの全部をたくさん提供します。

58
ManuPK

JPAは、具体的な実装が必要な仕様です。 デフォルト実装のOracle provideは現在 "Eclipselink"です。 (ToplinkはeclipselinkとマージするためにオラクルからEclipse Foundationに寄付されました)

(参照先: http://www.Oracle.com/technetwork/middleware/toplink/index-085257.htmlhttp://www.Eclipse.org/org/press-release/20080317_Eclipselink.php

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

もう1つのJPA実装は、OpenJPA(openjpa.Apache.org)です。これは、Kodo実装の拡張です。

16
supernova

JPA: interfaceのようなもので、JPAにある機能を使用するための具体的な実装はありません。

Hibernate: は単なるJPAプロバイダであり、JPAの関数の実装を持ち、JPAにはないかもしれない追加の関数を持つことができます。

ヒント:あなたは使うことができます

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

Combo 1:あなたの休止状態がより良いパフォーマンスを与えていないと感じてJPAプロバイダを変更したいと思うときに使われます。あなたは別のJPAプロバイダを書くことができます...そして何回でも変更することができます。

Combo 2:は、JPAプロバイダを変更しない場合とほとんど同じように使用されます。

http://blog-tothought.rhcloud.com//post/2 にアクセスしてください。ここで完全な混乱が明らかになります。

15
vkrishna17

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

11
Thiago Burgos

JPAはORM-APIを標準化するための仕様です。 HibernateはJPA実装のベンダーです。あなたがhibernateと一緒にJPAを使うのであれば、あなたは標準の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/

10
kandarp

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

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

5
sus007

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

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

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

4
Vanishree Gv

JPAが仕様ですが、Hibernateは仕様で規定されている規則に従う実装プロバイダーです。

4
javierZanetti

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

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

3
Aleksey Bykov

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

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

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

*( 覚えていれば、HibernateでORマッピング(@Id、@Column、@GeneratedValueなど)にアノテーションを使用するときにimport javax.persistence.*;を実行します。ここでHibernateでJPAを使用していますJPAの@Queryなどの機能も使用できます

3
Arun Raaj

JPAはJSR、すなわちその実施のための特定のコードを持っていないオブジェクトリレーショナルマッピングを実施するためのJava仕様要求である。 Javaオブジェクトとリレーショナルデータベース間のデータへのアクセス、永続化、および管理のための一連の規則が定義されています。その導入により、EJBはJava開発者コミュニティからは重いと批判され、置き換えられました。 Hibernateは、オープンソースGNU劣等一般公衆利用許諾契約書(LGPL)の下でライセンスされている高性能のオブジェクト/リレーショナル永続化および照会サービスです。これの利点は、HibernateによるJPAの実装をJPA仕様の別の実装と交換できることです。ストレートHibernateを使用すると、他のORMが異なるメソッド/構成やアノテーションを使用する可能性があるため、実装にロックしているため、他のORMに切り替えることはできません。

JPAは、Javaプラットフォームを使用するアプリケーションにおけるリレーショナルデータの管理を記述するJava API仕様です。ここで、HibernateはJPA仕様に準拠したORM(Object Relational Mapping)ライブラリです。

JPAはHibernateによって実装されているルールのセットと考えることができます。

2
Badal

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

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

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

JPAと休止状態

1
user8383675

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

私たちは皆彼らがメルセデス、BMW、アウディなどのようないくつかのAクラスメーカーであることを知っているのであなたが車を必要とすると仮定してください。

すべての車は4輪のもののような共通の機能を持っており、道路上で運転することができますので、今上記のステートメントではCAR(仕様です)...だからJPAのようなものです。そしてMERCEDES、BMW、AUDIなどは、一般的な自動車機能を使用し、顧客ベースに応じて機能を追加しているだけなので、休止状態、iBATISなどの自動車仕様を実装しています。

それで、この共通の機能によってjpaに行きます、そして、休止状態は彼らのjboss必要性に従った単なる実装です。

もう1つ

JPAにはいくつかの基本的なプロパティが含まれているので、将来的にhibernateを他の実装に変更したい場合は、頭痛の種を気にせずに簡単に切り替えることができます。

そのため、主にクライアントのニーズに応じて実装を切り替えたい場合に備えて、JPAタイプのテクノロジを使用してHibernateを実装します。また、JPAには一般的な機能が含まれるため、作成するコードが少なくなります。まだ誰かがはっきりしていないならば、あなたは私がスタックオーバーフローで新しいとコメントすることができます。

ありがとうございました

1
rajiv baghel

JPAまたはJava Persistence APIはORM実装の標準仕様ですが、Hibernateは実際のORM実装またはフレームワークです。

0
Amit Gujarathi

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

0
user1157635