From 07588979e46eac401b7fe8f2b7aefebd6d8f2f42 Mon Sep 17 00:00:00 2001 From: Daniel Arroyo Date: Sat, 15 Aug 2026 00:04:17 -0400 Subject: [PATCH] fix(bootstrap): force EMF init + enable schema-gen on startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El error 'Table USERS not found' en BootstrapAdmin.User.count() se daba porque en Quarkus native-image, con database.generation=update, el schema-gen NO corre en startup del container por defecto (corre solo en dev mode). Resultado: en un H2 fresco, el primer SELECT COUNT(*) del bootstrap pierde contra una DB sin tablas. Dos cambios: 1. application.properties: agregar quarkus.hibernate-orm.schema-management.run-on-startup=true para forzar el schema-gen en startup en prod/native. 2. BootstrapAdmin: - @Transactional + EntityManager (em) inyectados - em.createNativeQuery('SELECT 1') al inicio de onStart() para asegurar que el EMF esté listo y la session esté abierta antes del count(). Belt-and-suspenders. --- .../java/com/l2/shots/auth/BootstrapAdmin.java | 14 +++++++++++++- src/main/resources/application.properties | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java index 37b5e07..96cef92 100644 --- a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java +++ b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java @@ -4,6 +4,8 @@ import io.quarkus.runtime.StartupEvent; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -29,17 +31,28 @@ public class BootstrapAdmin { @Inject AuthService authService; + @Inject + EntityManager em; + @ConfigProperty(name = "app.bootstrap.admin.enabled", defaultValue = "true") boolean enabled; @ConfigProperty(name = "app.bootstrap.admin.username", defaultValue = "admin") String username; + @Transactional void onStart(@Observes StartupEvent ev) { if (!enabled) { LOG.info("Bootstrap admin disabled (app.bootstrap.admin.enabled=false)"); return; } + // El @Transactional + el toque al EntityManager fuerzan la inicialización + // del EntityManagerFactory (y por lo tanto la corrida del schema-gen) + // ANTES de preguntar `User.count()`. Sin esto, en un H2 fresco el + // SELECT count(*) FROM users se ejecuta antes de que Hibernate haya + // generado la tabla y falla con "Table USERS not found". + em.createNativeQuery("SELECT 1").getSingleResult(); + long count = User.count(); if (count > 0) { LOG.infof("Bootstrap admin skipped: %d users already exist", count); @@ -54,7 +67,6 @@ public class BootstrapAdmin { + "BOOTSTRAP-ADMIN-CHANGE This password MUST be changed on first login via POST /api/auth/change-password\n"; LOG.warn(banner); - // Backup a stdout por si algún pipeline colecta stdout pero no el logger JBoss. System.out.print(banner); System.out.flush(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ec1aa6..cbc6fcb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,6 +10,10 @@ quarkus.datasource.username=sa quarkus.datasource.password= quarkus.hibernate-orm.database.generation=update quarkus.hibernate-orm.log.sql=false +# En Quarkus native, el schema-gen NO corre en startup por defecto en prod. +# Sin esto, `update` mode no crea las tablas en un H2 fresco y el primer +# `User.count()` en BootstrapAdmin falla con "Table USERS not found". +quarkus.hibernate-orm.schema-management.run-on-startup=true # JWT mp.jwt.verify.issuer=shot-crafter-calculator