Hibernate ORM 是将数据库结构映射到 Java 对象的标准方法。使用 ORM 工具的主要缺点是,即使是简单的数据库结构也需要大量样板代码(例如 getter 和 setter 方法)。此外,您必须在存储库类中包含基本查询方法,这使得工作非常重复。在本节中,我们将学习如何使用 Hibernate Panache 来简化和加速我们的应用程序的开发。
要开始使用带有 Panache 的 Hibernate ORM,让我们查看本章的第二个示例,它位于本书 GitHub 存储库的 Chapter05/hibernate-panache 文件夹中。我们建议您在继续之前将项目导入您的 IDE。
如果你看一下项目的配置,你会看到我们在 pom.xml 文件中包含了 quarkus-hibernate-orm-panache:
这是我们使用 Hibernate Panache 所需的唯一配置。现在是有趣的部分。将 Panache 插入您的实体有两种策略:
- Extending the io.quarkus.hibernate.orm.panache.PanacheEntity class: This is the simplest option as you will get an ID field that is auto-generated.
- Extending io.quarkus.hibernate.orm.panache.PanacheEntityBase: This option can be used if you require a custom ID strategy.
由于我们对 ID 字段使用 SequenceGenerator 策略,我们将使用后一个选项。以下是 Customer 类,它已被重写,以便扩展 PanacheEntityBase:
如您所见,由于我们没有使用 getter/setter 字段,因此代码已经减少了很多。相反,某些字段已公开为 public 以便类可以直接访问它们。 Orders 实体已使用相同的模式重写:
到目前为止,我们已经看到了 Hibernate Panache 提供的一些好处。另一个值得一提的方面是,通过扩展 PanacheEntityBase(或 PanacheEntity),您将能够直接在您的实体上使用一组静态方法。以下表格包含您可以在实体上触发的最常用方法:
Method |
Description |
count |
Counts this entity from the database (with an optional query and parameters) |
delete |
Delete this entity from the database if it has already been persisted. |
flush |
Flushes all pending changes to the database |
findById |
Finds an entity of this type by ID |
find |
Finds entities using a query with optional parameters and a sort strategy |
findAll |
Finds all the entities of this type |
list |
Shortcut for find().list() |
listAll |
Shortcut for findAll().list() |
deleteAll |
Deletes all the entities of this type |
delete |
Deletes entities using a query with optional parameters |
persist |
Persists all given entities |
下面显示了 CustomerRepository 类,它利用了 Customer 实体中可用的新字段和方法:
最明显的优势是您不再需要 EntityManager 作为代理来管理您的实体类。相反,您可以直接调用实体中可用的静态方法,从而显着降低 Repository 类的冗长性。
为了完整起见,让我们看一下 OrderRepository 类,它也被改编为使用 Panache 对象:
自从切换到 Hibernate Panache 对我们的 REST 端点和 Web 界面完全透明以来,您的应用程序中没有任何其他变化。使用以下命令像往常一样构建并运行应用程序:
在控制台上,您应该看到应用程序已启动,并且已添加两个初始客户:
现在,享受由 Hibernate ORM 和 Panache 提供支持的简化 CRUD 应用程序!