【问题标题】:How to add the mode=mysql to embedded H2 DB in Spring Boot 1.4.1 for @DataJpaTest?如何在 Spring Boot 1.4.1 中为 @DataJpaTest 添加 mode=mysql 到嵌入式 H2 DB?
【发布时间】:2017-07-10 22:26:16
【问题描述】:

在执行 junit 测试时,我在使用 schema.sql 文件创建我的 sql 模式时遇到了一些问题,而该模式包含 mysql 特定的表达式。我必须将mode=mysql 添加到 H2 网址。

例如这样的: jdbc:h2:mem:testd;MODE=MYSQL

但是Spring boot会自动使用枚举中定义的url org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection 及其 url

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE.

我已经尝试过类似的方法来让它工作,但是 spring 没有从我的 test-application.properties 中获取spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL。我的 test-application.properties 中的所有其他设置均已成功读取。

如果我让 spring/hibernate 在我的实体中使用 javax.persistence 注释创建模式(没有 schema.sql 文件),一切正常。

有没有简单的添加模式的方法?

【问题讨论】:

    标签: java mysql hibernate spring-boot h2


    【解决方案1】:

    您需要在 h2 上设置 MYSQL 模式并禁用替换嵌入式数据库的数据源 url:

    修改application-test.yaml

    spring:
      datasource:
        url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;MODE=MYSQL  
      test:
        database:
          replace: NONE
    

    【讨论】:

      【解决方案2】:

      我可以用这个配置运行它:

      # for integration tests use H2 in MySQL mode
      spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;MODE=MySQL;
      spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
      

      这里的主要技巧是强制 Hibernate 为 MariaDB 方言生成 SQL 脚本,否则 Hibernate 会尝试使用 H2 方言,而 H2 已经在等待类似 MySQL 的命令。

      我还尝试为 MariaDB 10.3 使用更新鲜的 MariaDB103Dialect,但它不能正常工作。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题。运行测试时它不会获取 url。我正在使用 flyway 来管理我的脚本。通过以下几个步骤,我能够让所有这些一起工作。

        在 src/test/resources/db/migration 中创建了 V1_init.sql 脚本,使其成为 flyway 运行的第一个脚本。

        SET MODE MYSQL; /* another h2 way to set mode */
        
        CREATE SCHEMA IF NOT EXISTS "public"; /* required due to issue with flyway --> https://stackoverflow.com/a/19115417/1224584*/
        

        更新了 application-test.yaml 以包含架构名称 public:

        flyway:
          schemas: public
        

        确保测试指定配置文件:@ActiveProfiles("test")

        【讨论】:

          【解决方案4】:

          设置

          spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
          

          在 application-test.properties 中,加上

          @RunWith(SpringRunner.class)
          @DataJpaTest
          @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
          @ActiveProfiles("test")
          

          在测试课上

          【讨论】:

            【解决方案5】:

            我已经尝试过类似的方法来让它工作,但是 spring 没有从我的 test-application.properties 中获取 spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL

            您是否尝试附加此参数而不是重写现有参数?

            spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
            

            我的 test-application.properties 中的所有其他设置均已成功读取。

            我认为该文件应该命名为application-test.properties

            【讨论】:

              猜你喜欢
              • 2016-05-05
              • 2019-03-30
              • 2020-10-23
              • 2021-02-23
              • 2018-01-11
              • 2018-06-13
              • 1970-01-01
              • 2017-02-03
              • 2019-09-30
              相关资源
              最近更新 更多