Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Corda:如何实现持久化到H2的状态数据之间的层次关系_Hibernate_Jpa_H2_Corda - Fatal编程技术网

Hibernate Corda:如何实现持久化到H2的状态数据之间的层次关系

Hibernate Corda:如何实现持久化到H2的状态数据之间的层次关系,hibernate,jpa,h2,corda,Hibernate,Jpa,H2,Corda,摘要 我已经将基本的令牌发布Corda Bootcamp应用程序修改为演示这个问题。我想在TokenState和TokenChildren之间创建一个双向映射,其中关系是一对多 保存分层数据的最佳实践是什么?是否可以在状态模式中使用JPA注释来实现这一点 我有一个状态-TokenState,它包含一些任意数据以及类为TokenChild的对象的集合。此列表的目的是促进H2中记录之间的一对多关系。该州的关联模式具有相应的JPA注释(@OneToMany和@ManyToOne-请参阅下面的代码片段)

摘要

我已经将基本的令牌发布Corda Bootcamp应用程序修改为演示这个问题。我想在TokenState和TokenChildren之间创建一个双向映射,其中关系是一对多

保存分层数据的最佳实践是什么?是否可以在状态模式中使用JPA注释来实现这一点

我有一个状态-
TokenState
,它包含一些任意数据以及类为
TokenChild
的对象的
集合。此列表的目的是促进H2中记录之间的一对多关系。该州的关联模式具有相应的JPA注释(@OneToMany和@ManyToOne-请参阅下面的代码片段)。
TokenState
类在
supportedSchemas
generateMappedObject
方法中引用适当的schema-
TokenSchemaV1

部署和运行节点后,当我从控制台运行
TokenIssueFlow
(也包括在代码段中)时,事务成功,但没有
token\u child\u states
表被持久化到h2

其他注释

  • 我还尝试实施了一种不同的策略,其中两个令牌
    子项是唯一的状态(而不是单一的
    国家)。有关更多详细信息,请参阅

  • 另一种解决方案可能是将令牌和令牌子项作为 分离状态并手动将h2中的外键持久化到 促进这种关系,但这似乎不仅仅是一项工作 解决办法

  • 对于一种更深层的嵌套关系,会产生什么样的后果 课间休息?(例如,一个虚构的儿童怀孕的例子) (例如孙子孙女等)。如何使用
    generateMappedObject()
    supportedSchemas()
    来创建我需要的数据模型

令牌状态
公共类TokenState实现LinearState、QueryableState{
私人最终所有者;
私人最终方发行人;
私人最终整数金额;
专用最终唯一标识符;
持久子令牌的私有列表;
公共令牌状态(参与方发行人、参与方所有者、整数金额、唯一标识符linearId、持久子令牌列表){
this.owner=所有者;
this.issuer=发行人;
这个。金额=金额;
this.linearId=linearId;
this.listOfPersistentChildTokens=listOfPersistentChildTokens;
}
公共方getOwner(){
归还所有人;
}
公众党{
退货发行人;
}
公共整数getAmount(){
退货金额;
}
@凌驾
公共唯一标识符getLinearId(){
回归线性化;
}
公共列表getListOfPersistentChildTokens(){
返回持久子令牌列表;
}
@凌驾
公共PersistentState generateMappedObject(MappedSchema){
if(TokenSchemaV1的模式实例){
返回新的TokenSchemaV1.PersistentToken(
此.getOwner().getName().toString(),
此.getIssuer().getName().toString(),
这是.getAmount(),
this.linearId.getId(),
this.getListOfPersistentChildTokens()
);
}否则{
抛出新的IllegalArgumentException(“未识别的模式$schema”);
}
}
@凌驾
公共Iterable supportedSchemas(){
返回ImmutableList.of(新的TokenSchemaV1());
}
@NotNull
@凌驾
公开名单{
返回(发行人、所有者)的不可变列表;
}

}
我怀疑您可能需要在@OneToMany关系(在父类中)上添加显式@Cascade(CascadeType.PERSIST)注释

请查看以下工作代码段:

class SchemaFamily

object TestSchema : MappedSchema(SchemaFamily::class.java, 1, setOf(Parent::class.java, Child::class.java)) {
    @Entity
    @Table(name = "Parents")
    class Parent : PersistentState() {
        @OneToMany(fetch = FetchType.LAZY)
        @JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index"))
        @OrderColumn
        @Cascade(CascadeType.PERSIST)
        var children: MutableSet<Child> = mutableSetOf()
    }

    @Suppress("unused")
    @Entity
    @Table(name = "Children")
    class Child {
        @Id
        @GeneratedValue
        @Column(name = "child_id", unique = true, nullable = false)
        var childId: Int? = null

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index"))
        var parent: Parent? = null
    }
}
类SchemaFamily
对象TestSchema:MappedSchema(SchemaFamily::class.java,1,setOf(Parent::class.java,Child::class.java)){
@实体
@表(name=“Parents”)
类父级:PersistentState(){
@OneToMany(fetch=FetchType.LAZY)
@JoinColumns(JoinColumn(name=“transaction\u id”,referencedColumnName=“transaction\u id”),JoinColumn(name=“output\u index”,referencedColumnName=“output\u index”))
@订单列
@级联(CascadeType.PERSIST)
变量子项:MutableSet=mutableSetOf()
}
@抑制(“未使用”)
@实体
@表(name=“Children”)
班童{
@身份证
@生成值
@列(name=“child\u id”,unique=true,nullable=false)
变量childId:Int?=null
@manytone(fetch=FetchType.LAZY)
@JoinColumns(JoinColumn(name=“transaction\u id”,referencedColumnName=“transaction\u id”),JoinColumn(name=“output\u index”,referencedColumnName=“output\u index”))
变量父项:父项?=null
}
}

请将您的代码调整到上面的位置,然后返回报告。

@Jose Coll-谢谢,确实如此。下面是关于我的实现的更多信息


有关更新架构类的工作实现,请参见下面的代码段@OneToMany(cascade=CascadeType.PERSIST)导致在初始化节点时将子表持久化到DB。我还必须包含一个带有适当字段的@JoinColumn标记

@cordaseriable
公共类TokenSchemaV1扩展了MappedSchema{
公共令牌schemav1(){
super(TokenSchema.class,1,ImmutableList.of(PersistentToken.class,PersistentChildToken.class));
}
@实体
@表(name=“token_states”)
公共静态类PersistentToken扩展PersistentState{
@列(name=“owner”)私有最终字符串所有者;
@列(name=“issuer”)私有最终字符串颁发者;
@列(名称=”