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