具有复合元素所属集合的休眠双向关系

时间:2018-12-04 14:36:23

标签: java hibernate hibernate-mapping

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

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的类之间的关系,而在这里所拥有的类没有一个。

1 个答案:

答案 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> 注释可以类似地使用:

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

  

特定于Hibernate的@Parent批注允许您引用   嵌入式实体中的所有者实体。

@Parent