web-dev-qa-db-ja.com

JPA実装とは何ですか?

私はJPAを使い始めましたが、JPA実装(EclipseLink、TopLink、Hibernateなど)が正確に何をするかについて混乱しています。

JPAの理論上の役割は理解していますが、さまざまな実装の目的は何ですか?たとえばDBコネクタ/ドライバのように、これらの選択には大きな違いがありますか?初心者に最適なのはどれですか。

私が読んだほとんどの文献で使用されているので、おそらくEclipseLinkを使用します。

36
user262525

JPA

JPAは単なるAPI(つまりJava Persistence[〜#〜] api [〜#〜]))であり、使用する実装。

たとえは、JDBCを使用することです。 JDBCはデータベースにアクセスするためのAPIですが、データベースに接続するには、実装(ドライバーjarファイル)が必要です。ドライバーなしでは、データベースを使用して何もできません。

JPAでは、先ほど述べたように、実装と、JPAの「下」にある一連のクラスが必要です。そのような実装は、希望どおりの動作をします。

アプリケーションはJPA APIを使用します(この表現は少し面倒ですが、アイデアが得られることを願っています)。次に、基礎となる実装と通信します。

一般的な実装には、 HibernateEclipseLinkOpenJPA などがあります。

それらのすべてがJPA APIを実装しているため、JPAのみを使用する場合、すべての実装は同じように動作するはずです。

だが!これらの実装によって提供される機能は、標準のJPA APIを超える場合があります。

この特定の機能を使用する場合は、他と互換性のないベンダー固有のAPIを使用する必要があります。

たとえば、JPAが@IdアノテーションをID生成オプションで定義している場合でも、Hibernateを使用する場合は、Hibernate固有の生成戦略に@org.hibernate.annotations.GenericGeneratorも使用できます。

このアノテーションの使用は、基礎となる実装としてHibernateを使用していない限り機能しません。

つまり、JPAはすべてのベンダーが実装する「最小の共通点」であり、すべての実装には標準ではないより高度な機能が含まれている可能性があります。

アプリケーションを移植可能にする場合は、JPAのみを使用してください。後で気が変わって実装を切り替える予定がない場合は、JPA +ベンダー固有の機能を使用してください。

83
darioo

それはJavaと同じで、仕様(Java SE、Java EE)と実装があります。ほとんどの人はリファレンス実装(By Sun/Oracle)を使用しています。仕様の「より良い」および「高度な」独自の実装(API、インターフェース、およびドキュメント/ 1つのWord定義が必要な場合はJavaDoc、ただしそれよりはるかに多い)

したがって、Java /使用している可能性が高いJDKは単なる実装です(これは非常に人気があります)。他にも多くの実装があり、ガベージコレクションの構成オプションがいくつかある場合や、より速く、いくつかは単に使用する価値がありません。

したがって、実装は基本的にすべてを実行し、JPAがAPI(その名前によって暗示されるJava Persistance API))であるコードを含みます。たとえば、実際の実装よりもインターフェイスとドキュメントについての詳細です。インターフェース。

HibernateのJPA実装/ EclipseLinkが拡張/実装する抽象クラスと考えてください

JPAに関しては、単一の実装を持つHibernateとは対照的に、「最良の」実装が勝ち、インターフェース作成者だけでなく誰もがゲームに参加できるように、インターフェースを実装から切り離すという考えがあります。

これにより、たとえば、Google App EngineがJPAをサポートできるようになります。APIに従う必要があるため(DataNucleusが実装です)、Hibernateを使用する必要がある場合は、Googleのビッグテーブル形式をサポートするようにHiberanateリリースを変更する必要があります( GAEのJPAがそれほど優れていないという事実は別の話です)

6
Eran Medan

JPA自体は仕様であり、製品ではありません。永続化などはそれ自体では実行できません。 JPAは単なるインターフェースのセットであり、実装が必要です。選択できるオープンソースおよび商用のJPA実装があり、Java EE 5アプリケーションサーバーは、その使用をサポートする必要があります。JPAには、永続化するデータベースも必要です。

4
supercena

Java Persistence API(JPA)は、Javaプログラミング言語のアプリケーションプログラミングインターフェイス仕様であり、Java Platform、Standard EditionおよびJava Platform、Enterprise Edition。Java Persistence APIは、JSR 220エキスパートグループの作業の一部として生まれました。 Javaコミュニティプロセス。JPA2.0は、JSR 317エキスパートグループによる作業です。

そのため、JPAは実装する必要のあるインターフェースのセットを提供します。言語仕様に使用できる参照実装が常にあります。この場合、EclipseLinkが参照実装です。

一方、HibernateはJPA仕様を実装していますが、独自のネイティブAPIも持っています。

例えば ​​:

インターフェースを1つだけ含む認証仕様を設計したとします。

public interface AccessAuthenticator {
    public boolean verifyAccess(String username,String saltedPassword);
}

現在、この仕様には1つのインターフェースと1つのメソッドしか含まれていません。

この仕様(より正確にはverifyAccess()メソッド)を使用するには、実装が必要です。

この仕様には多くの実装がある可能性があります。たとえば、組織によっては、独自のサーバーに対する認証のための実装を提供している場合があります。組織のサーバーに接続するには、その実装が必要です(ネイティブAPIが関与している可能性があります)。

仕様を提供するもう1つの側面は、実際には何も具体的な実装を使用しないことです。今日、データベースに接続するために休止状態を使用していると言いますが、明日はJPA仕様を実装するより優れたORMが登場し、必要なのはすべてです。行うには、プロジェクトの依存関係を変更します(簡単に言うと、実装JARファイルを置き換える/ pomファイルを編集する)。

1
Faizan Mohammad

JPAはJava API仕様であり、Javaプラットフォームを使用したアプリケーションでのリレーショナルデータの管理を記述しています。JPAは一連のルールと考えることができるため、具体的な作業はできませんが、実装の標準化に役立ちます。

したがって、JPA(一連のルール)を実装する具体的な実装が必要です。 Hibernate、OpenJPAは、有名なJPA実装のいくつかです。

0
Badal