2010-02-12 109 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