2010-02-12 83 views
1

我在学习如何使用Hibernate来实现Java对象持久性。具体来说,我试图找出如何实现单向一对多映射。我已经阅读了关于这个主题的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对象。在映射文件中,该多对一元素与其他属性一起列出。它不包含在列表或设置元素中。在其他地方它确实表明,使用集合(如示例哈希表实现的集)的Java对象有一个映射文件看起来像这样:

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

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

回答

1

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

鉴于你StudentStudentGrade类,你想在你的映射描述是这样的Student

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

您还需要为StudentGrade类的映射。

确定它是一个你想要的列表?列表需要在数据库中有一个明确的列表位置列,我猜你并不需要这样做。套件或包在Hibernate中更容易映射,并且需要更少的数据库列。请参阅the docs for instructions关于如何映射行李,套件,地图,列表等。

+0

是的,我并不需要明确的列表索引列。假设一套会更好。我已经多次阅读该文档。它并不是很清楚,因为它通常只显示映射文件 - 没有显示相应的java对象。很难弄清楚什么映射文件应该转到java模式。那么,正确映射的集合看起来像这里? ?是否有任何需要进入StudentGrades映射文件(除了它的属性)? – 2010-02-12 15:57:35

+0

就是这样。正如你所说,'StudentGrades'映射需要一无所知,只是属性。 – skaffman 2010-02-12 16:02:49