【问题标题】:Why is my h2 database empty every time my Spring Boot application starts?为什么我的 Spring Boot 应用程序每次启动时我的 h2 数据库都是空的?
【发布时间】:2020-11-16 15:05:06
【问题描述】:

我在一个带有 spring-boot-starter-data-jpa 依赖项的 maven 项目中使用 spring boot。

在我的 application.yml 文件中,我有:

spring.datasource.url: jdbc:h2:./data;DB_CLOSE_ON_EXIT=FALSE

我还有一个 DataPopulation 类:

if (userRepository.findAll().iterator().hasNext()) {
  // Database already has users..
}

其中 userRepository 是 CrudRepository 实例。

在每次启动时,无论应用程序上次运行时添加了多少用户,userRepository 都不会返回任何用户。

我可以看到 data.mv.db 和 data.trace.db 文件是创建的并且不是空的。

为什么我的数据库在启动时总是空的?我错过了什么?

【问题讨论】:

    标签: java spring-boot hibernate jpa h2


    【解决方案1】:

    ./data 路径让我觉得每次构建应用程序时数据库都会被删除,因为. 表示当前目录。因此,您可以使用与您的用户主文件夹相关的数据库文件,由~ 表示:~/data。您可能还想在 JDBC URL 中使用 :file

    spring.datasource.url: jdbc:h2:file:~/data;DB_CLOSE_ON_EXIT=FALSE
    

    如果需要,请查看 H2 features documentation

    【讨论】:

    • 我尝试使用 ~ 代替。我可以看到该文件现在已在我的用户目录中创建。但是,应用程序行为是相同的。未找到用户。
    【解决方案2】:

    你需要以这种形式声明url:

    jdbc:h2:file:<dbpath>
    

    例子

    jdbc:h2:file:/opt/db/mydb
    

    保存您的数据。

    【讨论】:

    • 我不确定 Hibernate,但 jdbc:h2:./datajdbc:h2:file:./data 在 H2 中具有完全相同的含义。
    • 我已经尝试过使用和不使用文件:jdbc 字符串中的位。两种情况下的行为是相同的。
    • 感谢老兄的帮助
    【解决方案3】:

    我的 jdbc 字符串没有任何问题。 Spring boot 使用 'create-drop' 作为默认的休眠 ddl-auto 值。

    我通过添加解决了这个问题:

    spring.jpa.hibernate.ddl-auto=update

    到我的财产。

    【讨论】:

    • 感谢您发布解决方案。快速解决我 =)
    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多