具有 Hibernate 错误的 H2 数据库 Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key

H2 Database with Hibernate error Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key

我在启动服务器时收到 JdbcSQLIntegrityConstraintViolationException 异常。

似乎在使用 <map> 时出现了一些问题,之前它可以使用旧版本的 H2 文件,但现在不工作了。

我当前的 H2 版本是:

implementation group: 'com.h2database', name: 'h2', version: '1.4.200'

年长的是:

compile group: 'com.h2database', name: 'h2', version: '1.4.193'

我的 class 使用简单的地图变量,例如:private Map<String, String> extraData;

谁能告诉我,如何解决这个问题??? 谢谢

这是我的 XML 片段:

  <class name="pojo.MachineInstruction" >
    <id name="machineId" type="java.lang.Integer"/>
    <!--Time stamp is auto generated. No need to set the value..-->
    <timestamp name="timestamp"/>
    <property name="instructionType" not-null="true">
      <type name="org.hibernate.type.EnumType">
        <param name="enumClass">pojo.MachineInstructionType</param>
      </type>
    </property>
    <property name="instructionStatus" not-null="true">
      <type name="org.hibernate.type.EnumType">
        <param name="enumClass">pojo.MachineInstructionStatus</param>
      </type>
    </property>
    <property name="version" type="java.lang.String"/>
    <map name="extraData" cascade="all">
      <key column="extraData" />
      <map-key type="text" column="key"/>
      <element type="text" column="value"/>
    </map>
  </class>
Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PRIMARY KEY ON """".PAGE_INDEX"; SQL statement:
ALTER TABLE PUBLIC.MACHINEINSTRUCTION_EXTRADATA ADD CONSTRAINT PUBLIC.FKROHO504EJPG9G4R81YYKTV44K FOREIGN KEY(EXTRADATA) REFERENCES PUBLIC.MACHINEINSTRUCTION(MACHINEID) NOCHECK [23505-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:459)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.pagestore.db.PageDataIndex.add(PageDataIndex.java:125)
at org.h2.pagestore.PageStore.addMeta(PageStore.java:1804)
at org.h2.pagestore.db.PageBtreeIndex.<init>(PageBtreeIndex.java:65)
at org.h2.pagestore.db.PageStoreTable.addIndex(PageStoreTable.java:183)
at org.h2.command.ddl.AlterTableAddConstraint.createIndex(AlterTableAddConstraint.java:298)
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:223)
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:78)
at org.h2.engine.MetaRecord.execute(MetaRecord.java:60)
at org.h2.engine.Database.open(Database.java:759)
at org.h2.engine.Database.openDatabase(Database.java:307)
at org.h2.engine.Database.<init>(Database.java:301)
at org.h2.engine.Engine.openSession(Engine.java:74)
at org.h2.engine.Engine.openSession(Engine.java:192)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171)
at org.h2.engine.Engine.createSession(Engine.java:166)
at org.h2.engine.Engine.createSession(Engine.java:29)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152)
at org.h2.Driver.connect(Driver.java:69)
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
... 35 more

不幸的是,H2 1.4.* 和更早的版本没有自动升级程序,这是由用户负责的。 https://h2database.com/html/tutorial.html#upgrade_backup_restore

(即将推出的H2 2.0将内置升级实用程序,将拒绝打开未升级的旧文件以避免此类问题。)

1.4.196 及更早版本在某些索引和引用约束组合方面存在错误,已在 1.4.197 中修复,但未提供旧版 PageStore 引擎的升级路径。 MVStore 也有类似的升级问题,但已修复。

目前您的数据库似乎已损坏,因为未执行升级。您需要编写一些 org.h2.api.DatabaseEventListener 的虚拟实现,将其放入应用程序的类路径(如果您使用单独的 H2 服务器进程,则为服务器的类路径),然后在 [=] 后附加 ;DATABASE_EVENT_LISTENER='path.to.YourListener' 打开数据库23=]连接URL。错误的约束将记录到您的侦听器中。之后,您将能够使用 SCRIPT TO 'filename.sql' 命令将数据库导出到 SQL 脚本,并创建一个新的数据库文件并使用 RUNSCRIPT FROM 'filename.sql'.

脚本填充它