Base de datos H2 en memoria. Tabla no encontrada
Tengo una base de datos H2 con URL "jdbc:h2:test"
. Creé una tabla con el siguiente código
CREATE TABLE PERSON (
ID INT PRIMARY KEY,
FIRSTNAME VARCHAR(64),
LASTNAME VARCHAR(64)
);
Luego selecciono todo de esta tabla (vacía) SELECT * FROM PERSON
. Hasta ahora, todo bien.
Sin embargo, si cambio la URL a "jdbc:h2:mem:test"
, la única diferencia es que la base de datos ahora está solo en la memoria, lo que genera este error.
org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL
statement: SELECT * FROM PERSON [42102-154]
Probablemente me esté perdiendo algo simple aquí, pero agradecería cualquier ayuda.
DB_CLOSE_DELAY=-1
hbm2ddl cierra la conexión después de crear la tabla, por lo que h2 la descarta.
Si tienes tu URL de conexión configurada así
jdbc:h2:mem:test
el contenido de la base de datos se pierde en el momento en que se cierra la última conexión.
Si quieres conservar tu contenido tienes que configurar la URL así
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
Si lo hace, h2 mantendrá su contenido mientras viva la máquina virtual .
Observe el punto y coma ( ;
) en lugar de los dos puntos ( :
).
Consulte la sección Bases de datos en memoria de la página Funciones . Citar:
De forma predeterminada, cerrar la última conexión a una base de datos cierra la base de datos. Para una base de datos en memoria, esto significa que el contenido se pierde. Para mantener la base de datos abierta, agréguela
;DB_CLOSE_DELAY=-1
a la URL de la base de datos. Para mantener el contenido de una base de datos en memoria mientras la máquina virtual esté activa, utilicejdbc:h2:mem:test;DB_CLOSE_DELAY=-1
.
Sé que este no era tu caso, pero tuve el mismo problema porque H2 estaba creando las tablas con nombres en MAYÚSCULAS y luego distinguía entre mayúsculas y minúsculas, aunque en todos los scripts (incluidos los de creación) usé minúsculas.
Resuelto agregando ;DATABASE_TO_UPPER=false
a la URL de conexión.