【问题标题】:One-to-Many custom schema mapping in Corda PersistenceCorda Persistence 中的一对多自定义模式映射
【发布时间】:2018-08-09 10:49:33
【问题描述】:

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

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

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

org.hibernate.MappingException: 外键 (child_table [parent]) 必须相同 作为引用主键的列数(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 函数,因为它非常简单,我认为这部分不会导致问题。

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

【问题讨论】:

    标签: hibernate corda


    【解决方案1】:

    您的代码片段建议您有两个模式 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()
    

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多