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