0

私は、JPAとHibernateSearchがデータのクエリに使用するアプローチに関する情報を見つけようとして探し回っています。膨大な量のデータがありますが、すべてではないにしても、ほとんどの場合、非常に高レベルの用語が含まれています。両者の違いを理解するのに苦労しています。誰かが私に両方のことをもっと簡単に説明する何かを教えてくれたら素晴らしいと思います。私はJava(ただし、これまでJavaでデータベースを使用したことはありません)とPHPのバックグラウンド(PHPで使用されたデータベース)から来ました。

乾杯

4

2 に答える 2

3

JPA は、リレーショナル データベースにアクセスするための標準 API です。これは ORM: オブジェクト リレーショナル マッパーです。行と列ではなく、データベースからオブジェクト グラフを取得/保存できます。

Hibernate は JPA API の実装です。

Hibernate Search は、データベースに保持されているオブジェクト (またはオブジェクトの一部) に対して全文クエリを実行できるようにするために、Hibernate にプラグインします。目標は、従来の SQL クエリの代わりに (またはそれに加えて)、Google のようなクエリを実行できるようにすることです。

Hibernate Search は、バックグラウンドでLuceneを使用します。

于 2012-11-30T16:11:12.500 に答える
1

まあ、どちらも基本的に SQL の上にある凝ったラッパー/アブストラクタです。抽象化は複数のレベルで行われます:

  • まず第一に、直接的な SQL クエリは (ほぼ) 完全に隠蔽されており、より高いレベルの (ただしシンタックスの SQL に似ています) 言語は両方のフレームワークによって公開されています。これは主に、さまざまなデータベース ベンダーによって実装されている SQL のさまざまな癖からアプリケーションを独立させるためです。JQuery DOM 操作 API は、標準 (およびブラウザー固有) の純粋な Javascript よりも優れていると考えてください。この言語抽象化は、Hibernate では HQL (Hibernate Query Language)、JPA では JPQL (Java Persistence Query Language) と呼ばれます。どちらも非常によく似ており、実際、JPQL は HQL から大きな影響を受けていると思います。基本的な例を次に示します。

などの SQL クエリ

SELECT * FROM Persons

JPQLで次のように表現できます。

SELECT p FROM Person p

そしてHQLで:

FROM Person p

明らかにそれだけではありません。フレームワークは、グローバルな名前が示すように、リレーショナル データをオブジェクトにマップしようとするため、高レベルのクエリ言語はオブジェクトに対して機能します。私が重要だと思うのは、詳細をさらに掘り下げる前に最初から理解することは、JPA または Hibernate で記述したクエリ コードが何であれ、現在のデータベースに固有の SQL に変換され、それに対して実行されるという事実です。また、Hibernate (それ自体とその JPA 実装の両方) には、生成されたすべての SQL をログに記録できる優れた機能があります。Hibernate 構成で「hibernate.show_sql」(および場合によっては「hibernate.format_sql」) 構成パラメーターを true に追加するだけです。たとえば、Hibernate-JPA プロジェクトの場合、persistence.xml ファイルの永続ユニット宣言にそれらを追加する必要があります。

<persistence>

    <persistence-unit name="some_name">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <!-...->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

この機能を有効にして、JPQL または HQL をいじってみて、SQL レベルで実際に何が起こっているかを確認してください。これにより、より高いレベルの API がどのように機能するかをよりよく理解できる場合があります。

  • 現在、Hibernate と JPA (バージョン 2 以降) は、Criteria API と呼ばれる、データを照会するためのさらに別の抽象化 API を提供しています。ここでの基本的な考え方は、SQL に似た構文 (およびパラダイム) を完全に捨てて、完全にオブジェクト指向のクエリ API を採用することです。JPA の簡単な例を次に示します。

    CriteriaQuery cq = cb.createQuery(Person.class);

    Root<Person> fromPerson = cq.from(Person.class);
    CriteriaQuery<Person> selectFromPerson = cq.select(fromPerson);
    

うん、奇妙に見えますが、用途があります (設定されているかどうかにかかわらず、いくつかのランタイム引数に基づいてクエリを動的に作成しようとすることを想像してみてください)。

ここでも、pure-Hibernate と Hibernate JPA の両方に、この API の実装が非常に似ています。Ang また、この方法で作成されたクエリは、ログに記録して調査できる SQL に変換されます。

JPAとHibernateに関するあなたの質問によると、どちらがどちらであるかは次のとおりです。

最初に休止状態がありました。SQL データを Java クラスおよびオブジェクトにマップする方法を提供する、スタンドアロンのサードパーティ フレームワーク。その後、Java EE 関係者はこれを良いアイデアだと考え、JPA という独自のバージョンを作成しました。これらの人は、仕様のみを作成し、サードパーティがそれらの仕様を実際に実装できるようにするという哲学に固執しているため、JPA 自体は単なるインターフェースの集まりであり、それらがどのように機能するかを詳述した長いドキュメントです (こちらを参照してください)。JPA 2.0 用)。これがすべて完了した後、JPA仕様を実装することを決定した潜在的なサードパーティの1人がHibernate担当者でした。また、JPA 仕様は既存の (そして完全に実装された) Hibernate フレームワークと非常に似ているため、Hibernate と一緒に構築することにしました。したがって、Hibernate フレームワークには、元の Hibernate API と実装 (JPA 仕様とは関係ありません) と JPA 実装の両方があります。両方を同時に使用することもできますが、これはあまり良い方法ではありません。

現在、Oracle Java の担当者は、仕様を完成させた後、それらの実装も自分たちで作成しました。彼らは、ほとんどの仕様 API でこれを行う傾向があります。この実装は EclipseLink と呼ばれ、ここで確認できます。理論的には、Hibernate-JPA 実装ライブラリを EclipseLink-JPA 実装ライブラリに切り替えた場合、JPA プロジェクトはまったく同じように動作するはずです。実際には、わずかな違いがあります。

于 2012-11-30T16:34:40.270 に答える