1.1 类到表的映射

在学习了 JDBC 之后,您很可能会有这样的印象:从 Java 应用程序中使用数据库仍然是一种乐趣。如果我告诉你所有这些工作都可以轻松 10 倍地完成,你会怎样?

SQL语言的主要优点是什么?这是一种声明性语言——它描述了我们想要得到什么,但完全没有说明如何去做。如何 - 这是 SQL 服务器的关注点。

使用数据库时可以使用相同的方法。

在一个理想的世界中,我们可以简单地将 SQL 查询写入数据库,作为响应,如果我们请求多个部分,我们将收到现成的 Java 对象或 Java 对象的集合。

我能说什么,这就是几个人在 2000 年的想法,并决定编写他们自己的 ORM 框架。

ORM代表对象关系映射,本质上是 Java 对象到 SQL 查询的映射。

伙计们想到了一个非常简单的事情——数据库中的每个表都必须对应于 Java 应用程序中的某个类。在 Java 应用程序中,我们对对象进行操作,这些对象已经知道如何将自己保存到数据库中。

解决这个问题有三种方法,它们看起来像这样:

  1. 该对象将自身保存到数据库中,并根据数据库中的信息更新其字段。
  2. 该对象能够将自身保存到数据库中,但从不启动这种情况。
  3. 该对象仅包含数据,有人将其保存到数据库并从数据库中加载。

最初,第一种方法占主导地位,然后应用服务器和企业 Java Beans 流行起来。甚至有一整类称为 Persistence EJB 的 bean,它们可以将自己保存到数据库中。

但是有一天,一切都变了……

1.2 Hibernate的出现

2001 年,发布了 Hibernate 框架的第一个版本。这是一个非常简单的框架,但它允许使用普通的“愚蠢的对象”,这些对象不知道如何将它们存储在数据库中或从那里加载。

使用 XML 文件设置数据库表中 Java 类字段和列的映射。有时它们非常笨重。好吧,我在跟谁开玩笑。它们是大量的 XML 代码画布。只是因为 20 年前没有像现在这样庞大的数据库,才挽救了这种局面。

但事实上,最强大的决定是最终将需要保存到数据库的对象与保存它的代码分开。这个解决方案不是很明显。因为封装原则指出对象最清楚自己需要如何保存和加载。

而 ORM 方法确实打破了这个概念。数据类公开了它的内部结构,但操作不同类型的对象组变得容易多了。

在 Java 5 发布之后,JDK 中出现了两件事:

  • 注释
  • 代理人

注释XML 很快就被取代了,现在很容易在 Java 类中指定所有必要的设置来将 Java 类映射到数据库中的表。

代理人对于 Hibernate 用户来说不是那么引人注目,但他们的贡献更为重要。当您从 Hibernate 请求一个或多个特定对象时,它只会返回一个存根(代理),并拦截对其方法的所有调用。

这使得实现各种 Lazy Loading 机制成为可能,将 Hibernate 的速度和效率提升到了当时完全天价的水平。Hibernate 不仅成为事实上的行业标准——它还开始被翻译成其他语言。因此,例如,针对 C# 出现了 Framework NHibernate。

1.3 JPA的出现

事实上,随后是法律上的承认。JDK 开发人员决定创建一个关于如何正确地将对象映射到数据库中的表的规范。这个规范叫做JPA- Java 持久性 API。

这正是规范。它描述了一切应该如何工作,以及如果我们希望将类的对象保存到数据库中,我们需要哪些注释来标记类的不同部分。

看来这些家伙只是以 Hibernate 为基础,并从中更改了包名。因为原本在Hibernate中的注解几乎都一一转移到了JPA中。

今天,Hibernate 完全实现了整个 JPA 规范,以及一些使使用它更加舒适的附加功能。因此,在标准化方面,我们可以说Hibernate有两套特性:

  • JPA标准
  • Hibernate Native API(附加功能)

Hibernate 官方文档是这样描述的:

但根据我的经验和重新阅读 Hibernate 文档后,我可以说 JPA 和 Hibernate API 有 95% 相同。它们只是相同的概念。

1.4 用于休眠的 Maven

既然我对 Hibernate 赞不绝口,我认为是时候更努力地使用它了。

首先,有一个官方网站,那里只有一堆英文文档。当然,她在参考信息方面有偏见,而不是在培训方面。但它仍然比调试源代码要好,对吧?:)

操作说明:

  1. 你打开链接
  2. 你久久地看着她。
  3. 回到 CodeGym。
  4. 你阅读我的进一步讲座。

我的工作是将复杂的事情简单化,并用简单的术语解释它们。如果你达到了这个水平,那么我可以做到。

那么,要开始使用 Hibernate,您需要将它添加到您的 pom.xml 中。迄今为止,Hibernate 的第 6 版已经可用,或者说是 6.1.1,因此我们将学习如何使用最新版本。

只需将这些行添加到您的 pom.xml 中:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

如果您在 2023+ 窗口之外阅读本讲座,那么可以在此处下载新版本。

重要的!Hibernate 使用的一些库已在 JDK 11 和 JDK 17 中弃用,因此如果您在启动和运行项目时遇到问题,请向其中添加以下依赖项:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>