问题描述
在Corda中,我们为可查询状态创建状态模式;例如:
object MyStateSchema {
object MyStateSchemaV1 : MappedSchema(
schemaFamily = MyStateSchema.javaClass,version = 1,mappedTypes = listof(MyStateEntity::class.java)
)
@Entity
@Table(name = "my_states")
class MyStateEntity(
@Column(name = "linear_id",nullable = false)
val linearId: UUID = UUID.randomUUID(),@Column(name = "external_id",nullable = true)
val externalId: String? = null,@Column(name = "identity",nullable = false)
val identity: AbstractParty = NULL_PARTY,@Column(name = "value",nullable = false)
val value: String = ""
) : PersistentState()
}
值得注意的是,MyStateEntity
带有JPA注释。由此,我们需要生成与数据库无关的脚本,以创建和更新数据库模式。例如:
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<changeSet author="Me" id="create-my_states">
<createTable tableName="my_states">
<column name="output_index" type="INT">
<constraints nullable="false"/>
</column>
<column name="transaction_id" type="NVARCHAR(64)">
<constraints nullable="false"/>
</column>
<column name="linear_id" type="uuid">
<constraints nullable="false"/>
</column>
<column name="external_id" type="NVARCHAR(255)" />
<column name="identity" type="NVARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="value" type="NVARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="output_index,transaction_id"
constraintName="PK_my_states"
tableName="my_states"/>
</changeSet>
</databaseChangeLog>
当前,我正在手动编写更改日志,这很累。我相信肯定有更好的方法。我尝试将一些依赖项添加到gradle中,以便可以运行以下命令(不幸的是,该命令不起作用):
./gradlew generateChangeLog
解决方法
就像你说的那样,用手写来写是很累的。
但是,如果在开发时以devMode启动节点,则hibernate将为您生成模式:
java -jar corda.jar --allow-hibernate-to-manage-app-schema
然后您可以下载liquibase发行版并获取liquibase来自动为您生成模式脚本:
./liquibase --driver=org.h2.Driver --changeLogFile=schema.xml --url=jdbc:h2:~/Projects/my-corda-app/build/nodes/ClientName/persistence --username=sa --includeObjects=table:CUSTOM_STATE,table:SECOND_STATE generateChangeLog
这并不完美,因为几乎可以肯定其中没有合适的作者和ID,但是,这样可以避免您从头开始编写所有内容。
我与Corda开了一个问题,试图让他们自动做到。
https://github.com/corda/corda/issues/6813
,对于一个全新的数据库(意味着首次部署节点),我认为手动生成将是最好的方法,因为这些XML文件用于在节点部署期间创建表。此外,这些架构是与您的特定CorDapp相关的自定义架构。因此,我认为自动化意味着需要能够读取CorDapp合同文件夹中的架构文件。但是,我们还没有类似的工具。
我还看到一些帖子在讨论,如果您有一个现有数据库并希望自动生成这些xml文件,那么我认为这是在配置Liquidbase.properties文件并使用pending
命令时。