Skill 111 · Create Quarkus Project
Subchapter 111.3
references/database.mdMarkdown3 KBView on GitHub
Extensions: hibernate-orm-panache, jdbc-postgresql (or another JDBC driver). Optional: flyway or liquibase.
“Panache Next” (a unified blocking/reactive API) was renamed Quarkus Data in 3.37: the artifact is quarkus-data-hibernate (previously quarkus-hibernate-panache-next, and earlier quarkus-hibernate-panache). Its extension metadata in 3.40.1 says status: experimental, so keep hibernate-orm-panache (stable) unless the user asks for Quarkus Data. Not compiled here: only the artifact metadata and the 3.37/4.0 migration guides were checked.
With no quarkus.datasource.jdbc.url configured, dev and test modes start a PostgreSQL container automatically (Docker/Podman required). Do not set the URL in %dev/%test. Tuning:
quarkus.datasource.db-kind=postgresql
%dev.quarkus.datasource.devservices.image-name=postgres:17
%dev.quarkus.datasource.devservices.reuse=trueWithout image-name, 3.40 starts postgres:18; pin the image to match production. reuse only takes effect when the Testcontainers user file ~/.testcontainers.properties contains testcontainers.reuse.enable=true (otherwise Quarkus logs “Reuse was requested but the environment does not support the reuse of containers”).
Production settings go in %prod.:
%prod.quarkus.datasource.jdbc.url=${DB_URL}
%prod.quarkus.datasource.username=${DB_USER}
%prod.quarkus.datasource.password=${DB_PASSWORD}%dev.quarkus.hibernate-orm.schema-management.strategy=drop-and-create
%prod.quarkus.hibernate-orm.schema-management.strategy=none(quarkus.hibernate-orm.database.generation is the deprecated old name: 3.40 logs a deprecation warning for it. schema-management.strategy was verified on 3.27.6 and 3.40.1; for older releases check the Hibernate ORM guide.)
Panache repository:
@Entity
public class Product { @Id @GeneratedValue Long id; String name; }
@ApplicationScoped
public class ProductRepository implements PanacheRepository<Product> {}Put @Transactional on methods that write. Use find(...).page(Page.of(0, 20)) for pagination.
For production use Flyway (quarkus-flyway) or Liquibase (quarkus-liquibase):
quarkus.flyway.migrate-at-start=trueWhen adopting Flyway or Liquibase, remove every Hibernate schema-recreation override (such as the %dev drop-and-create above) and set quarkus.hibernate-orm.schema-management.strategy=none (or validate) so the migration tool alone manages the schema; otherwise Hibernate can drop and recreate the migrated tables.
With PostgreSQL, Flyway also needs the database-specific module org.flywaydb:flyway-database-postgresql (managed by the Quarkus BOM) next to quarkus-flyway; without it startup fails because Flyway cannot handle PostgreSQL.
Place scripts in src/main/resources/db/migration (V1__init.sql). Flyway also gets a Dev Services-provided datasource automatically.