在Hibernate中正确实现一对多的单向关系

时间:2010-02-12 14:22:44

标签: java hibernate orm object-persistence

我正在尝试学习如何使用Hibernate来实现Java Object Persistence。具体来说,我试图弄清楚如何实现单向一对多映射。我已经阅读了hibernate文档和关于这个主题的大量Stackoverflow问题,但它们并不完全清楚,所以我想知道实现它的正确方法是什么。

这是我试图映射的Java对象的一个​​(极简化的)示例:

public class Student {
    private List<StudentGrade> grades;

}

public class StudentGrade {
    private char letterGrade;
    private double percentageGrade;
}

所以问题是,如何编写hbm.xml文件来映射它?

hibernate文档表明,在这种情况下,放在Student的映射文件中的这个应该足够了。当然,我已经完全充实了Student和StudentGrade的映射文件。

<many-to-one name="StudentGrade" column="grade_id" />

但是,它只显示映射文件,而不显示随附的Java对象。在映射文件中,列出了多对一元素以及其他属性。它不包含在列表或集合元素中。在其他地方,它确实显示了一个使用Collection的Java对象(在示例中实现为HashTable的Set),它有一个如下所示的映射文件:

<set name="events" table="PERSON_EVENT">
    <key column="PERSON_ID"/>
    <many-to-many column="EVENT_ID" class="Event"/>
</set>

这也是我在许多StackOverflow问题中看到的。那么实现这个的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您引用的两个示例是多对一和多对多映射,这两种映射都不适用于您的模型。您需要一对多的映射。

鉴于您的StudentStudentGrade类,您需要Student的映射描述符中的类似内容:

<list name="grades">
   <list-index column="idx"/>
</list>

您还需要StudentGrade

的类映射

确定它是您想要的列表吗?列表需要数据库中的显式列表位置列,我猜你真的不需要它。 Set或Bag在Hibernate中更容易映射,并且需要更少的数据库列。有关如何映射行李,集,地图,列表等的信息,请参阅the docs for instructions