从Corda状态模式生成Liquibase更改日志

问题描述

在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

liquibase可以自动生成这些脚本吗?

解决方法

就像你说的那样,用手写来写是很累的。

但是,如果在开发时以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命令时。