Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

426
Vistas
Cómo inicializar datos en JPA, solo si se genera el esquema

Buen día,

Estoy trabajando para cambiar mi aplicación Java de usar postgres a una base de datos integrada. Me gustaría que la aplicación se implemente con un conjunto inicial de datos en la base de datos. En el pasado, durante la instalación, ejecuté un script sql para generar completamente el esquema e insertar los datos en mis tablas.

Idealmente (porque realmente no quiero averiguar cómo conectarme a la base de datos integrada para generarla), quiero dejar que JPA cree mi esquema por primera vez, y cuando lo haga, quiero poder ejecutar mi SQL para insertar los datos.

Mi búsqueda ha revelado las propiedades obvias de hibernación y JPA que permiten la ejecución de un script SQL.

En primer lugar, descubrí que cuando usaba "hibernate.hbm2ddl.auto" puede definir un archivo import.sql, esto me hizo muy feliz por un día hasta que me di cuenta de que solo funciona con crear y no con actualizar. Mi aplicación cuando usaba postgres tenía este conjunto para actualizar. Y lo que realmente me gustaría es que sepa si tuvo que crear el esquema y si luego ejecutó import.sql. Sin embargo, no hay alegría.

Luego pasé a usar "javax.persistence.schema-generation.database.action" configurado para "crear". " la especificación dice "crear"

El proveedor creará los artefactos de la base de datos en la implementación de la aplicación. Los artefactos permanecerán sin cambios después de la redistribución de la aplicación.

Esto me llevó a creer que haría exactamente lo que quería, solo crear las tablas "en la implementación de la aplicación", sin embargo, cuando ejecuté mis pruebas usando esto, cada prueba (creando un nuevo contexto de primavera) intentó simplemente crear todas las tablas nuevamente y obviamente falló, lo que me hizo darme cuenta de que la implementación de la aplicación no significaba lo que pensaba que significaba (una ilusión) y ahora me doy cuenta de que JPA ni siquiera parece tener un equivalente de la propiedad de "actualización" de Hibernates, por lo que siempre va a generar el ¿mesas?

Lo que quiero es tener mis tablas y datos generados cuando activas la aplicación por primera vez y para ejecuciones posteriores saber que los datos están ahí y usarlos, supongo que es demasiado esperar que esto exista, pero estoy seguro que esto debe ser un requisito común? Entonces, mi pregunta es cuál es la forma general recomendada para lograr el objetivo de permitir que JPA cree mi esquema pero poder insertar algunos datos en una base de datos que persiste entre ejecuciones.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La respuesta es ruta migratoria . Es una biblioteca de migración de base de datos, y si está utilizando Spring Boot, se integra a la perfección, con Spring normal debe crear un bean, que obtiene una referencia al grupo de conexiones, crea una conexión y realiza la migración.

Flyway crea una tabla para realizar un seguimiento de qué secuencias de comandos ya se han aplicado a la base de datos, y las secuencias de comandos son simplemente parte de los recursos.

Normalmente usamos JPA para generar el script inicial. Este script se convierte en V1__initial.sql , si necesitamos agregar algunos datos, podemos agregar V2__addUsers.sql y V3__addCustomers.sql etc.

Más tarde, cuando necesitemos cambiar el nombre de las columnas o agregar tablas adicionales, simplemente agregamos nuevos scripts como parte del archivo War, y cuando la aplicación está cargada, Flyway mira su tabla interna para ver la versión actual y luego aplica cualquier nuevo script a subirlo a la versión deseada.

En Spring el código se vería así

 private void performFlywayMigration(DataSource dataSource) { Flyway flyway = new Flyway(); flyway.setLocations("db/migration"); flyway.setDataSource(dataSource); log.debug("Starting database migration."); flyway.migrate(); log.debug("Database migration completed."); MigrationInfo current = flyway.info().current(); if (current.getState() == MigrationState.FUTURE_SUCCESS) { log.warn("The Database schema is version " + current.getVersion() + ", this application expects version " + flyway.getBaselineVersion().getVersion()); } }

En general, no debe JPA para crear tablas directamente. porque a veces necesita modificar los scripts, por ejemplo, en Sybase Varchar (255) significa 255 bytes, por lo que si está almacenando caracteres Unicode de 2 o 3 bytes, necesita más espacio; la implementación de JPA no tiene en cuenta eso (la última vez que verifiqué ).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda