更改架构文件名后的Corda SQLGrammarException

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

我曾经将我的PersistentState放在单独的文件中,这在节点启动时引起很多警告:

! ATTENTION: Cross-reference between MappedSchemas 'DealSchemaV1' and 
'CompanySchemaV1'. MappedSchema 'SharedDealSchemaV1' entity 
'PersistentSharedDealParticipant' field 'invitedBy' is of type 
'PersistentPartyAndCompany' defined in another MappedSchema 
'CompanySchemaV1'. This may cause issues when evolving MappedSchema or 
migrating its data, ensure JPA entities are defined within the same 
enclosing MappedSchema.

因此,我决定将它们全部移动到一个封闭文件中。其他所有内容均未更改,所有表名,列名等都相同,唯一更改的是PersistentStates的位置。

否,当我运行该节点时,我没有看到任何警告,但是当我尝试创建一个在持久性数据库中记录某些内容的状态时,出现此错误:

aused by: org.h2.jdbc.JdbcSQLException: Column "SCHEMAV1$PERSISTENTCOMPANY_OUTPUT_INDEX" not found; SQL statement:
insert into Company_CompanyRole (SchemaV1$PersistentCompany_output_index, SchemaV1$PersistentCompany_transaction_id, roles_database_id) values (?, ?, ?) [42122-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.table.Table.getColumn(Table.java:682) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parseColumn(Parser.java:936) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parseColumnList(Parser.java:920) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parseInsertGivenTable(Parser.java:1258) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parseInsert(Parser.java:1222) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parsePrepared(Parser.java:431) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parse(Parser.java:335) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.parse(Parser.java:307) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.command.Parser.prepareCommand(Parser.java:278) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.engine.Session.prepareLocal(Session.java:611) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.engine.Session.prepareCommand(Session.java:549) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76) ~[h2-1.4.197.jar:1.4.197]
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:304) ~[h2-1.4.197.jar:1.4.197]
    at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:310) ~[HikariCP-2.5.1.jar:?]
    at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-2.5.1.jar:?]
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:78) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:136) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:125) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1314) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454) ~[hibernate-core-5.3.6.Final.jar:5.3.6.Final]
    ... 30 more

当我使用干净的DB进行干净运行时,不会出现此错误。

如何解决此错误?我应该进行数据库迁移吗?我以为,如果我不更改表/列名称/类型中的任何内容,则不必进行迁移。

hibernate jpa corda
1个回答
0
投票

我认为您已经在使用旧模式创建了某些状态之后尝试更改模式。这可能是问题的原因。现在,CorDapp正在尝试使用新架构查看数据库,并找到了另一个架构。因此,它会产生一个错误。

就实现模式而言,您可以执行此操作

像这样的多合一:https://github.com/corda/samples-kotlin/blob/master/Features/queryableState-carinsurance/contracts/src/main/kotlin/net/corda/samples/schema/InsuranceSchemaV1.kt

[https://github.com/corda/samples-java/tree/master/Features/queryablestate-carinsurance/contracts/src/main/java/net/corda/examples/carinsurance/schema之类的分隔文件。

它们实际上是相同的。

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