Saltar al contenido

H2 no crea/actualiza la tabla en mi aplicación Spring Boot. ¿Le pasa algo a mi Entidad?

Te recomendamos que pruebes esta solución en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

Simplemente vaya a la consola H2, por ejemplo en: http://localhost:9090/h2-console/ y en el campo URL de JDBC, escriba jdbc:h2:mem:testdb para configurar la conexión a la base de datos testdb en RAM.

Parece que los datos están vinculados a los parámetros, pero en la consola H2 SELECT * FROM GAME no me devuelve nada. La tabla no existe.

Estás usando un in-memory instancia de H2:

spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

En este modo, no puede ver el contenido de los cambios de otro cliente que inició el in-memory base de datos.
Para ver los cambios de otros clientes, debe usar el modo TCP.

Tienes dos soluciones:

  • utilizando un archivo para conservar la instancia de H2.

¿Dónde se almacenan los archivos de la base de datos?

Cuando se utilizan direcciones URL de bases de datos como jdbc:h2:~/test, la base de datos se almacena en el directorio del usuario. Para Windows, suele ser C:Documents and Settings o C:Users. Si el directorio base no está configurado (como en jdbc:h2:./test), los archivos de la base de datos se almacenan en el directorio donde se inicia la aplicación (el directorio de trabajo actual). Al usar la aplicación H2 Console desde el menú de inicio, este es /bin. El directorio base se puede configurar en la URL de la base de datos. Se puede utilizar una ruta fija o relativa. Cuando se utiliza la URL jdbc:h2:file:./data/sample, la base de datos se almacena en el directorio de datos (en relación con el directorio de trabajo actual). El directorio se crea automáticamente si aún no existe. También es posible utilizar el nombre de directorio completo (y para Windows, el nombre de la unidad). Ejemplo: jdbc:h2:archivo:C:/datos/prueba

  • manteniendo el uso de una instancia en memoria pero usando el modo TCP.

Reemplazar :

spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

por :

spring.datasource.url=jdbc:h2:tcp://localhost/~/test

Generalmente, cambio a este modo durante la prueba de unidad de entidad JPA cuando realmente quiero saber cuál se insertó en la base de datos.

De la documentación oficial:

Bases de datos en memoria

Para ciertos casos de uso (por ejemplo: creación rápida de prototipos, pruebas, operaciones de alto rendimiento, bases de datos de solo lectura), es posible que no sea necesario conservar los datos o conservar los cambios en los datos. Esta base de datos admite el modo en memoria, donde los datos no se conservan. …

En algunos casos, solo se requiere una conexión a una base de datos en memoria. Esto significa que la base de datos que se va a abrir es privada. En este caso, la URL de la base de datos es jdbc:h2:mem: abrir dos conexiones dentro de la misma máquina virtual significa abrir dos bases de datos (privadas) diferentes.

A veces, se requieren varias conexiones a la misma base de datos en memoria. En este caso, la URL de la base de datos debe incluir un nombre. Ejemplo: jdbc:h2:mem:db1. Acceder a la misma base de datos usando esta URL solo funciona dentro de la misma máquina virtual y entorno de cargador de clases.

Para acceder a una base de datos en memoria desde otro proceso o desde otra computadora, debe iniciar un servidor TCP en el mismo proceso que se creó la base de datos en memoria. Luego, los otros procesos necesitan acceder a la base de datos a través de TCP/IP o TLS, utilizando una URL de base de datos como: jdbc:h2:tcp://localhost/mem:db1.


Alternativa a la consola H2 independiente: usando la consola H2 accesible desde la aplicación Spring Boot

De hecho, la base de datos H2 proporciona una consola basada en navegador que Spring Boot puede configurar automáticamente para usted. La consola se configura automáticamente cuando se cumplen estas condiciones:

  • Está desarrollando una aplicación web basada en servlet.
  • com.h2database:h2 está en el classpath.
  • Está utilizando las herramientas de desarrollo de Spring Boot.

Entonces significa que solo será accesible en dev. Lo que generalmente quieres.

Por defecto, la consola está disponible en /h2-console.
Selecciona el spring.h2.console.path propiedad para cambiar eso.

Compruebe si su clase principal (clase de aplicación de arranque Spring) puede escanear las entidades definidas. Esto suele suceder cuando las entidades están en un paquete diferente al de la clase principal.

Si para ti ha sido de provecho este artículo, sería de mucha ayuda si lo compartes con más entusiastas de la programación así contrubuyes a extender esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *