Правильное внедрение однонаправленных отношений «один ко многим» в Hibernate - PullRequest
1 голос
/ 12 февраля 2010

Я пытаюсь узнать, как использовать Hibernate для реализации Java Object Persistence. В частности, я пытаюсь выяснить, как реализовать однонаправленное отображение один ко многим. Я прочитал документацию по гибернации и многочисленные вопросы 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, сопровождающий его. В файле отображения этот элемент многие-к-одному указан вместе с другими свойствами. Он не содержится в списке или элементе set. В другом месте, где он показывает Java-объект, который использует Collection (набор, реализованный как HashTable в примере), он имеет файл отображения, который выглядит следующим образом:

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

Это также то, что я видел во многих вопросах StackOverflow. Итак, как правильно реализовать это?

1 Ответ

1 голос
/ 12 февраля 2010

Два приведенных вами примера - это сопоставления «многие к одному» и «многие ко многим», ни один из которых не применим к вашей модели. Вам нужно отображение один ко многим.

Учитывая ваши Student и StudentGrade классы, вы хотите что-то подобное в вашем дескрипторе отображения для Student:

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

Вам также понадобится отображение классов для StudentGrade.

Вы уверены, что это список, который вы хотите? Списки нуждаются в явном столбце позиции списка в базе данных, и я предполагаю, что вам это не нужно. Набор или сумка проще отображать в Hibernate и требует меньше столбцов базы данных. См. документы для получения инструкций о том, как наносить на карту сумки, наборы, карты, списки и т. Д.

...