具有 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'
.
脚本填充它
我在启动服务器时收到 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'
.