在 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 在启动时会读取并执行 |
第二个方法是使用 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.generation 的 drop-and-create 和 update 。特此警告 :) |
现在结合 Quarkus profile
当与 Quarkus 配置 profile 结合使用时,它会变得非常强大。你可以定义不同的 配置 profile,以便根据你的环境选择不同的行为。这很棒,因为你可以定义 Hibernate ORM 属性的不同组合,以匹配你当前需要的开发风格。
# 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 是一个强大的组合!