在 Quarkus profiles 和 live coding 模式下使用 Hibernate ORM 的技巧

Quarkus 的热部署(也称为开发模式)对于混合了前端或服务以及数据库访问的应用来说非常有用。有几种常用方法可以充分利用它。

第一个选择是使用 quarkus.hibernate-orm.database.generation=drop-and-create 并结合 import.sql。这样,对于你的应用的每一次更改,特别是对你的实体(entities)的更改,数据库 schema 都将被正确地重新创建,并且你的数据 fixture(存储在 import.sql 中)将用于从头开始重新填充它。这对于完美控制你的环境是最好的,并且与 Quarkus 的热部署模式配合得非常好:你的实体更改或任何对 import.sql 的更改都会被立即捕获,并且 schema 会在不重启应用的情况下更新!

默认情况下,Hibernate ORM 在启动时会读取并执行 /import.sql 文件(如果存在)中的 SQL 语句。你可以通过在 application.properties 中更改属性 quarkus.hibernate-orm.sql-load-script 来更改文件名。

第二个方法是使用 quarkus.hibernate-orm.database.generation=update。当你进行许多实体更改但仍需要处理生产数据的副本,或者想重现基于特定数据库条目的 bug 时,此方法是最佳选择。update 是 Hibernate ORM 的尽力而为,在特定情况下可能会失败,包括修改你的数据库结构可能导致数据丢失。例如,如果你更改了与外键相关的结构,Hibernate ORM 可能不得不放弃。但对于开发来说,这些限制是可以接受的。

第三个方法是使用 quarkus.hibernate-orm.database.generation=none。当你处理生产数据的副本但想要完全控制 schema 演进,或者当你使用像 Flyway 这样的数据库 schema 迁移工具时,此方法是最佳选择。当你对实体进行更改时,请确保相应地调整数据库 schema。

请勿在生产环境中使用 quarkus.hibernate-orm.database.generationdrop-and-createupdate。特此警告 :)

现在结合 Quarkus profile

当与 Quarkus 配置 profile 结合使用时,它会变得非常强大。你可以定义不同的 配置 profile,以便根据你的环境选择不同的行为。这很棒,因为你可以定义 Hibernate ORM 属性的不同组合,以匹配你当前需要的开发风格。

application.properties
# By default, use the clean (data) slate approach
%dev.quarkus.hibernate-orm.database.generation = drop-and-create
%dev.quarkus.hibernate-orm.sql-load-script = import-dev.sql

# Use this to incrementally work in your app while keeping data
# Useful for rapid dev-check cycles with Quarkus dev mode
%dev-with-data.quarkus.hibernate-orm.database.generation = update
%dev-with-data.quarkus.hibernate-orm.sql-load-script =

# Let's make sure we don't wipe the production data by accident!
%prod.quarkus.hibernate-orm.database.generation = none
%prod.quarkus.hibernate-orm.sql-load-script = no-file
# Rapid prototyping time!
mvn compile quarkus:dev -Dquarkus.profile=dev-with-data

# And now, let's be ready for prod
mvn clean package -Pnative -Dquarkus.profile=prod

希望这个技巧对你有帮助。Hibernate ORM 的 schema 更新、数据 fixture、Quarkus 的开发模式及其配置 profile 是一个强大的组合!