h2 数据库唯一索引名称的解决方法

问题描述 投票:0回答:1

我有一个java应用程序,它使用Liquibase进行迁移,到目前为止一直在使用MySQL来运行测试用例。

我想使用 h2 数据库运行测试用例。为此,我对 JDBC 配置进行了必要的更改。但是当我运行

mvn test
时,出现以下错误:

索引“idx_workflow_id”已存在; SQL语句:

在调试时,我发现两个表具有相同名称的索引:

idx_workflow_id
,并且 h2 数据库具有数据库中具有唯一索引名称的一些限制。

现在的问题是数据库结构已经存在于 staging 和 prod 中,并且无法更改索引名称。

有什么方法可以运行 h2 数据库的迁移,而不创建索引或忽略它们。或者进行一些配置更改,这将允许数据库中具有相同名称的索引。

配置:

database:
    driverClass: org.h2.Driver
    url: "jdbc:h2:mem:my_db;MODE=MySQL;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;DB_CLOSE_DELAY=-1"
    maxWaitForConnection: 1s
    minSize: ${MIN_DB_CONNECTIONS:-10}
    maxSize: ${MAX_DB_CONNECTIONS:-100}
    defaultTransactionIsolation: READ_COMMITTED
    checkConnectionWhileIdle: false
    checkConnectionOnBorrow: true
    checkConnectionOnConnect: true
    validationQuery: "SELECT 1"
    properties:
      hibernate.dialect: org.hibernate.dialect.H2Dialect
      hibernate.show_sql: false
      hibernate.hbm2ddl.auto: none
      hibernate.session.events.log: false
      hibernate.generate_statistics: true
      org.hibernate.stat: INFO
      charSet: UTF-8
java mysql indexing h2 unique-constraint
1个回答
0
投票

我遇到了同样的问题,我发现了这个问题,所以我可以分享我的解决方法。

我发现的唯一方法是忽略在 h2 上下文中使用

dbms="!h2"

创建索引的更改集
    <changeSet id="index-creation" author="ffex" dbms="!h2">
        <createIndex ... />
    </changeSet>

现在你有两个选择:

  1. 为 h2 上下文创建一个具有不同名称的索引的变更集:
    <changeSet id="index-creation-test" author="ffex" dbms="h2">
        <createIndex ... />
    </changeSet>
  1. 通过删除索引创建变更集并在每个上下文中创建索引。我选择这个是因为如果主上下文和测试上下文中的数据库相同,会更简单。
    <changeSet id="index-drop" author="ffex" dbms="!h2">
        <dropIndex ... />
    </changeSet>
    <changeSet id="index-creation-new" author="ffex">
        <createIndex ... />
    </changeSet>

您还可以使用属性

contextFilter
来控制上下文中变更集的执行。

© www.soinside.com 2019 - 2024. All rights reserved.