Правильное внедрение однонаправленных отношений "один ко многим" в Hibernate

Я пытаюсь узнать, как использовать Hibernate для реализации Java Object Persistence. В частности, я пытаюсь выяснить, как реализовать однонаправленное отображение один ко многим. Я прочитал документацию по гибернации и многочисленные вопросы Stackru по этой теме, и они не совсем понятны, поэтому я хотел бы знать, как правильно реализовать это.

Вот (чрезвычайно упрощенный) пример вида объектов Java, которые я пытаюсь отобразить:

public class Student {
    private List<StudentGrade> grades;

}

public class StudentGrade {
    private char letterGrade;
    private double percentageGrade;
}

Итак, вопрос в том, как мне написать файлы hbm.xml, чтобы отобразить это?

Документация спящего режима предполагает, что этого, помещенного в файл сопоставления для Student, должно быть достаточно в этом случае. Предполагая, конечно, я полностью разработал файлы сопоставления для Student и StudentGrade.

<many-to-one name="StudentGrade" column="grade_id" />

Однако он показывает только файл сопоставления, а не объект Java, сопровождающий его. В файле сопоставления этот элемент многие-к-одному указан вместе с другими свойствами. Он не содержится в списке или элементе set. В другом месте, где он показывает Java-объект, который использует Collection (Set, реализованный как HashTable в примере), он имеет файл отображения, который выглядит следующим образом:

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам