H2错误或将表从PascalCase重命名为snake_case

时间:2017-12-30 11:55:02

标签: spring-boot h2 integration-testing

我在项目中使用spring boot。我有liquibase脚本来创建表并输入种子数据。 repo测试使用@DataJpaTest注释运行,该注释默认使用内存中的h2数据库。

此项目的db最初是SQLServer,因此liquibase脚本在PascalCase中具有表名,例如FooBar的。之后db必须更改为PostgreSQL,因此添加了新的liquibase脚本以重命名为从PascalCase到snake_case的表格,例如从FooBar到foo_bar。

liquibase脚本针对PostgreSQL数据库成功运行,但当它们作为repo测试的一部分运行时(针对H2 db),重命名脚本失败。尝试使用单个词重命名表名时,它们会失败,例如从卖淫到机构。我收到以下错误:

Caused by: org.h2.jdbc.JdbcSQLException: Table "INSTITUTION" already exists; SQL statement:
ALTER TABLE PUBLIC.Institution RENAME TO institution [42101-196]  

我已尝试并失败的解决方案:

  1. src / test / resources中一个单独的application.properties文件,指向自定义内存中的h2数据库,如下所示:

    spring.datasource.url = jdbc:h2:mem:test; DB_CLOSE_ON_EXIT = FALSE; MODE = PostgreSQL spring.datasource.username = sa spring.datasource.password = sa spring.datasource.driverClassName = org.h2.Driver

  2. 我还试图在liquibase脚本中用双引号提及表名,认为它会保留这种情况。没用?

  3. 请帮忙! :(

1 个答案:

答案 0 :(得分:1)

H2将您的不带引号的表名引用转换为大写。如果您使用双引号引用目标名称:

onResponderMove

...会将PanResponder表重命名为PanResponder

您的JPA实现可能必须配置为引用此处的表名。使用hibernate,您可以使用panResponder.panHandlers