【问题标题】:H2 in-memory database initialization with data使用数据初始化 H2 内存数据库
【发布时间】:2012-01-04 06:03:17
【问题描述】:

我正在使用 H2 和 Hibernate 来动态生成内存数据库以进行单元测试。 我成功地创建了数据库,一切正常。 但是我有一个问题我不知道如何解决。 我需要在执行测试之前将参考数据加载到数据库中进行测试。 我将这些数据存储为一个 SQL 插入文件,我只需要在实时环境中运行一次,但是,因为每次都从头开始生成数据库,所以我需要弄清楚如何在运行时插入数据。 数据很简单,就是国家列表、州列表等。 最好的方法是什么?

顺便说一句,一切都在 Spring 框架下运行。

【问题讨论】:

    标签: java hibernate spring h2


    【解决方案1】:

    对于您的测试,您可以在创建连接时执行初始化脚本。

    http://www.h2database.com/html/features.html#execute_sql_on_connection

    【讨论】:

    • 我正在尝试做类似的事情,但我有一个 ~300MB 的持久数据库,有很多索引。将其转换为 SQL 语句并对其进行初始化将非常缓慢。有没有办法从二进制数据库本身初始化?
    • @HRJ 在内部,我们使用保存在 jar 文件中的 hsqldb 数据库。但是我没有用如此大量的数据对其进行测试。
    【解决方案2】:

    从问题标签中我看到您正在使用 Hibernate。您可以将名为“import.sql”的文件添加到您的类路径(即,如果您使用 Maven 项目布局,则在 src/main/resources 中)。

    From Spring documentation

    此外,类路径根目录中名为 import.sql 的文件将 如果 Hibernate 从头开始​​创建模式,则在启动时执行 (也就是说,如果 ddl-auto 属性设置为 create 或 create-drop)。 如果你小心的话,这对于演示和测试很有用,但是 可能不是您希望在生产中的类路径上出现的东西。 这是一个 Hibernate 特性(与 Spring 无关)。

    【讨论】:

    • 而且由于有些人现在可能知道它,如果您还没有“控制台”H2 端点来管理数据库,您可以将属性 spring.h2.console.enabled=true 添加到您的 .properties(或.yml) 文件,您将能够访问端点“h2-console”。对于内存数据库,您必须将“JDBC URL”更改为jdbc:h2:mem:testdb。无需密码,只需点击“连接”即可。我写这篇文章是因为我发现当我的初始化查询失败时查看数据库的结构很有用。
    • P.S.:我建议阅读该文档,而不是仅仅停留在这个答案上。例如,我实际上需要将文件命名为“data.sql”而不是“import.sql”。
    猜你喜欢
    • 2010-12-29
    • 2018-03-22
    • 2019-03-08
    • 2021-10-06
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2019-03-27
    相关资源
    最近更新 更多