0

我一直在寻找有关 JPA 和 Hibernate Search 用于查询数据的方法的信息。有大量数据,但大多数(如果不是全部)包含非常高级的术语。我正在努力理解它们之间的差异。如果有人可以向我指出以更简单的方式解释这两件事的东西,那就太好了。我来自 Java(但以前从未使用过 Java 数据库)和 PHP 背景(使用 PHP 数据库)。

干杯

4

2 回答 2

3

JPA 是访问关系数据库的标准 API。这是一个 ORM:对象关系映射器。它允许从数据库中获取/保存对象图,而不是行和列。

Hibernate 是 JPA API 的实现。

Hibernate Search 插入到 Hibernate 中,以便能够对持久存在于数据库中的对象(或对象的一部分)执行全文查询。目标是能够执行类似 google 的查询,而不是(或附加于)传统的 SQL 查询。

Hibernate Search在幕后使用Lucene 。

于 2012-11-30T16:11:12.500 回答
1

好吧,它们基本上都是 SQL 之上的精美包装器/抽象器。抽象有多个层次:

  • 首先,直接 SQL 查询(几乎)完全隐藏起来,并且两个框架都公开了更高级别的(但仍类似于 synthax 中的 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 版开始)提供了另一个用于查询数据的抽象 API,称为 Criteria API。这里的基本思想是它完全抛弃了类似 SQL 的语法(和范式),转而支持完全面向对象的查询 API。这是一个快速的 JPA 示例:

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

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

是的,它看起来很奇怪,但它有它的用途(想象一下尝试基于一些可能设置或未设置的运行时参数动态创建查询等)

同样,纯 Hibernate 和 Hibernate JPA 都具有非常相似的 API 实现。Ang 同样,以这种方式进行的查询会转化为您可以记录和研究的 SQL。

根据您关于 JPA 和 Hibernate 的问题以及哪个是哪个,这是故事:

首先是休眠。一个独立的第 3 方框架,它提供了一种将 SQL 数据映射到 Java 类和对象的方法。然后 Java EE 的人认为这是一个好主意,并制作了自己的版本,命名为 JPA。由于这些人坚持只制定规范并允许第 3 方实际实施这些规范的理念,因此 JPA 本身只是一堆接口和详细说明它们应该如何工作的长文档(在此处查看对于 JPA 2.0)。因此,在完成所有这些之后,决定实施 JPA 规范的潜在第三方之一就是 Hibernate 人员。由于 JPA 规范与已经存在的(并且完全实现的)Hibernate 框架非常相似,因此他们决定与 Hibernate 一起构建它。因此,在 Hibernate 框架中,您拥有原始的 Hibernate API 和实现(与 JPA 规范无关)和 JPA 实现。您甚至可以同时使用它们,尽管这确实不是一个好习惯。

Now, the Oracle Java guys, after finishing the specs, also made an implementation of those themselves. They tend to do this with most of their specs APIs. This implementation is called EclipseLink and you can check it out here . Theoretically, your JPA project should work exactly the same if you switch your Hibernate-JPA implementation libraries to EclipseLink-JPA implementation libraries. In practice there are small differences.

于 2012-11-30T16:34:40.270 回答