Hibernate与拥有的复合元素集合的双向关系



我想在两个实体之间创建一个非常经典的双向父子关系。代码:

public class History {
public Long id;
public List<HistoryField> fields;
}
public class HistoryField {
public History history;
public String foo, bar;
}

CCD_ 1由其CCD_。

为了对此进行建模,我使用了以下休眠映射:

<class name="History" table="history">
<id name="id" type="long" />
<list name="fields" cascade="all" table="fields">
<key column="history_id" />
<list-index column="order_index" />
<composite-element class="HistoryField">
<property name="foo" />
<property name="bar" />
</composite-element>
</list>
</class>

但是如何在映射HistoryField::history到拥有实体History之间的链接时指定

这里的诀窍是,集合被拥有,并被定义为一个复合元素(HistoryField没有ID,主键是对history_id+order_index(。双向父子关系的经典示例在此不适用;因为它们解释了两个具有ID的类之间的关系,而这里所拥有的类没有ID。

文档指出,您可以为<component/>定义<parent/>元素,虽然它在HistoryField0指定的组件集合的上下文中没有明确提到这一点,但我猜它应该可以工作。

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/components.html

<component>元素允许<parent>子元素映射属性作为对包含实体

因此:

<class name="History" table="history">
<id name="id" type="long" />
<list name="fields" cascade="all" table="fields">
<key column="history_id" />
<list-index column="order_index" />
<composite-element class="HistoryField">
<!-- name of the property refeencing the containing entity -->
<parent name="history"/>
<property name="foo" />
<property name="bar" />
</composite-element>
</list>
</class>

当使用注释时,@Parent注释可以类似地使用:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#mapping-父

Hibernate特定的@Parent注释允许您引用可嵌入的所有者实体。

@Embeddable
public class HistoryField {
@Parent
public History history;
public String foo, bar;
}

相关内容

  • 没有找到相关文章

最新更新