Правильное внедрение однонаправленных отношений "один ко многим" в 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 и требует меньше столбцов базы данных. Смотрите документы для получения инструкций о том, как наносить на карту сумки, наборы, карты, списки и т. Д.