H2 内存数据库。找不到表

新手上路,请多包涵

我有一个带有 URL "jdbc:h2:test" 的 H2 数据库。我使用 CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64)); 创建一个表。然后我使用 SELECT * FROM PERSON 从这个(空)表中选择所有内容。到目前为止,一切都很好。

但是,如果我将 URL 更改为 "jdbc:h2:mem:test" ,唯一的区别是数据库现在只在内存中,这给了我一个 org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154] 。我可能在这里遗漏了一些简单的东西,但我们将不胜感激。

原文由 Jorn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

DB_CLOSE_DELAY=-1

hbm2ddl 在创建表后关闭连接,因此 h2 将其丢弃。

如果您的连接网址配置如下

jdbc:h2:mem:test

数据库的内容在最后一个连接关闭时丢失。

如果你想保留你的内容,你必须像这样配置 url

 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

如果这样做,只要 vm 存在, h2 就会保留其内容。

注意分号 ( ; ) 而不是冒号 ( : )。

请参阅 功能 页面 的内存数据库 部分。去引用:

默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

原文由 reini2901 发布,翻译遵循 CC BY-SA 4.0 许可协议

我知道这不是你的情况,但我遇到了同样的问题,因为 H2 使用大写名称创建表然后表现出区分大小写,即使在所有脚本(包括创建脚本)中我都使用小写。

通过将 ;DATABASE_TO_UPPER=false 添加到连接 URL 来解决。

原文由 Cristian Vrabie 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题