Corda Persistence中的一对多自定义模式映射

时间:2018-03-01 11:15:37

标签: hibernate corda

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

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

当前代码在下面读到,它正在抛出错误。什么是output_index和transaction_id列?

  

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

{{1}}
此处不包括Corda状态的

generateMappedObject函数,因为它非常简单,我不认为该部分导致问题。

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

1 个答案:

答案 0 :(得分:0)

您的代码段建议您针对同一单个Corda State具有两个模式ChildSchemaV1和ParentSchemaV1(好奇地知道如何在状态中映射这些模式)。建议将单个模式用于特定状态。

也在孩子到父母的关系映射中

        @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()