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

3
在 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能否自动生成这些脚本呢?

  • 这个有用吗?虽然我没有尝试过:https://dev59.com/AlsV5IYBdhLWcg3w2h4s#35721103 - Alessandro Baffa
    2个回答

    2

    就像你说的一样,手写代码很繁琐。

    但是,在开发时如果启动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


    0
    对于全新的数据库(即第一次部署节点),我认为手动生成是最好的方法,因为这些 XML 文件用于在节点部署期间创建表。此外,这些模式是与您特定的 CorDapp 相关的自定义模式。因此,我认为自动化意味着需要能够读取 CorDapp 合同文件夹中的模式文件。然而,我们还没有类似的工具。
    我还看到一些帖子讨论,如果您有现有的数据库并希望自动生成这些 XML 文件,则可以配置 liquidbase.properties 文件并使用 generateChangeLog 命令。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接