【问题标题】:Corda SQLGrammarException after changing the Schema file name更改架构文件名后的 Corda SQLGrammarException
【发布时间】:2020-01-29 15:26:39
【问题描述】:

我曾经将我的PersistentStates 放在单独的文件中,这导致节点启动时出现很多警告:

! 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.

所以我决定将它们全部移动到一个封闭文件中。没有其他任何改变,所有表名、列名等一切都一样,唯一改变的是PersistentStatess 的位置。

没有,当我运行节点时,我看不到任何警告,但是当我尝试创建一个在 Persistent DB 中记录某些内容的状态时,我收到此错误:

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

当我使用干净的数据库进行干净运行时,我没有收到此错误。

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

【问题讨论】:

    标签: hibernate jpa corda


    【解决方案1】:

    我认为您在使用旧架构创建了一些状态后尝试更改架构。这可能是问题的原因。 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

    它们几乎是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多