Corda持久性中的一对多自定义模式映射



在Corda持久性中,如何编写一个模式来将嵌套对象的数组映射为父对象中的子对象?

我正在 https://docs.corda.net/api-persistence.html 查看此文档,并设法创建了映射到数据库中列的状态对象的简单非嵌套属性。但是,它仍然不适用于将对象作为子对象列出。

当前代码如下所示,并且正在抛出错误。什么是output_index列和transaction_id列?

org.hibernate.MappingException:外键(child_table [父](必须具有相同的 作为引用的主键的列数 (parent_table [output_index,transaction_id](

package com.template
import net.corda.core.identity.AbstractParty
import net.corda.core.schemas.MappedSchema
import net.corda.core.schemas.PersistentState
import net.corda.core.serialization.CordaSerializable
import javax.persistence.*

object TestSchema
@CordaSerializable
object ChildSchemaV1 : MappedSchema(schemaFamily = TestSchema.javaClass, version = 1, mappedTypes = listOf(PersistentChild::class.java)) {
    @Entity
    @Table(name = "child_table",
            indexes = arrayOf(Index(name = "id_child_idx", columnList = "child_id")))
    class PersistentChild(
            @Column(name = "child_id")
            var childId: Int,
            @ManyToOne 
            var parent: ParentSchemaV1.PersistentParent
    ) : PersistentState() {
        constructor() : this(0, ParentSchemaV1.PersistentParent())
    }
}
@CordaSerializable
object ParentSchemaV1 : MappedSchema(schemaFamily = TestSchema.javaClass, version = 1, mappedTypes = listOf(PersistentParent::class.java)) {
    @Entity
    @Table(name = "parent_table",
            indexes = arrayOf(Index(name = "id_idx", columnList = "id")))
    class PersistentParent(   
            @Column(name = "id", length = 100)
            var id: String,
            @OneToMany(mappedBy="parent")
            var children: List<ChildSchemaV1.PersistentChild>
    ) : PersistentState() {
        constructor() : this("", ArrayList<ChildSchemaV1.PersistentChild>())
    }
}

这里不包括 Corda 状态下的 generateMappedObject 函数,因为它非常简单,我认为该部分不会引起问题。

请注意,上面的代码是实际代码的简化版本,尚未经过测试。

您的代码片段表明您有两个模式 ChildSchemaV1 和 ParentSchemaV1 用于同一个 Corda 状态(很想知道您如何在您的状态中映射这些架构(。建议对特定状态使用单个模式。

同样在子级到父级的关系映射中

        @ManyToOne 
        var parent: ParentSchemaV1.PersistentParent

请改用下面的代码片段,其中它映射到状态,因为联接列必须为 output_index,transaction_id因为这些是持久状态的主键

        @ManyToOne 
        var cordaStateVar: CordaSate

从Corda官方网站查看以下完整代码。

@CordaSerializable
object SchemaV1 : MappedSchema(schemaFamily = Schema::class.java, version = 1, 
mappedTypes = listOf(PersistentParentToken::class.java, 
PersistentChildToken::class.java)) {
@Entity
@Table(name = "parent_data")
class PersistentParentToken(
        @Column(name = "owner")
        var owner: String,
        @Column(name = "issuer")
        var issuer: String,
        @Column(name = "amount")
        var currency: Int,
        @Column(name = "linear_id")
        var linear_id: UUID,
         @JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index"))
        var listOfPersistentChildTokens: MutableList<PersistentChildToken>
) : PersistentState()
@Entity
@CordaSerializable
@Table(name = "child_data")
class PersistentChildToken(
        @Id
        var Id: UUID = UUID.randomUUID(),
        @Column(name = "owner")
        var owner: String,
        @Column(name = "issuer")
        var issuer: String,
        @Column(name = "amount")
        var currency: Int,
        @Column(name = "linear_id")
        var linear_id: UUID,
        @ManyToOne(targetEntity = PersistentParentToken::class)
        var persistentParentToken: TokenState
) : PersistentState()

最新更新