Связь ManyToOne запутался совсем
Я только пробую работать с БД, поэтому сильно не ругайтесь.
У меня есть БД, в одной таблице описаны студенты, во второй их группы, причем студент может находиться ни в одной из групп, а может быть сразу в нескольких :
group {
id,
name
}
student {
id,
name,
group_id
}
Создал две сущности :
GroupEntity {
private Long id;
private String name;
@OneToMany(mappedBy = "groupEntity")
private List<StudentEntity> studentList = new ArrayList<>();
}
StudentEntity {
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
private GroupEntity groupEntity;
}
И тут я понял, что что-то не так. По моей структуре БД студент может быть только в одной группе, а сущности вроде как я создал правильно. Как мне исправить структуру БД?
И правильно ли я описал связи таблиц в сущностях?
Вот тут есть пример: Примеры записи аннотаций @OneToMany @OneToOne @ManyToMany Одни в один мой пример : у поста может быть много комментариев (@OneToMany). Как они это реализовали с помощью двух таблиц в БД? И обошлись без ManyToMany.
Ответы (1 шт):
У вас в данном случае ManyToMany. Необходимо аннотировать классы следующим образом:
GroupEntity {
@ManyToMany(mappedBy = "groupEntities")
private Set<StudentEntity> students;
}
StudentEntity {
@ManyToMany
@JoinTable(
name = "student_entities_groups",
joinColumns = @JoinColumn(name = "student_entity_id"),
inverseJoinColumn = @JoinColumn(name = "group_id")
)
private Set<GroupEntity> groupEntities;
}
Вам потребуется три таблицы для такой связи. Одна для студентов, вторая для групп, а третья будет соединять их. Этой таблицей в данном случае является student_entities_groups. Эта таблица будет содержать две колонки: id студента и id группы (обратите внимание, что у записей в таблице связей не будет собственных id, только FK на связываемые сущности).
При работе с сущностями, участвующими в отношениях ManyToMany, могут возникать некоторые интересные моменты. Подробнее об этом в моём ответе к другому вопросу. Если в двух словах, то несмотря на то, что в ManyToMany формально обе сущности имеют одинаковые права в отношении друг-друга, фактически владельцем связи является та сущность, в которой находится аннотация @JoinTable.