编辑此页面

使用 Hibernate Reactive

Hibernate Reactive 是 Hibernate ORM 的一个响应式 API,支持非阻塞数据库驱动程序和与数据库进行响应式风格的交互。

Hibernate Reactive 不是 Hibernate ORM 的替代品,也不是 Hibernate ORM 的未来。它是一个为响应式用例量身定制的不同堆栈,在这些用例中您需要高并发性。

此外,使用 Quarkus REST(以前的 RESTEasy Reactive),我们的默认 REST 层,不需要使用 Hibernate Reactive。将 Quarkus REST 与 Hibernate ORM 一起使用是完全有效的,如果您不需要高并发性,或者不习惯响应式范例,建议使用 Hibernate ORM。

Hibernate Reactive 使用与 Hibernate ORM 指南中描述的相同的注解和大多数配置。本指南将只关注 Hibernate Reactive 特有的内容。

此技术被认为是预览版。

预览中,不保证向后兼容性和在生态系统中的存在。具体的改进可能需要更改配置或 API,成为稳定版的计划正在进行中。欢迎通过我们的 邮件列表 或在我们的 GitHub 问题跟踪器 中提供反馈。

有关可能的完整状态列表,请查看我们的常见问题解答条目

解决方案

我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。

克隆 Git 仓库:git clone https://github.com/quarkusio/quarkus-quickstarts.git,或下载 归档文件

解决方案位于 hibernate-reactive-quickstart 目录中。

设置和配置 Hibernate Reactive

在 Quarkus 中使用 Hibernate Reactive 时,您需要

  • application.properties 中添加您的配置设置

  • 像往常一样使用 @Entity 和任何其他映射注解来注解您的实体

其他配置需求已经自动化:Quarkus 将做出一些主观选择和有根据的猜测。

将以下依赖项添加到您的项目

例如

pom.xml
<!-- Hibernate Reactive dependency -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-reactive</artifactId>
</dependency>

<!-- Reactive SQL client for PostgreSQL -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
build.gradle
// Hibernate Reactive dependency
implementation("io.quarkus:quarkus-hibernate-reactive")

Reactive SQL client for PostgreSQL
implementation("io.quarkus:quarkus-reactive-pg-client")

使用 @Entity 注解您的持久对象,然后在 application.properties 中添加相关的配置属性

application.properties 示例
# datasource configuration
quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = quarkus_test
quarkus.datasource.password = quarkus_test

quarkus.datasource.reactive.url = vertx-reactive:postgresql:///quarkus_test (1)

# drop and create the database at startup (use `update` to only update the schema)
quarkus.hibernate-orm.schema-management.strategy=drop-and-create
1 与 Hibernate ORM 配置唯一不同的属性

请注意,这些配置属性与您典型的 Hibernate Reactive 配置文件中的配置属性不同。它们通常会映射到 Hibernate Reactive 配置属性,但可能具有不同的名称,并且不一定彼此 1:1 映射。

阻塞(非响应式)和响应式配置可以在同一个项目中混合使用

不支持使用标准的 persistence.xml 配置文件配置 Hibernate Reactive。

有关您可以在 application.properties 中设置的属性列表,请参阅 Hibernate Reactive 配置属性 部分。

只要 Hibernate Reactive 扩展在您的项目依赖项中列出,就会基于 Quarkus datasource 配置创建一个 Mutiny.SessionFactory

方言将根据响应式 SQL 客户端进行选择 - 除非您显式设置一个。

然后您可以愉快地注入您的 Mutiny.SessionFactory

使用 Hibernate Reactive 的应用程序 bean 示例
@ApplicationScoped
public class SantaClausService {
    @Inject
    Mutiny.SessionFactory sf; (1)

    public Uni<Void> createGift(String giftDescription) {
	Gift gift = new Gift();
        gift.setName(giftDescription);
	return sf.withTransaction(session -> session.persist(gift)) (2)
    }
}
1 注入您的会话工厂并享受乐趣
2 .withTransaction() 将在提交时自动刷新
确保将修改数据库的方法(例如 session.persist(entity))包装在事务中。
实体示例
@Entity
public class Gift {
    private Long id;
    private String name;

