我想在两个实体之间创建一个非常经典的双向父子关系。代码:
public class History {
public Long id;
public List<HistoryField> fields;
}
public class HistoryField {
public History history;
public String foo, bar;
}
HistoryField
由其History
父级拥有。
为此建模,我使用以下休眠映射:
<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的类之间的关系,而在这里所拥有的类没有一个。
答案 0 :(得分:1)
文档指出,您可以为rownum
定义一个<parent/>
元素,尽管在<component/>
指定的组件集合的上下文中没有明确提及此元素,但我会猜想它应该起作用。
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/components.html
<composite-element/>
元素允许一个<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>
注释可以类似地使用:
特定于Hibernate的
@Parent
批注允许您引用 嵌入式实体中的所有者实体。
@Parent