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

Java Hibernate与复合元素的自有集合的双向关系,java,hibernate,hibernate-mapping,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与所属实体history之

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

public class History {
    public Long id;
    public List<HistoryField> fields;
}

public class HistoryField {
    public History history;
    public String foo, bar;
}
但是如何在映射中指定
HistoryField::history
与所属实体
history
之间的链接


这里的诀窍是集合是拥有的,并定义为复合元素(没有
HistoryField
的ID,主键是对
history\u ID
+
order\u index
)。这里不适用双向亲子关系的经典例子;当他们解释两个类与ID之间的关系时,然而在这里,拥有的类没有一个。

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

元素允许映射 属性作为对包含 实体

因此:

<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>

@尼古拉斯不太喜欢。这里的诀窍是,它是一个无ID的
历史字段
,属于
历史
(在数据库中,主键是成对的
历史(ID
+
顺序)索引
)。因此,我需要一个
复合元素
。我尝试使用复合ID,但在这种情况下,如何将
order\u index
定义为由hibernate管理的自有列表的索引元素?我假定order\u索引与主键分开。它不需要是AFAIK主键的一部分。显示您尝试了什么,并询问您遇到的任何问题。在我的数据库模型中,
history字段
的主键需要
history\u id
+
order\u index
,这是一种多对一关系。我不想改变我的数据库模型来解决hibernate映射问题,我明白了。好问题。我还没有弄明白如何在注释中实现它。我将删除我的复制标志。
<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>
@Embeddable
public class HistoryField {

    @Parent
    public History history;
    public String foo, bar;
}