繁体   English   中英

H2 数据库与 Hibernate 错误导致:org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:唯一索引或主键

[英]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 使用简单的 map 变量,例如: 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'附加到 JDBC 连接 URL。 错误的约束将记录到您的侦听器中。 之后,您将能够使用SCRIPT TO 'filename.sql'命令将数据库导出到 SQL 脚本,并创建一个新的数据库文件并使用RUNSCRIPT FROM 'filename.sql'使用该脚本填充它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM