我正在尝试学习如何使用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问题中看到的。那么实现这个的正确方法是什么?
答案 0 :(得分:1)
您引用的两个示例是多对一和多对多映射,这两种映射都不适用于您的模型。您需要一对多的映射。
鉴于您的Student
和StudentGrade
类,您需要Student
的映射描述符中的类似内容:
<list name="grades">
<list-index column="idx"/>
</list>
您还需要StudentGrade
。
确定它是您想要的列表吗?列表需要数据库中的显式列表位置列,我猜你真的不需要它。 Set或Bag在Hibernate中更容易映射,并且需要更少的数据库列。有关如何映射行李,集,地图,列表等的信息,请参阅the docs for instructions。