    @Id
    @SequenceGenerator(name = "giftSeq", sequenceName = "gift_id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(generator = "giftSeq")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

要在 Hibernate Reactive 启动时加载 SQL 语句,请在您的 src/main/resources/ 目录中添加一个 import.sql 文件。此脚本可以包含任何 SQL DML 语句。确保以分号结束每个语句。

这对于准备好用于测试或演示的数据集很有用。

Hibernate Reactive 配置属性

有各种可选属性可用于完善您的会话工厂或指导 Quarkus 的猜测。

当未设置任何属性时,Quarkus 通常可以推断出设置 Hibernate Reactive 所需的一切,并将使其使用默认数据源。

此处列出的配置属性允许您覆盖此类默认值,并自定义和调整各个方面。

Hibernate Reactive 使用与 Hibernate ORM 相同的属性。您会注意到某些属性的名称中包含 jdbc,但 Hibernate Reactive 中没有 JDBC,这些只是遗留属性名称。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

构建期间是否启用 Hibernate ORM。

如果在构建期间禁用 Hibernate ORM,则将跳过与 Hibernate ORM 相关的所有处理,但无法在运行时激活 Hibernate ORM:quarkus.hibernate-orm.active 将默认为 false,将其设置为 true 将导致错误。

环境变量:QUARKUS_HIBERNATE_ORM_ENABLED

显示更多

布尔值

true

Hibernate ORM 是否以阻塞模式工作。

如果未找到 JDBC 数据源,Hibernate ORM 的阻塞 EntityManager/Session/SessionFactory 通常默认禁用。如果您想禁用它们,即使有 JDBC 数据源,也可以将此属性设置为 false

环境变量:QUARKUS_HIBERNATE_ORM_BLOCKING

显示更多

布尔值

true

如果为 true,Quarkus 将忽略类路径中的任何 persistence.xml 文件,并完全依赖于 Quarkus 配置。

环境变量:QUARKUS_HIBERNATE_ORM_PERSISTENCE_XML_IGNORE

显示更多

布尔值

false

是否启用统计信息收集。如果“metrics.enabled”为 true,则此处默认值被认为是 true,否则默认值为 false。

环境变量:QUARKUS_HIBERNATE_ORM_STATISTICS

显示更多

布尔值

是否应将会话指标附加到服务器日志中,用于每个 Hibernate 会话。这仅在启用统计信息时有效 (quarkus.hibernate-orm.statistics)。默认值为 false(这意味着需要同时启用 statisticslog-session-metrics 才能使会话指标出现在日志中)。

环境变量:QUARKUS_HIBERNATE_ORM_LOG_SESSION_METRICS

显示更多

布尔值

如果启用了指标扩展,是否发布指标。

环境变量:QUARKUS_HIBERNATE_ORM_METRICS_ENABLED

显示更多

布尔值

false

允许在 Dev UI 页面中使用 hql 查询

环境变量:QUARKUS_HIBERNATE_ORM_DEV_UI_ALLOW_HQL

显示更多

布尔值

false

当没有活动事务但请求范围有效时,启用或禁用对 Hibernate ORM EntityManager/Session/StatelessSession 的访问。 启用后,相应的会话将是只读的。 默认情况下启用以实现向后兼容性,但建议禁用此功能,以避免因在事务外部运行的查询导致的不一致结果。

环境变量:QUARKUS_HIBERNATE_ORM_REQUEST_SCOPED_ENABLED

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".datasource

此持久化单元使用的数据源的名称。

如果未定义,它将使用默认数据源。

环境变量:QUARKUS_HIBERNATE_ORM_DATASOURCE

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".packages

受此持久化单元影响的实体所在的包。

环境变量:QUARKUS_HIBERNATE_ORM_PACKAGES

显示更多

字符串列表

quarkus.hibernate-orm."持久化单元名称".sql-load-script

包含在 Hibernate ORM 启动时执行的 SQL 语句的文件的路径。

这些文件是从类路径资源中检索的,因此它们必须位于 resources 目录中(例如 src/main/resources)。

此设置的默认值取决于 Quarkus 启动模式

  • 在开发和测试模式下,它默认为 import.sql。只需在 resources 目录的根目录下添加一个 import.sql 文件,它就会被拾取,而无需设置此属性。传递 no-file 以强制 Hibernate ORM 忽略 SQL 导入文件。

  • 在生产模式下,它默认为 no-file。这意味着 Hibernate ORM 默认情况下不会尝试执行任何 SQL 导入文件。传递一个显式值以强制 Hibernate ORM 执行 SQL 导入文件。

如果您需要在开发模式、测试 (@QuarkusTest) 和生产之间使用不同的 SQL 语句,请使用 Quarkus 配置配置文件工具

application.properties
%dev.quarkus.hibernate-orm.sql-load-script = import-dev.sql
%test.quarkus.hibernate-orm.sql-load-script = import-test.sql
%prod.quarkus.hibernate-orm.sql-load-script = no-file

Quarkus 支持 .sql 文件,其中 SQL 语句或注释分布在多行中。每个 SQL 语句必须以分号结尾。

环境变量:QUARKUS_HIBERNATE_ORM_SQL_LOAD_SCRIPT

显示更多

字符串列表

开发和测试模式下为 import.sql;否则为 no-file

quarkus.hibernate-orm."持久化单元名称".physical-naming-strategy

用于应用数据库对象名称的物理命名规则的可插拔策略合同。 Hibernate PhysicalNamingStrategy 实现的类名

环境变量:QUARKUS_HIBERNATE_ORM_PHYSICAL_NAMING_STRATEGY

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".implicit-naming-strategy

在未给出显式名称时,用于应用隐式命名规则的可插拔策略。 Hibernate ImplicitNamingStrategy 实现的类名

环境变量:QUARKUS_HIBERNATE_ORM_IMPLICIT_NAMING_STRATEGY

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".metadata-builder-contributor

并非 org.hibernate.boot.MetadataBuilder 公开的所有自定义选项都能正常工作。 特别是不要使用与类路径扫描相关的选项。

公开此设置主要是为了允许注册类型、转换器和 SQL 函数。

环境变量:QUARKUS_HIBERNATE_ORM_METADATA_BUILDER_CONTRIBUTOR

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".mapping-files

用于配置实体映射的 XML 文件,例如 META-INF/my-orm.xml

如果存在,则默认为 META-INF/orm.xml。 传递 no-file 以强制 Hibernate ORM 忽略 META-INF/orm.xml

环境变量:QUARKUS_HIBERNATE_ORM_MAPPING_FILES

显示更多

字符串列表

如果存在,则为 META-INF/orm.xml; 否则为 no-file

quarkus.hibernate-orm."持久化单元名称".quote-identifiers.strategy

可以使用可用的策略之一来引用标识符。

默认设置为 none,表示不引用任何标识符。 如果设置为 all,则将引用所有标识符和列定义。 此外,将其设置为 all-except-column-definitions 将跳过列定义,这通常在它们存在时是必需的,否则使用选项 only-keywords 仅引用 Hibernate ORM 方言认为的 SQL 关键字的标识符。

环境变量:QUARKUS_HIBERNATE_ORM_QUOTE_IDENTIFIERS_STRATEGY

显示更多

noneallall-except-column-definitionsonly-keywords

none

quarkus.hibernate-orm."持久化单元名称".second-level-caching-enabled

Quarkus 中的默认设置为启用 2 级缓存,并且已经为您集成了一个良好的实现。

只需挑出哪些实体应使用缓存。

将此设置为 false 以禁用所有 2 级缓存。

环境变量:QUARKUS_HIBERNATE_ORM_SECOND_LEVEL_CACHING_ENABLED

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".validation.mode

定义 Bean Validation 集成的行为方式。

环境变量:QUARKUS_HIBERNATE_ORM_VALIDATION_MODE

显示更多

autocallbackddlnone 列表

auto

quarkus.hibernate-orm."持久化单元名称".multitenant

定义多租户的方法(DATABASE、NONE、SCHEMA)。 允许值的完整列表可在 Hibernate ORM JavaDoc 中找到。 当前不支持 DISCRIMINATOR 类型。 默认值为 NONE(无多租户)。

环境变量:QUARKUS_HIBERNATE_ORM_MULTITENANT

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".validate-in-dev-mode

如果 Hibernate 没有自动生成架构,并且 Quarkus 在开发模式下运行,则 Quarkus 将尝试在启动后验证数据库,并在出现任何问题时打印日志消息。

环境变量:QUARKUS_HIBERNATE_ORM_VALIDATE_IN_DEV_MODE

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".active

此持久化单元是否应在运行时处于活动状态。

请参阅 文档的此部分

请注意,如果禁用了 Hibernate ORM(即 quarkus.hibernate-orm.enabled 设置为 false),则所有持久化单元都将被停用,并且将此属性设置为 true 将失败。

环境变量:QUARKUS_HIBERNATE_ORM_ACTIVE

显示更多

布尔值

如果启用了 Hibernate ORM,则为“true”; 否则为“false”

quarkus.hibernate-orm."持久化单元名称".unsupported-properties."完整属性键"

应直接传递给 Hibernate ORM 的属性。 在此处使用完整的配置属性键,例如 quarkus.hibernate-orm.unsupported-properties."hibernate.order_inserts" = true

此处设置的属性完全不受支持:由于 Quarkus 通常不知道这些属性及其用途,因此绝对无法保证它们可以正常工作,即使可以正常工作,升级到较新版本的 Quarkus 时(即使只是微型/修补版本)也可能会发生变化。

考虑在使用不受支持的配置属性之前使用受支持的配置属性。 如果不存在,请确保提交功能请求,以便可以将受支持的配置属性添加到 Quarkus,更重要的是,可以定期测试该配置属性。

环境变量:QUARKUS_HIBERNATE_ORM_UNSUPPORTED_PROPERTIES__完整属性键_

显示更多

Map<String,String>

数据库相关配置

类型

默认

设置后,尽最大努力尝试与给定版本的 Hibernate ORM 进行数据交换。

请注意

  • 架构验证在某些情况下可能仍然失败:这尝试使 Hibernate ORM 6+ 在运行时正确运行,但它可能仍然需要不同的(但运行时兼容的)架构。

  • 强大的测试套件仍然有用且建议:您仍然应该检查您的应用程序在旧版架构中是否按预期运行。

  • 此功能本质上是不稳定的:它的某些方面可能会在 Quarkus 的未来版本中停止工作,并且随着 Hibernate ORM 更改的堆积以及对这些旧版本的支持变得太不可靠,旧版本将被删除。

  • 您仍然应该计划将您的架构迁移到较新版本的 Hibernate ORM。 有关迁移方面的帮助,请参阅 Quarkus 3 迁移指南,从 Hibernate ORM 5 迁移到 6

环境变量:QUARKUS_HIBERNATE_ORM_DATABASE_ORM_COMPATIBILITY_VERSION

显示更多

5.6latest

latest

quarkus.hibernate-orm."持久化单元名称".database.charset

数据库的字符集。

用于 DDL 生成和 SQL 导入脚本。

环境变量:QUARKUS_HIBERNATE_ORM_DATABASE_CHARSET

显示更多

字符集

UTF-8

quarkus.hibernate-orm."持久化单元名称".database.default-catalog

用于数据库对象的默认目录。

环境变量:QUARKUS_HIBERNATE_ORM_DATABASE_DEFAULT_CATALOG

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".database.default-schema

用于数据库对象的默认架构。

环境变量:QUARKUS_HIBERNATE_ORM_DATABASE_DEFAULT_SCHEMA

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".database.version-check.enabled

Hibernate ORM 是否应在启动时检查数据库的版本是否与方言上配置的版本匹配(默认版本或通过 quarkus.datasource.db-version 设置的版本)。

如果数据库在启动时不可用,则应将此设置为 false

环境变量:QUARKUS_HIBERNATE_ORM_DATABASE_VERSION_CHECK_ENABLED

显示更多

布尔值

如果方言是由 Quarkus 自动设置的,则为“true,如果它是显式设置的,则为“false

方言相关配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".dialect

Hibernate ORM 方言的名称。

对于 受支持的数据库,不需要显式设置此属性:它会根据数据源自动选择,并使用 在数据源上设置的 DB 版本进行配置,以从最佳性能和最新功能中受益。

如果您的数据库没有相应的 Quarkus 扩展,则需要显式设置此属性。 在这种情况下,请记住 JDBC 驱动程序和 Hibernate ORM 方言可能无法在 GraalVM 本机可执行文件中正常工作。

对于内置方言,预期值是 方言的官方列表中的名称之一,没有 Dialect 后缀,例如 Cockroach 表示 CockroachDialect

对于第三方方言,预期值是完全限定的类名,例如 com.acme.hibernate.AcmeDbDialect

环境变量:QUARKUS_HIBERNATE_ORM_DIALECT

显示更多

字符串

自动为大多数流行的数据库选择

quarkus.hibernate-orm."持久化单元名称".dialect.storage-engine

当方言支持多个存储引擎时,要使用的存储引擎。

例如 MySQL 的 MyISAMInnoDB

环境变量:QUARKUS_HIBERNATE_ORM_DIALECT_STORAGE_ENGINE

显示更多

字符串

映射配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".mapping.timezone.default-storage

默认情况下如何为 OffsetDateTimeZonedDateTime 类型的属性在数据库中存储时区。

可以使用 @TimeZoneStorage 在每个属性的基础上覆盖此默认值。

OffsetTime 类型的属性 不受此设置的影响
default

如果支持,则等效于 native,否则等效于 normalize-utc

auto

如果支持,则等效于 native,否则等效于 column

native

将时间戳和时区存储在 timestamp with time zone 类型的列中。

仅在某些数据库/方言上可用; 如果不支持,则在静态初始化期间将引发异常。

column

将时区存储在时间戳列旁边的单独列中。

在相关实体属性上使用 @TimeZoneColumn 自定义时区列。

normalize-utc

不存储时区,并且会在持久化时丢失时区信息。

而是将该值标准化为 UTC 时区中的时间戳。

normalize

不存储时区,并且会在持久化时丢失时区信息。

而是标准化该值:* 在持久化到数据库时,标准化为 JDBC 时区(通过 quarkus.hibernate-orm.jdbc.timezone 设置),或者如果未设置,则标准化为 JVM 默认时区。 * 从数据库中读回时,标准化为 JVM 默认时区。

+ 使用此选项可以获取 Quarkus 2 / Hibernate ORM 5 或更旧版本的旧版行为。

环境变量:QUARKUS_HIBERNATE_ORM_MAPPING_TIMEZONE_DEFAULT_STORAGE

显示更多

nativenormalizenormalize-utccolumnautodefault

default

quarkus.hibernate-orm."持久化单元名称".mapping.id.optimizer.default

要应用于其优化器未显式配置的标识符生成器的优化器。

仅与基于表和序列的标识符生成器相关。 其他生成器(例如基于 UUID 的生成器)将忽略此设置。

优化器负责汇集新的标识符值,以减少数据库调用的频率来检索这些值,从而提高性能。

环境变量:QUARKUS_HIBERNATE_ORM_MAPPING_ID_OPTIMIZER_DEFAULT

显示更多

pooled-lo假定从表/序列中检索到的值是池的下端。 检索到值 N 后,新的标识符池将从 NN + <allocation size> - 1(包括)。pooled假定从表/序列中检索到的值是池的上端。 检索到值 N 后,新的标识符池将从 N - <allocation size>N + <allocation size> - 1(包括)。 第一个值 1 的处理方式不同,以避免负标识符。 使用此选项可以获取 Quarkus 2 / Hibernate ORM 5 或更旧版本的旧版行为。none没有优化器,导致每次都需要来自生成器的标识符值时都会进行数据库调用。 不建议在生产环境中使用:可能会导致性能下降和/或标识符值中出现频繁的间隙。

pooled-lo假定从表/序列中检索到的值是池的下端。 检索到值 N 后,新的标识符池将从 NN + <allocation size> - 1(包括)。

查询相关配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".query.query-plan-cache-max-size

查询计划缓存的最大大小。 请参阅 #org.hibernate.cfg.AvailableSettings#QUERY_PLAN_CACHE_MAX_SIZE

环境变量:QUARKUS_HIBERNATE_ORM_QUERY_QUERY_PLAN_CACHE_MAX_SIZE

显示更多

整数

2048

quarkus.hibernate-orm."持久化单元名称".query.default-null-ordering

ORDER BY 子句中 null 值的默认优先级。

有效值为:nonefirstlast

环境变量:QUARKUS_HIBERNATE_ORM_QUERY_DEFAULT_NULL_ORDERING

显示更多

nonefirstlast

none

quarkus.hibernate-orm."持久化单元名称".query.in-clause-parameter-padding

启用 IN 子句参数填充,这可以提高语句缓存。

环境变量:QUARKUS_HIBERNATE_ORM_QUERY_IN_CLAUSE_PARAMETER_PADDING

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".query.fail-on-pagination-over-collection-fetch

当无法在数据库端应用限制时,触发异常,而不是尝试性能不佳的内存结果集限制。

当分页与应用于集合或多值关联的提取连接结合使用时,限制必须在内存中应用,而不是在数据库中应用。 应避免这种情况,因为它通常具有很差的性能特征。

环境变量:QUARKUS_HIBERNATE_ORM_QUERY_FAIL_ON_PAGINATION_OVER_COLLECTION_FETCH

显示更多

布尔值

false

JDBC 相关配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".jdbc.timezone

推送到 JDBC 驱动程序的时区。 请参阅 quarkus.hibernate-orm.mapping.timezone.default-storage

环境变量:QUARKUS_HIBERNATE_ORM_JDBC_TIMEZONE

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".jdbc.statement-fetch-size

JDBC 驱动程序一次提取多少行。

环境变量:QUARKUS_HIBERNATE_ORM_JDBC_STATEMENT_FETCH_SIZE

显示更多

整数

quarkus.hibernate-orm."持久化单元名称".jdbc.statement-batch-size

JDBC 驱动程序一次发送多少更新(插入、更新和删除)来执行。

环境变量:QUARKUS_HIBERNATE_ORM_JDBC_STATEMENT_BATCH_SIZE

显示更多

整数

提取逻辑配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".fetch.batch-size

加载实体和集合时使用的批次的大小。

-1 表示禁用批处理加载。

环境变量:QUARKUS_HIBERNATE_ORM_FETCH_BATCH_SIZE

显示更多

整数

16

quarkus.hibernate-orm."持久化单元名称".fetch.max-depth

单端关联(一对一,多对一)的外连接提取树的最大深度。

0 将禁用默认的外部连接抓取。

环境变量:QUARKUS_HIBERNATE_ORM_FETCH_MAX_DEPTH

显示更多

整数

缓存配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".cache."cache".expiration.max-idle

缓存对象被视为过期的最大时间。

环境变量:QUARKUS_HIBERNATE_ORM_CACHE__CACHE__EXPIRATION_MAX_IDLE

显示更多

Duration 

quarkus.hibernate-orm."持久化单元名称".cache."cache".memory.object-count

缓存中内存中保存的最大对象数。

环境变量:QUARKUS_HIBERNATE_ORM_CACHE__CACHE__MEMORY_OBJECT_COUNT

显示更多

long

鉴别器相关配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".discriminator.ignore-explicit-for-joined

现有应用程序(隐式或显式地)依赖于 Hibernate 忽略连接继承层次结构上的任何 DiscriminatorColumn 声明。此设置允许这些应用程序保持遗留行为,即 DiscriminatorColumn 注解在与连接继承配对时被忽略。

环境变量:QUARKUS_HIBERNATE_ORM_DISCRIMINATOR_IGNORE_EXPLICIT_FOR_JOINED

显示更多

布尔值

false

日志配置

类型

默认

记录 SQL 绑定参数。

显然,不建议在生产环境中将其设置为 true。

环境变量:QUARKUS_HIBERNATE_ORM_LOG_BIND_PARAMETERS

显示更多

布尔值

false

quarkus.hibernate-orm."持久化单元名称".log.sql

显示 SQL 日志并很好地格式化它们。

显然,不建议在生产环境中将其设置为 true。

环境变量:QUARKUS_HIBERNATE_ORM_LOG_SQL

显示更多

布尔值

false

quarkus.hibernate-orm."持久化单元名称".log.format-sql

如果启用了 SQL 日志,则格式化 SQL 日志

环境变量:QUARKUS_HIBERNATE_ORM_LOG_FORMAT_SQL

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".log.highlight-sql

如果启用了 SQL 日志,则高亮显示 SQL 日志

环境变量:QUARKUS_HIBERNATE_ORM_LOG_HIGHLIGHT_SQL

显示更多

布尔值

true

quarkus.hibernate-orm."持久化单元名称".log.jdbc-warnings

是否应该收集和记录 JDBC 警告。

环境变量:QUARKUS_HIBERNATE_ORM_LOG_JDBC_WARNINGS

显示更多

布尔值

取决于方言

quarkus.hibernate-orm."持久化单元名称".log.queries-slower-than-ms

如果设置,Hibernate 将记录执行时间超过指定毫秒数的查询。

环境变量:QUARKUS_HIBERNATE_ORM_LOG_QUERIES_SLOWER_THAN_MS

显示更多

long

模式管理配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".schema-management.strategy

选择是否生成数据库模式。

drop-and-create 在开发模式下非常棒。

默认为“none”。

但是,如果 Dev Services 正在使用中,并且不存在其他管理模式的扩展,则该值将自动覆盖为“drop-and-create”。

可接受的值:nonecreatedrop-and-createdropupdatevalidate

环境变量:QUARKUS_HIBERNATE_ORM_SCHEMA_MANAGEMENT_STRATEGY

显示更多

字符串

none

quarkus.hibernate-orm."持久化单元名称".schema-management.create-schemas

如果 Hibernate ORM 应该自动创建模式(对于支持它们的数据库)。

环境变量:QUARKUS_HIBERNATE_ORM_SCHEMA_MANAGEMENT_CREATE_SCHEMAS

显示更多

布尔值

false

quarkus.hibernate-orm."持久化单元名称".schema-management.halt-on-error

在应用模式时,我们是否应该在第一个错误时停止。

环境变量:QUARKUS_HIBERNATE_ORM_SCHEMA_MANAGEMENT_HALT_ON_ERROR

显示更多

布尔值

false

数据库脚本相关配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".scripts.generation

选择是否生成数据库模式 DDL 文件。可接受的值:nonecreatedrop-and-createdropupdatevalidate

环境变量:QUARKUS_HIBERNATE_ORM_SCRIPTS_GENERATION

显示更多

字符串

none

quarkus.hibernate-orm."持久化单元名称".scripts.generation.create-target

应该在其中生成数据库创建 DDL 文件的文件名或 URL。

环境变量:QUARKUS_HIBERNATE_ORM_SCRIPTS_GENERATION_CREATE_TARGET

显示更多

字符串

quarkus.hibernate-orm."持久化单元名称".scripts.generation.drop-target

应该在其中生成数据库删除 DDL 文件的文件名或 URL。

环境变量:QUARKUS_HIBERNATE_ORM_SCRIPTS_GENERATION_DROP_TARGET

显示更多

字符串

刷新配置

类型

默认

quarkus.hibernate-orm."持久化单元名称".flush.mode

默认的刷新策略,或者在 Hibernate 会话中何时将实体刷新到数据库:每次查询之前,在提交时,……

可以通过 Session#setHibernateFlushMode() 在每个会话的基础上覆盖此默认设置,或者使用提示 HibernateHints#HINT_FLUSH_MODE 在每个查询的基础上覆盖此默认设置。

有关详细信息,请参阅 org.hibernate.FlushMode 的 javadoc。

环境变量:QUARKUS_HIBERNATE_ORM_FLUSH_MODE

显示更多

manualcommitautoalways

auto

关于 Duration 格式

要写入持续时间值,请使用标准的 java.time.Duration 格式。有关更多信息,请参阅 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

想要在 Docker 中启动一个 PostgreSQL 服务器吗?

docker run --rm --name postgres-quarkus-hibernate -e POSTGRES_USER=quarkus_test \
           -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test \
           -p 5432:5432 postgres:14.1

这将启动一个非持久性的空数据库:非常适合快速实验!

Hibernate ORM 和 Reactive 扩展同时使用

如果您将 Hibernate ORM 和 Hibernate Reactive 扩展都添加到您的 Quarkus 应用程序中,它们可以在同一个项目中混合使用。

如果您的应用程序通常使用 Hibernate ORM(它是阻塞的),但您想尝试 Hibernate Reactive 以查看它是否更适合您的情况,这将非常有用。

通过添加第二个扩展,您可以在代码的另一部分中使用 Reactive API - 无需创建单独的应用程序。

Hibernate ORM 和 Hibernate Reactive 不会共享同一个持久化上下文,因此建议您在一个给定的方法中坚持使用其中一个。例如,在阻塞的 REST 端点中使用 Hibernate ORM,并在 Reactive REST 端点中使用 Hibernate Reactive。
  • 要同时使用这两个扩展,请将这两个扩展添加到 pom.xml 文件

            <!-- Hibernate reactive -->
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-hibernate-reactive</artifactId>
            </dependency>
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-reactive-pg-client</artifactId>
            </dependency>
    
            <!-- Hibernate ORM -->
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-jdbc-postgresql</artifactId>
            </dependency>
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-hibernate-orm</artifactId>
            </dependency>
  • 还要更新 applications.properties 文件

%prod.quarkus.datasource.reactive.url=postgresql:///your_database
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://:5432/hibernate_orm_test
  • JDBC 驱动程序的存在将启用 Hibernate ORM。如果您想禁用它,并且只使用 Hibernate Reactive,您可以使用

    quarkus.hibernate-orm.blocking=false

Quarkus 将自动设置许多 Hibernate Reactive 配置设置,并且通常会使用更现代的默认值。

CDI 集成

如果您熟悉在 Quarkus 中使用 Hibernate Reactive,您可能已经使用 CDI 注入了 Mutiny.SessionFactory

@Inject
Mutiny.SessionFactory sessionFactory;

这将注入默认持久化单元的 Mutiny.SessionFactory

在 Quarkus 3.0 之前,也可以为 Mutiny.Session 注入 @RequestScoped bean。但是,Reactive 会话的生命周期不适合 CDI 请求上下文的生命周期。因此,此 bean 已在 Quarkus 3.0 中删除。

自动转换为 Flyway 来管理模式

Hibernate Reactive 可以与 Flyway 在同一个应用程序中使用。有关在 Reactive 应用程序中配置 Flyway 的详细信息,请参阅 Flyway 扩展文档的此部分

如果在开发模式下运行时安装了 Flyway 扩展,Quarkus 提供了一种使用 Hibernate Reactive 自动生成的模式来初始化 Flyway 配置的简单方法。

有关更多详细信息,请参阅 Hibernate ORM 指南

测试

由于 API 的异步特性以及所有操作都需要在 Vert.x 事件循环上运行,因此在 @QuarkusTest 中使用 Hibernate Reactive 比使用 Hibernate ORM 稍微复杂一些。

编写这些测试需要两个组件

  • 在测试方法上使用 @io.quarkus.test.vertx.RunOnVertxContext@io.quarkus.test.TestReactiveTransaction

  • 使用 io.quarkus.test.vertx.UniAsserter 作为测试方法参数。

这些类由 quarkus-test-vertx 依赖项提供。

一个非常简单的用法示例如下

@QuarkusTest
public class SomeTest {

    @Inject
    Mutiny.SessionFactory sessionFactory;

    @Test
    @RunOnVertxContext
    public void testQuery(UniAsserter asserter) {
        asserter.assertThat(() -> sessionFactory.withSession(s -> s.createQuery(
                "from Gift g where g.name = :name").setParameter("name", "Lego").getResultList()),
                list -> org.junit.jupiter.api.Assertions.assertEquals(list.size(), 1));
    }

}
有关可用于创建断言的各种方法的完整说明,请参阅 UniAsserter 的 Javadoc。

您还可以扩展 io.quarkus.test.vertx.UniAsserterInterceptor 来包装注入的 UniAsserter 并自定义默认行为。例如,拦截器可用于在单独的数据库事务中执行断言方法。

@QuarkusTest
public class SomeTest {

   @Test
   @RunOnVertxContext
   public void testEntity(UniAsserter asserter) {
      asserter = new UniAsserterInterceptor(asserter) {
         @Override
         protected <T> Supplier<Uni<T>> transformUni(Supplier<Uni<T>> uniSupplier) {
            return () -> Panache.withTransaction(uniSupplier);
         }
      };
      asserter.execute(() -> new MyEntity().persist());
      asserter.assertEquals(() -> MyEntity.count(), 1l);
      asserter.execute(() -> MyEntity.deleteAll());
   }
}

命名数据源

Hibernate Reactive 支持具有命名数据源

application.properties 示例
# datasource configuration
quarkus.hibernate-orm.datasource = named-datasource
quarkus.datasource."named-datasource".db-kind" = postgresql

# drop and create the database at startup (use `update` to only update the schema)
%prod.quarkus.hibernate-orm.schema-management.strategy=drop-and-create
%prod.quarkus.datasource."named-datasource".reactive" = true
%prod.quarkus.datasource."named-datasource".username" = quarkus_test
%prod.quarkus.datasource."named-datasource".password" = quarkus_test
%prod.quarkus.datasource.reactive.url = vertx-reactive:postgresql:///quarkus_test (1)

使用命名数据源时,您需要将 quarkus.hibernate-orm.datasource 属性设置为数据源的名称。

限制和其他您应该知道的事情

Quarkus 不会修改它使用的库;此规则也适用于 Hibernate Reactive:使用此扩展时,您将获得与使用原始库时大致相同的体验。

但是,虽然它们共享相同的代码,但 Quarkus 会自动配置一些组件并为某些扩展点注入自定义实现;这应该是透明且有用的,但如果您是 Hibernate Reactive 的专家,您可能想知道正在做什么。

以下是在 Quarkus 中使用 Hibernate Reactive 时需要注意的事项列表

使用 Panache 简化 Hibernate Reactive

带有 Panache 的 Hibernate Reactive 扩展通过提供活动记录风格的实体(和存储库)来促进 Hibernate Reactive 的使用,并专注于使您在 Quarkus 中编写实体变得微不足道且有趣。

验证模式和 Hibernate Validator 集成

要了解更多关于 quarkus.hibernate-orm.validation.mode 配置属性如何影响您的 Hibernate Reactive 应用程序,请参阅 相应的 Hibernate ORM 指南,因为这些模式在两种情况下都以相同的方式工作。

相关内容