【发布时间】: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 函数,因为它非常简单,我认为这部分不会导致问题。
请注意,上面的代码是实际代码的简化版本,未经测试。
【问题讨论】: