我想在两个实体之间创建一个非常经典的双向父子关系。代码:
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/>
元素,虽然它在HistoryField
0指定的组件集合的上下文中没有明确提到这一点,但我猜它应该可以工作。
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;
}