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

Hibernate Corda持久化中的一对多自定义模式映射,hibernate,corda,Hibernate,Corda,在Corda持久化中,如何编写模式以将嵌套对象数组映射为父对象中的子对象 我正在查看此文档,并设法创建映射到数据库中列的状态对象的简单、非嵌套属性。但是,它仍然不适用于作为子对象的列表对象 当前代码读取以下内容,并抛出错误。什么是输出索引和事务id列 org.hibernate.MappingException:外键(子表[父])必须具有相同的 作为引用主键的列数(父表 [输出索引,事务id]) package com.template 导入net.corda.core.identity.Abs

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

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

当前代码读取以下内容,并抛出错误。什么是输出索引和事务id列

org.hibernate.MappingException:外键(子表[父])必须具有相同的 作为引用主键的列数(父表 [输出索引,事务id])

package com.template
导入net.corda.core.identity.AbstractParty
导入net.corda.core.schemas.MappedSchema
导入net.corda.core.schemas.PersistentState
导入net.corda.core.serialization.CordaSerializable
导入javax.persistence*
对象测试模式
@可互换
对象ChildSchemaV1:MappedSchema(schemaFamily=TestSchema.javaClass,version=1,mappedTypes=listOf(PersistentChild::class.java)){
@实体
@表(name=“child\u Table”,
Index=arrayOf(Index(name=“id\u child\u idx”,columnList=“child\u id”))
类PersistentChild(
@列(name=“child\u id”)
var childId:Int,
@许多酮
变量父级:ParentSchemaV1.PersistentParent
):PersistentState(){
构造函数():此(0,ParentSchemaV1.PersistentParent())
}
}
@可互换
对象ParentSchemaV1:MappedSchema(schemaFamily=TestSchema.javaClass,version=1,mappedTypes=listOf(PersistentParent::class.java)){
@实体
@表(name=“parent\u Table”,
Index=arrayOf(Index(name=“id\u idx”,columnList=“id”))
类PersistentParent(
@列(name=“id”,长度=100)
变量id:String,
@OneToMany(mappedBy=“家长”)
变量子项:列表
):PersistentState(){
构造函数():此(“,ArrayList())
}
}
这里不包括Corda状态下的generateMappedObject函数,因为它非常简单,我认为这部分并没有引起问题


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

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

也在子对象到父对象的关系映射中

        @ManyToOne 
        var parent: ParentSchemaV1.PersistentParent
相反,请使用下面的代码段将其映射到状态,因为连接列必须是output\u index、transaction\u 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()
@cordaseriable
对象SchemaV1:MappedSchema(schemaFamily=Schema::class.java,版本=1,
mappedTypes=listOf(PersistentParentToken::class.java,
PersistentChildToken::class.java){
@实体
@表(name=“父项数据”)
类PersistentParentToken(
@列(name=“owner”)
var所有者:字符串,
@列(name=“发卡机构”)
var发行者:字符串,
@列(name=“amount”)
风险值货币:整数,
@列(name=“linear\u id”)
变量线性_id:UUID,
@JoinColumns(JoinColumn(name=“transaction\u id”,referencedColumnName=“transaction\u id”),JoinColumn(name=“output\u index”,referencedColumnName=“output\u index”))
var listOfPersistentChildTokens:MutableList
):PersistentState()
@实体
@可互换
@表(name=“child\u数据”)
类PersistentChildToken(
@身份证
变量Id:UUID=UUID.randomUUID(),
@列(name=“owner”)
var所有者:字符串,
@列(name=“发卡机构”)
var发行者:字符串,
@列(name=“amount”)
风险值货币:整数,
@列(name=“linear\u id”)
变量线性_id:UUID,
@ManyTone(targetEntity=PersistentParentToken::class)
var persistentParentToken:TokenState
):PersistentState()
@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()