【问题标题】:Properly Implementing a One to Many Unidirectional Relationship in Hibernate在 Hibernate 中正确实现一对多单向关系
【发布时间】:2010-02-12 14:22:44
【问题描述】:

我正在尝试学习如何使用 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 对象。在映射文件中,该多对一元素与其他属性一起列出。它不包含在列表或集合元素中。在其他地方,它确实显示了一个使用 Collection 的 Java 对象(在示例中实现为 HashTable 的 Set),它有一个如下所示的映射文件:

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

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

【问题讨论】:

    标签: java hibernate orm object-persistence


    【解决方案1】:

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

    鉴于您的 StudentStudentGrade 类,您希望在 Student 的映射描述符中包含类似的内容:

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

    您还需要StudentGrade 的类映射。

    确定这是您想要的列表吗?列表需要数据库中有一个明确的列表位置列,我猜你并不需要它。 Set 或 Bag 在 Hibernate 中更容易映射,并且需要更少的数据库列。请参阅the docs for instructions,了解如何映射包、集合、地图、列表等。

    【讨论】:

    • 是的,我真的不需要显式列表索引列。假设一个集合会更好。我已多次阅读该文档。这不是很清楚,因为它通常只显示映射文件 - 没有显示相应的 java 对象。很难弄清楚哪个映射文件应该转到哪个 java 模式。那么,正确映射的集合在这里会是什么样子? ?有什么需要进入 StudentGrades 映射文件的(除了它的属性)?
    • 差不多就是这样,是的。正如你所说,StudentGrades 映射需要对它一无所知,只需要属性。
    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多